WPF與Win32互操做

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的特色。您可使用這個類執行如下操做:佈局

  • 指定窗口樣式、窗口類樣式和擴展窗口樣式。
  • 在窗口程序的鉤子中添加處理函數。
  • 提供窗口句柄(HWND)。
  • 銷燬窗口。

         HwndSource類被設計來用於處理通常的互操做,並非被設計成一個包裝管理HWND的角色。通常來講,它不提供用於管理窗口或檢查屬性狀態的託管方法。相反,該HwndSource類能夠經過Handle屬性訪問Win32窗口句柄(HWND),能夠經過PInvoke Win32 API技術操做窗口。
1 建立
        HwndSource只能在構造時被指定。建立一個HwndSource,首先要建立一個HwndSourceParameters結構並用所需的參數填充它。這些參數包括如下內容:this

  • 類、窗口和擴展的窗口樣式。您必須在窗口被建立前使用PInvoke去改變樣式。並不是全部樣式均可以在建立窗口後更改。更改窗口樣式以前請參考win32文檔。
  • 窗口的初始位置。
  • 窗口的初始大小,包括是否指定尺寸或以WPF內容大小的肯定窗口的大小。
  • 父窗口。
  • HwndSourceHook包括窗口的處理函數鏈。若是在構建時指定鉤子,它將接收窗口的全部消息。你可使用AddHook後建立窗口添加一個鉤子。
  • 透明度設置。

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; }
相關文章
相關標籤/搜索