0

Windows 8 で WPF を開発し、pinvoke user32.dll を使用して win32 ウィンドウを 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);
}

WindowFormHostを使用してwin32ウィンドウをWPFにホストするためにuser32.dllを使用する別の方法はありますか?

4

1 に答える 1

1

windowsFormsHost にホストされていない理由がわかりました。_process.MainWindowHandle が 0 であるためです。そのため、Process が終了するまで待つ必要があり、それを WindowFormHost に挿入できます。_process.WaitForInputIdle(); プロセスの終了を待つのは効率的ではありません。したがって、_process.MainWindowHandle が 0 の間はスレッドをスリープ状態にする必要があります。

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

この答えのように: c# MainWindowHandle 常にゼロ

于 2013-09-13T11:55:28.900 に答える