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

0

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

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

于 2017-07-27T01:11:50.207 回答