在WPF窗口中嵌入win32窗口,没有HwndHost

时间:2013-01-28 21:54:28

标签: c# wpf winapi interop

我需要在WPF窗口中托管win32窗口,但我需要它们像用户控件一样。其他控件需要能够显示在它们之上,并且它们应该能够放入选项卡控件等。这样的事情有可能吗?

4 个答案:

答案 0 :(得分:3)

不直接。 Airspace issues适用于此处,这会阻止您像使用其他内容一样直接使用HWND(Win32)窗口。

有各种解决方法,例如AirspaceOverlay control。这些功能是通过创建一个没有镶边的单独WPF Window,并将其“覆盖”在HWND之上,根据需要移动它。

答案 1 :(得分:1)

在我看来,这是无法做到的。

您可以尝试使用winform usercontrol并将其置于windowsformhost控件中,但即使在这种情况下,windowsformhost也始终位于顶部,并且您无法对其进行其他控制。其原因称为AirSpace问题。

答案 2 :(得分:0)

没有。充其量,您可以隐藏本机窗口,并在它和WPF控件(ala远程桌面)之间转发图形和用户交互。但这实际上不会在您的WPF窗口上托管本机窗口(如果本机窗口与其父窗口交互,它将被破坏)。

这是因为所有WPF内容都在Win32 z-order中的单个插槽中的单个Win32窗口中,因此其他WPF内容不能低于和高于其他子控件。

答案 3 :(得分:0)

当然,可以在WPF API中嵌入Win32窗口。例如:

How to embed Window from another application in our WPF window as user control?

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);
问:你的WPF用户界面是否“了解”这个(低级别)窗口? 答:不 - 当然不是:)

问:“没有hWndHost”是什么意思? 如果你的意思是你不想使用上面的代码...你可能是SOL。至少使用WPF ......

'希望这有助于...至少一点......