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 ウィンドウ内に表示されません。何かご意見は?