SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good相关的知识,希望对你有一定的参考价值。

 相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些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的主要内容,如果未能解决你的问题,请参考以下文章

csharp 利用SetWinEventHook事件钩子避免SetWindowsHookEx权限问题

[原]excel启动时死锁

SetWinEventHook 与 CreateProcess, C++

Vue的钩子事件和程序话事件侦听

什么是钩子函数?钩子函数的使用。

(原创!)彻底理解JS中的事件,事件处理函数,钩子函数,回调函数。