Хостинг win32 в wpf не работает в windows 7
Я разработал WPF в Windows 8 и преуспел в размещении Win32 Windows в WPF, используя pinvoke user32.dll. Но когда я строю с использованием 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 для размещения окна win32 в WPF с помощью WindowFormHost?
1 ответ
Я нашел способ, почему это не хостинг для windowsFormsHost. Это потому, что _process.MainWindowHandle равен 0. Поэтому нам нужно дождаться завершения процесса и мы можем вставить его в WindowFormHost. _process.WaitForInputIdle(); не эффективно ждать, процесс завершен. Поэтому мне нужно заставить поток спать, пока _process.MainWindowHandle равен 0.
while (process.MainWindowHandle == IntPtr.Zero)
{
Thread.Sleep(100);
process.Refresh();
}
Так же, как этот ответ: C# MainWindowHandle всегда ноль