启用桌面合成时,HwndHost不显示内容

时间:2017-07-25 15:30:42

标签: wpf hwndhost

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

1 个答案:

答案 0 :(得分:0)

查看系统addin命名空间,了解如何使用本机HWIND_PTR作为控件。 您不需要使用所有库来完成工作。

https://docs.microsoft.com/en-us/dotnet/framework/wpf/app-development/wpf-add-ins-overview