在我的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