• 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
  • 相关阅读:
    Effective Java 第三版——39. 注解优于命名模式
    代码优化的一点总结
    Memcached 服务器端命令
    我是个老爸--当局者迷,旁观者清
    对于大数据大流量情况下微软架构的水平扩展的遐想(瞎想)
    微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章
    微信快速开发框架(四)-- 体验微信公众平台快速开发框架
    微信快速开发框架(三)-- 建立微信公众平台测试账号
    微信快速开发框架(二) -- 快速开发微信公众平台框架---简介
    微信快速开发框架(一)-- 对微信公众平台开发的消息处理
  • 原文地址:https://www.cnblogs.com/findumars/p/6143432.html
Copyright © 2020-2023  润新知