在 WPF 窗口中嵌入 win32 窗口,不带 HwndHost

本文关键字:窗口 不带 win32 HwndHost WPF | 更新日期: 2023-09-27 17:56:19

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

在 WPF 窗口中嵌入 win32 窗口,不带 HwndHost

不是直接的。 空域问题适用于此处,这会阻止您像使用其他内容一样直接使用 HWND (Win32) 窗口。

有多种解决方法,例如此空域覆盖控件。 这些功能的工作原理是创建一个单独的不带镶边的 WPF Window,并将其"覆盖"在 HWND 之上,并根据需要移动它。

在我看来这是

做不到的。

您可以尝试使用wformuser控件并将其放在windowsformhost控件中来执行此操作,但即使在这种情况下,windowsformhost也始终位于顶部,并且您不能在其上放置其他控件。其原因被称为空域问题。

No. 充其量,你可以隐藏本机窗口,并转发它与 WPF 控件(ala 远程桌面)之间的图形和用户交互。 但这实际上不会在 WPF 窗口上承载本机窗口(如果本机窗口与其父窗互,则会损坏)。

这是因为所有 WPF 内容都位于单个 Win32 窗口中,位于 Win32 z 顺序的单个插槽中,因此其他 WPF 内容不能同时位于此其他子控件的下方和上方。

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

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

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 UI 是否会"知道"此(低级别)窗口?
答:不,当然不是:)

问:"没有hWndHost"是什么意思?
如果您的意思是不想使用上述代码...你可能是索尔。 至少使用 WPF...

"希望对您有所帮助...至少一点点...