1、WPF如何使用HWND異步
當您建立WPF Window時,WPF會建立頂級HWND,並使用HwndSource將Window及其WPF內容放入HWND中。應用程序中其他的WPF內容共享此單個HWND。不過,菜單、組合框下拉列表和其餘彈出窗口例外。 這些元素建立它們本身的頂級窗口,這正是 WPF 菜單能跳出包含它的窗口 HWND 以外的緣由。ide
2、HwndSource類函數
一個HwndSource實現Win32窗口能夠包含WPF內容。在窗口中的WPF內容是可安排的,可測量的,和可渲染的;是可交互式輸入的。由於HwndSource是專被設計來與Win32進行交互的,這個類展現了底層的Win32的特色。您可使用這個類執行如下操做:佈局
HwndSource類被設計來用於處理通常的互操做,並非被設計成一個包裝管理HWND的角色。通常來講,它不提供用於管理窗口或檢查屬性狀態的託管方法。相反,該HwndSource類能夠經過Handle屬性訪問Win32窗口句柄(HWND),能夠經過PInvoke Win32 API技術操做窗口。
1 建立
HwndSource只能在構造時被指定。建立一個HwndSource,首先要建立一個HwndSourceParameters結構並用所需的參數填充它。這些參數包括如下內容:this
2 對象生存週期
HwndSource是正規的公共語言運行庫(CLR)對象,其生命週期是由垃圾收集器管理。由於HwndSource表明非託管資源,因此HwndSource實現IDisposable接口。若是從全部者線程調用,同步調用處理當即破壞win32窗口。若是從另外一個線程調用,win32窗口將異步銷燬。在互操做的代碼中顯式調用Dispose可能對某些互操做場景是必要的。
3 窗口處理函數
HwndSource類實現了它本身的窗口處理函數。此窗口處理函數用於處理重要的窗口消息,如與佈局、呈現和輸入相關的消息。不過,您也能夠在鉤子上添加本身的處理函數。你能夠在構造時,經過設置HwndSourceParameters.HwndSourceHook屬性,在鉤子中指定本身的處理函數,或者你也可使用AddHook和RemoveHook在窗口建立以後添加和刪除鉤子中的處理函數。spa
3、HwndSource類線程
該例子中在鉤子中擴展處理函數。設計
// 在Window類中 protected overried void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); // 獲取窗體句柄 IntPtr hwnd = new WindowInteropHelper(this).Handle; // 獲取HwndSource對象 HwndSource hwndSource = HwndSource.FromHwnd(hwnd); // 向鉤子中添加處理程序 if(hwndSource != null) hwndSource.AddHook(WndProc); } private IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wideParam, IntPtr longParam, ref bool handled) { swicth(msg) { // 對特定消息進行處理 } return IntPtr.Zero; }