将 win32 托管到 wpf 在 Windows 7 中不起作用

Posted

技术标签:

【中文标题】将 win32 托管到 wpf 在 Windows 7 中不起作用【英文标题】:hosting win32 into wpf not working in windows 7 【发布时间】:2013-09-17 21:50:27 【问题描述】:

我在 Windows 8 中开发 WPF,并成功使用 pinvoke user32.dll 将 win32 窗口托管到 WPF。但是当我使用 Windows 7 构建时,非 WPF 应用程序没有托管到 WPF 中的表单面板中。它会打开另一个窗口,就像启动该应用程序一样。

这是我的代码:

private System.Windows.Forms.Panel _panel;
private Process _process;

public MainWindow()

    _panel = new System.Windows.Forms.Panel();
    windowsFormsHost.Child = _panel;


private void WindowLoaded(object sender, RoutedEventArgs e)

    ProcessStartInfo psi = new ProcessStartInfo(@"D:\unitypcbuild\UnityBuild.exe");
    psi.WindowStyle = ProcessWindowStyle.Minimized;
    _process = Process.Start(psi);
    _process.WaitForInputIdle();
    SetParent(_process.MainWindowHandle, _panel.Handle);
    // resize embedded application & refresh
    ResizeEmbeddedApp();
    this.Activate();


private void ResizeEmbeddedApp()

    if (_process == null)
    return;

    SetWindowPos(_process.MainWindowHandle, IntPtr.Zero, 0, 0, (int)_panel.ClientSize.Width,    (int)_panel.ClientSize.Height, SWP_NOZORDER | SWP_NOACTIVATE);
    int style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE);
    style = style & ~((int)WS_CAPTION) & ~((int)WS_THICKFRAME); // Removes Caption bar and the sizing border
    SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style);

是否有一些不同的方法可以使用 user32.dll 通过 WindowFormHost 将 win32 窗口托管到 WPF?

【问题讨论】:

【参考方案1】:

我找到了为什么它不托管到 windowsFormsHost 的方式。这是因为 _process.MainWindowHandle 为 0。所以我们需要等到 Process 完成,我们才能将其插入到 WindowFormHost。 _process.WaitForInputIdle();等待进程完成效率不高。所以我需要在 _process.MainWindowHandle 为 0 时让线程休眠。

while (process.MainWindowHandle == IntPtr.Zero)

   Thread.Sleep(100);
   process.Refresh();

就像这个答案:c# MainWindowHandle always zero

【讨论】:

以上是关于将 win32 托管到 wpf 在 Windows 7 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF OpenFileDialog 与 Win32 父窗口;窗口关闭时没有重新获得焦点

HwndHost for Windows Form - Win32 / WinForm 互操作性

具有托管功能的 Win32 平台的低开销(统计)分析器

wpf 不能引用system.window.Forms

[Win32] 窗体暗色模式, C++, WinForm, WPF 使用方法, 判断颜色模式, 响应颜色变更消息, 设置标题栏暗色.

如何在Visual C ++中创建非托管Windows GUI?