繁体   English   中英

将Win32托管到WPF在Windows 7中不起作用

[英]hosting win32 into wpf not working in windows 7

我在Windows 8中开发了WPF,并成功使用pinvoke user32.dll将win32 Windows托管到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?

我找到了为什么不将其托管到WindowsFormsHost的方法。 这是因为_process.MainWindowHandle为0。因此,我们需要等到Process完成后才能将其插入WindowFormHost。 _process.WaitForInputIdle(); 等待过程完成效率不高。 因此,我需要在_process.MainWindowHandle为0时使线程休眠。

while (process.MainWindowHandle == IntPtr.Zero)
{
   Thread.Sleep(100);
   process.Refresh();
}

就像这样的答案: c#MainWindowHandle始终为零

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM