如何在我们的WPF窗口中将Window作为用户控件从另一个应用程序嵌入?

时间:2011-01-05 19:03:17

标签: wpf winapi

是否可以在我们的WPF窗口中显示另一个第三方应用程序的窗口?优选在容器控制中?

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

1 个答案:

答案 0 :(得分:9)

我前段时间为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函数。需要睡眠作为黑客,因为没有它,调用MoveWindow会有没有效果。

对于WPF,你需要一个窗口/控件的句柄,它将成为你的第三方窗口的一部分,获得这样一个句柄的最简单方法是使用HwndHost容器。

我认为在WPF中实现这一目标并不是更好的方法。另外,请注意我只在winforms中测试过,而不是在WPF中测试过,但它也应该在WPF中测试,只要它具有父级的有效win32 HWND。