在我的WPF应用程序中,我使用HwndHost托管Win32内容。但是,创建HwndHost不会创建本机窗口。相反,这是在覆盖的BuildWindowCore()
方法中完成的,WPF将在稍后调用该方法。强制初始化HwndHost
我的托管内容需要本机窗口的窗口句柄进行自己的初始化。不幸的是,我不能强制创建窗口(即让WPF调用BuildWindowCore),所以我有第二个线程轮询HwndHost直到它被初始化。
在.NET 4.0/WPF 4.0中,增加了一种新方法WindowInteropHelper.EnsureHandle()
。我希望这可以解决这种情况,但它只适用于Window,而不是HwndHost(它不是Window派生的)。你有什么我可以做的建议吗?
编辑:
忘了添加一些更多的约束的可能的解决方案:
- 的HwndHost被放置在一个控制其中,取决于用户设置,可以是应用程序的主的子窗口或可以放置在新窗口中(通过第三方对接管理器)。这意味着在创建窗口时我不确定父窗口(以及它的hWnd)是什么。
- 尽管本机代码在其初始化过程中需要hWnd,但只有在用户请求显示该窗口时才会显示该窗口(即它最初不可见)。如果可能,应该避免需要显示窗口,只能立即再次隐藏窗口。
有两个问题:1)我不知道父hWnd,因为控件后来由第三方对接管理器定位,并且存储的用户设置确定它是自己显示还是作为“孩子“的主窗口。 2)HwndHost的控制最初可能不会显示(取决于存储的用户设置),但在启动时,旧代码需要hWnd。 – 2011-06-24 08:26:22
您应该可以挂钩到控件上的Loaded事件,并在其中进行所有初始化:http://msdn.microsoft.com/zh-cn/library/system.windows.frameworkelement.loaded.aspx。如果遗留代码需要hwnd,那么你只需要在遗留代码上做任何事情,直到hwnd准备就绪(这是我必须做的)。 – 2011-06-27 14:12:06
来自链接的引用:“当元素布局,呈现并准备好进行交互时发生。”如果我没有显示控件,Loaded将不会触发。 – 2011-06-28 07:09:17