SetWinEventHook 事件鉤子(有些windows事件並沒有訊息對應,譬如快顯功能表,切換視窗,獲得焦點,捲軸滾動等)good

來源:互聯網
上載者:User

標籤:llb   介面   wine   upstart   asp   停止   訪問   key   read   

 相信訊息鉤子大家聽的比較多,訊息鉤子能夠在應用程式處理系統訊息之前將其截獲,提前處理並可以決定是否繼續將訊息往下傳送,有些windows事件並沒有訊息對應,譬如快顯功能表,切換視窗,獲得焦點,捲軸滾動等等,要截獲這些事件可以使用SetWinEventHook,它的原型如下:

HWINEVENTHOOK WINAPI SetWinEventHook(
  __in  UINT eventMin,
  __in  UINT eventMax,
  __in  HMODULE hmodWinEventProc,
  __in  WINEVENTPROC lpfnWinEventProc,
  __in  DWORD idProcess,
  __in  DWORD idThread,
  __in  UINT dwflags
);

    詳細說明見MSDN:http://msdn.microsoft.com/en-us/library/dd373640(VS.85).aspx,其中第四個參數類似訊息鉤子一樣是一個回呼函數,說明見:http://msdn.microsoft.com/en-us/library/dd373885(VS.85).aspx。

    SetWinEventHook的第1,2個參數可以標識一個範圍,表示截獲哪個範圍類的事件,因為實際上在win32裡面這些事件的ID都是直接用defined直接從小到大定義的,有兩個宏分別表示最小的事件ID和最大的事件ID(EVENT_MIN和EVENT_MAX),如果你分別傳這兩個參數給eventMin和eventMax則可以截獲所有的事件,具體可以截獲的事件可以去MSDN查詢:http://msdn.microsoft.com/en-us/library/dd318066(VS.85).aspx。

    要停止HOOK,請調用UnhookWinEvent,原型為:

BOOL WINAPI UnhookWinEvent(
  __in  HWINEVENTHOOK hWinEventHook
);

    觀察回呼函數的參數,可以使用API AccessibleObjectFromEvent來使用微軟的MS Active Accessibility 介面技術,獲得IAccessible 介面,可以使用一些比較有趣的功能,通過程式來訪問UI元素等等,不過我也是剛剛瞭解到這個Accessibility 介面技術,有空再看看具體情況。^_^

    事件鉤子也有進程內和進程外事件鉤子,相比訊息鉤子不同的是你收到一個事件發生的訊息後,並不能控制攔截該事件不再傳遞事件。

    代碼說明:

 

[cpp] view plain copy 
  1. ……  
  2.   
  3. void CSetWinEventHookDlg::OnOK()   
  4. {  
  5.     if (NULL == m_hHook)  
  6.     {  
  7.         m_hHook = ::SetWinEventHook(  
  8.             EVENT_MIN,   
  9.             EVENT_MAX,   
  10.             NULL,   
  11.             WinEventsProc, 0, 0,   
  12.             WINEVENT_OUTOFCONTEXT);  
  13.     }  
  14.       
  15. }  
  16.   
  17. void CSetWinEventHookDlg::OnCancel()   
  18. {  
  19.     if (m_hHook)  
  20.     {  
  21.         ::UnhookWinEvent(m_hHook);  
  22.         m_hHook = NULL;  
  23.     }  
  24. }  
  25.   
  26. ……  
  27.   
  28. VOID CALLBACK WinEventsProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime )  
  29. {  
  30.     switch(dwEvent)  
  31.     {  
  32.     case EVENT_SYSTEM_SWITCHSTART:  
  33.         CSetWinEventHookDlg::ChangUI(_T("Alt+Tab Start"));   
  34.         break;  
  35.   
  36.     case EVENT_SYSTEM_SWITCHEND:  
  37.         CSetWinEventHookDlg::ChangUI(_T("Alt+Tab End"));   
  38.         break;  
  39.   
  40.     case EVENT_SYSTEM_MENUPOPUPSTART:  
  41.         CSetWinEventHookDlg::ChangUI(_T("PopMenu Start"));   
  42.         break;  
  43.   
  44.     case EVENT_SYSTEM_MENUPOPUPEND:  
  45.         CSetWinEventHookDlg::ChangUI(_T("PopMenu End"));   
  46.         break;  
  47.     }  
  48. }  

 

http://blog.csdn.net/magictong/article/details/4753122

SetWinEventHook 事件鉤子(有些windows事件並沒有訊息對應,譬如快顯功能表,切換視窗,獲得焦點,捲軸滾動等)good

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.