我正在使用 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 窗口中不可见。有什么想法吗?