2013-09-13 2 views
0

Я разработал WPF в Windows 8 и преуспел в том, чтобы размещать окна win32 в WPF с помощью pinvoke user32.dll. Но когда я использую Windows 7, приложение, отличное от WPF, не размещающееся в панели форм в WPF. Он открывает другие окна, например, запускает это приложение.хостинг win32 в wpf не работает в windows 7

это мой код:

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 always zero

 Смежные вопросы

  • Нет связанных вопросов^_^