C# 将win32托管到wpf在windows 7中不起作用
我在Windows 8中开发了WPF,并成功地使用pinvoke user32.dll将win32 Windows托管到WPF。但当我使用Windows7构建时,非WPF应用程序不会托管到WPF中的表单面板中。它会像启动该应用程序一样打开另一个窗口 这是我的代码: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
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();
}
就像这个答案: