【问题标题】:How to embed Window from another application in our WPF window as user control?如何将另一个应用程序的窗口嵌入到我们的 WPF 窗口中作为用户控件?
【发布时间】:2011-06-04 05:37:51
【问题描述】:

是否可以在我们的 WPF 窗口中显示来自另一个 3rd 方应用程序的窗口?最好在容器控件中?

我猜可能有一些 Win32 API 允许我们这样做。

【问题讨论】:

    标签: wpf winapi


    【解决方案1】:

    我前段时间为Winforms做过,但方法不是很聪明,所以只要其他人没有任何想法,这就是我所做的。代码差不多是这样的:

    Process p = Process.Start(@"application.exe");
    
    p.WaitForInputIdle();
    IntPtr appWin = p.MainWindowHandle;
    
    SetParent(appWin, parent);
    SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
    System.Threading.Thread.Sleep(100);
    MoveWindow(appWin, 0, 0, ClientRectangle.Width, ClientRectangle.Height, true);
    

    (其中SetParentSetWindowLongMoveWindow 是通过 p/invoke 调用的 win32 API 函数)作为 hack 需要 sleep,因为没有它对 MoveWindow 的调用将无效。

    对于 WPF,您将需要一个窗口/控件的句柄,该句柄将成为您的 3rd 方窗口的父窗口,获取此类句柄的最简单方法是使用 HwndHost 容器。

    我认为在 WPF 中没有更漂亮的方法来实现这一点。另外,请注意,我只在 winforms 中测试过这个,而不是在 WPF 中,但它也应该在 WPF 中工作,只要它具有父级的有效 win32 HWND。

    【讨论】:

    • 感谢它的工作,但它有点hacky。目标应用程序的行为未定义。一些应用程序在某些方面是如何在操作系统中注册为非 UI 应用程序的,即使它们确实具有 UI,即 Office,并且其中一些应用程序停止正常运行。我暂时不接受你的回答,希望能得到更多的答案。
    • 早上我想知道这对你有什么作用,因为我看到你接受了答案并且没有发表评论。我同意这很hacky。如果有更好的方法,我很好奇自己;不幸的是,当我需要实现它时,我花了很多时间,但没有找到比这更好的东西。当时,这对我的情况是可以接受的,但这绝对不是一段很好的代码,正如我在答案中提到的,我分享了它,因为这里没有答案。
    • 遗憾的是,我猜这是唯一的选择。
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多