我正在使用HwndHost在我的WPF窗口中嵌入外部应用程序。我注意到在某些Windows 7计算机上,如果选择了Aero Theme并启用了桌面合成,则外部应用程序启动,在屏幕上闪烁一瞬间然后消失。如果我关闭桌面合成或使用基本主题,应用程序将成功嵌入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窗口中看不到它。有什么想法吗?
答案 0 :(得分:0)
查看系统addin命名空间,了解如何使用本机HWIND_PTR作为控件。 您不需要使用所有库来完成工作。
https://docs.microsoft.com/en-us/dotnet/framework/wpf/app-development/wpf-add-ins-overview