【发布时间】:2011-06-04 05:37:51
【问题描述】:
是否可以在我们的 WPF 窗口中显示来自另一个 3rd 方应用程序的窗口?最好在容器控件中?
我猜可能有一些 Win32 API 允许我们这样做。
【问题讨论】:
是否可以在我们的 WPF 窗口中显示来自另一个 3rd 方应用程序的窗口?最好在容器控件中?
我猜可能有一些 Win32 API 允许我们这样做。
【问题讨论】:
我前段时间为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);
(其中SetParent、SetWindowLong 和 MoveWindow 是通过 p/invoke 调用的 win32 API 函数)作为 hack 需要 sleep,因为没有它对 MoveWindow 的调用将无效。
对于 WPF,您将需要一个窗口/控件的句柄,该句柄将成为您的 3rd 方窗口的父窗口,获取此类句柄的最简单方法是使用 HwndHost 容器。
我认为在 WPF 中没有更漂亮的方法来实现这一点。另外,请注意,我只在 winforms 中测试过这个,而不是在 WPF 中,但它也应该在 WPF 中工作,只要它具有父级的有效 win32 HWND。
【讨论】: