从 WPF 窗口获取 System.Windows.Forms.IWin32Window

本文关键字:Windows Forms IWin32Window System 获取 WPF 窗口 | 更新日期: 2023-09-27 18:32:01

我正在编写一个 WPF 应用程序,我想利用这个库。

我可以通过以下方式获取窗口的IntPtr

new WindowInteropHelper(this).Handle

但这不会投射到 System.Windows.Forms.IWin32Window ,我需要显示这个 WinForms 对话框。

如何将IntPtr转换为System.Windows.Forms.IWin32Window

从 WPF 窗口获取 System.Windows.Forms.IWin32Window

选项 1

IWin32Window 只需要一个Handle属性,这并不难实现,因为您已经拥有 IntPtr。 创建实现 IWin32Window 的包装类:

public class WindowWrapper : System.Windows.Forms.IWin32Window
{
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }
    public WindowWrapper(Window window)
    {
        _hwnd = new WindowInteropHelper(window).Handle;
    }
    public IntPtr Handle
    {
        get { return _hwnd; }
    }
    private IntPtr _hwnd;
}

然后你会得到你的IWin32Window,就像这样:

IWin32Window win32Window = new WindowWrapper(new WindowInteropHelper(this).Handle);

或(回应KeithS的建议):

IWin32Window win32Window = new WindowWrapper(this);

选项 2(感谢斯科特·张伯伦的评论)

使用现有的 NativeWindow 类,该类实现 IWin32Window:

NativeWindow win32Parent = new NativeWindow();
win32Parent.AssignHandle(new WindowInteropHelper(this).Handle);