相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些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 接口技术,有空再看看具体情况。^_^

事件钩子也有进程内和进程外事件钩子,相比消息钩子不同的是你收到一个事件发生的消息后,并不能控制拦截该事件不再传递事件。

代码说明:

…… void CSetWinEventHookDlg::OnOK() { if (NULL == m_hHook) { m_hHook = ::SetWinEventHook( EVENT_MIN, EVENT_MAX, NULL, WinEventsProc, 0, 0, WINEVENT_OUTOFCONTEXT); } } void CSetWinEventHookDlg::OnCancel() { if (m_hHook) { ::UnhookWinEvent(m_hHook); m_hHook = NULL; } } …… VOID CALLBACK WinEventsProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime ) { switch(dwEvent) { case EVENT_SYSTEM_SWITCHSTART: CSetWinEventHookDlg::ChangUI(_T("Alt+Tab Start")); break; case EVENT_SYSTEM_SWITCHEND: CSetWinEventHookDlg::ChangUI(_T("Alt+Tab End")); break; case EVENT_SYSTEM_MENUPOPUPSTART: CSetWinEventHookDlg::ChangUI(_T("PopMenu Start")); break; case EVENT_SYSTEM_MENUPOPUPEND: CSetWinEventHookDlg::ChangUI(_T("PopMenu End")); break; } }

SetWinEventHook 事件钩子相关推荐

  1. tp3 php钩子函数,thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)...

    thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件) 一.总结 1.通过模型事件(钩子函数),可以在插入更新删除等前后执行一些特定的功能 2.模型事件是写在模型里面的,控制器中 ...

  2. 初探 Vue 生命周期和钩子函数

    生命周期 生命周期函数就是 Vue 实例在某一个时间点会自动执行的函数. 简单来说就是好像把人的出生到死亡分成一个个阶段,你取名字肯定是在你出生阶段,而不是在成年阶段:你结婚肯定是在成年阶段,而不是在 ...

  3. Git之深入解析如何借助Git的配置方法和钩子机制来自定义Git需求

    一.前言 到目前为止,我们已经了解了 Git 基本的运作机制和使用方式,学习了许多 Git 提供的工具简单且有效地使用它,可以高效地帮助我们工作,提升我们的效率. 如果还不清楚 Git 的基础使用流程 ...

  4. Vue生命周期函数(钩子函数)

    生命周期函数相关 什么是周期函数 从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期!生命周期钩子 = 生命周期函数 = 生命周期事件 主要的生命周期函数分类: 创 ...

  5. Vue 生命周期钩子

    Vue 实例中的生命周期钩子 Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务 处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个V ...

  6. 又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析

    本文讲的是又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析, 早在2015年,FireEye曾发布过两次关于Office的Encapsulated PostScript (EPS)图形文 ...

  7. CVE-2016-0167分析

    文章目录 CVE-2016-0167 0x1 前言 0x2 漏洞描述 0x3 影响版本 0x4 评级 0x5 漏洞分析 ■ xxxMNDestroyHandler逆向分析 ■ MNFreePopup逆 ...

  8. 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...

  9. vue 集成富文本tinymce

    开发环境 1. vscode 开发语言 1. vue 2. javaScript 插件安装 1. npm install tinymce -S 2. 可以使用里面的文件, 下载后可以在node_mod ...

最新文章

  1. [Google Guava] 1.3-常见Object方法
  2. 深度学习和浅层学习 Deep Learning and Shallow Learning
  3. PYB Nano 开发板的完整设计文档
  4. 关于修改密码后,远程服务器项目连接不上数据库的处理办法
  5. 如何在GitHub上搜索提交消息?
  6. Atitit.sql where条件表达式的原理  attilax概括
  7. 青鸟影院的最后一部分
  8. 前端利用jQuery设置日期选择框
  9. 面向CRAN的5G前传方案研究
  10. cad高程标注插件lisp_【源码】CAD高程转标高,CAD插件大全,小懒人CAD工具箱
  11. 一个软件开发者的BPM之路
  12. 小i机器人用AI打造金融业认知智能企业
  13. 现在的程序员都是Gay
  14. 利用声网进行屏幕共享及关闭共享网络状态检测
  15. 嵌入式系统使用时,Ubuntu缺少一些服务的解决办法
  16. HCIP第三天(HDLC协议与PPP协议)
  17. 基于JAVA大学生二手物品交易网站演示记录2021计算机毕业设计源码+系统+lw文档+部署
  18. 中亦科技在创业板IPO恢复审核状态,徐晓飞不再担任执业律师
  19. 【电气专业知识问答】问:新安装或检修后的电动机启动前应开展哪些检查及试转工作?
  20. 「 理财与风险控制|养老系列」你想象中的高端养老社区是什么样?

热门文章

  1. 读写csv,xlsx文件的工具类
  2. 2019.4.3个人赛
  3. 开源优测-积微速成计划历次任务及总结
  4. linux遇到nul字符,服务器崩溃,系统日志中出现ascii NUL字符(^ @ ^ @ ^ @ ...)
  5. 计算方法实验:方程求根二分法、不动点迭代法、牛顿法
  6. linux关闭cups服务 关闭631端口 关闭avahi-daemon服务
  7. 【POJ】 1014 Dividing(多重背包,优化)
  8. Qt使用lambda表达式实现无参信号与有参槽的连接
  9. 高并发网络连接数因端口数量受限问题
  10. 机器学习模型可解释性进行到底 —— SHAP值理论(一)