Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将win32托管到wpf在windows 7中不起作用_C#_Wpf_Windows_User32_Setparent - Fatal编程技术网

C# 将win32托管到wpf在windows 7中不起作用

C# 将win32托管到wpf在windows 7中不起作用,c#,wpf,windows,user32,setparent,C#,Wpf,Windows,User32,Setparent,我在Windows 8中开发了WPF,并成功地使用pinvoke user32.dll将win32 Windows托管到WPF。但当我使用Windows7构建时,非WPF应用程序不会托管到WPF中的表单面板中。它会像启动该应用程序一样打开另一个窗口 这是我的代码: private System.Windows.Forms.Panel _panel; private Process _process; public MainWindow() { _panel = new System.W

我在Windows 8中开发了WPF,并成功地使用pinvoke user32.dll将win32 Windows托管到WPF。但当我使用Windows7构建时,非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 window托管到WPF?

我找到了它不托管到windowsFormsHost的原因。这是因为_process.MainWindowHandle是0。因此,我们需要等待进程完成,然后才能将其插入WindowFormHost_process.waitForInputId();等待进程完成的效率不高。因此,我需要在_process.MainWindowHandle为0时使线程休眠

while (process.MainWindowHandle == IntPtr.Zero)
{
   Thread.Sleep(100);
   process.Refresh();
}
就像这个答案: