0

HwndHost を使用して、WPF ウィンドウに外部アプリケーションを埋め込みます。一部の Windows 7 マシンで、Aero テーマが選択され、デスクトップ コンポジションが有効になっている場合、外部アプリケーションが起動し、画面上で一瞬ちらつき、その後消えることに気付きました。デスクトップ コンポジションをオフにするか、基本テーマを使用すると、アプリケーションは WPF ウィンドウ内に正常に埋め込まれます。

これは、HwndHost から派生したクラスで使用するコードです。

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("USER32.DLL", SetLastError = true)]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

private const int GWL_STYLE = (-16);
private const int WS_CHILD = 0x40000000;
private const int WS_EX_APPWINDOW = 0x00040000;

[DllImport("user32.dll", SetLastError = true)]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
    while (Process.MainWindowHandle == IntPtr.Zero)
    {
        Process.Refresh();
        System.Threading.Thread.Sleep(10);
    }

    SetLastError(0);
    var ret = SetWindowLong(Process.MainWindowHandle, GWL_STYLE, WS_CHILD);
    int e1 = Marshal.GetLastWin32Error();
    SetParent(Process.MainWindowHandle, hwndParent.Handle);
    int e2 = Marshal.GetLastWin32Error();
    ShowWindow(Process.MainWindowHandle, 0);
    int e3 = Marshal.GetLastWin32Error();
    return new HandleRef(this, Process.MainWindowHandle);
}

問題が発生しても、Windows エラーは発生しません。プロセスは、それをクラスに挿入する別のウィンドウから開始されます。タスク マネージャーで確認しましたが、プロセスは実行されますが、WPF ウィンドウ内に表示されません。何かご意見は?

4

1 に答える 1