- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章钩子函数和窗口子类化
第4章钩子函数和窗口子类化
子是操作系统消息处理的一种机制。通过钩子,应用程序可以安装一个钩子回
调过程让系统调用,从而监视系统中的消息队列,在这些消息到达目标窗口之前对这
些消息进行处理。
本章主要介绍钩子函数的基本概念以及几种常用钩子的应用举例。
4.1钩子函数
早在Windows3.x的时候,就有了钩子函数,它经历了Windows9x/NT/2000/XP/2003
各个操作系统,始终保持了最大的兼容性。可以说大部分的钩子函数适用于现在所有
的Win32操作系统,钩子函数在系统编程方面有着广泛的应用前景。
首先应该承认钩子会降低系统的性能,因为它增加系统处理每一个消息的开销,
所以用户除非必要才安装钩子,而且还要尽可能早地去除钩子。
操作系统支持多种类型的钩子,每种类型都提供了它特有的消息处理机制,比如
应用程序使用WH_MOUSE钩子只能监视鼠标的消息队列。
对于每种类型的钩子,系统都维护一个各自独立的钩子链,钩子链是一个指向用
户提供的回调函数钩子过程的链表指针。当与特定类型的钩子相关的窗口消息发生
时,系统会把消息依次传递给钩子链中的每一个回调过程,传递的过程由用户定义的
回调过程实现。一般情况下,用户提供的钩子回调过程必须调用钩子链中的下一个回
调过程。否则钩子处理可能会中断,出现不可预测的结果。钩子过程可以监视窗口消
息,也可以修改甚至停止钩子消息的继续传递,不让它到达钩子链中的下一个目标
过程。
钩子过程需要用户调用SetWindowsHookEx函数进行安装。钩子过程一般遵循下
面的调用规范。
LRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlParam);
其中HookProc是应用程序提供的函数名。
nCode参数是一个钩子标识码,钩子过程会利用它决定下一步进行的操作。这个
标识码的值与安装的钩子类型有关。每种类型都有它的自身定义。
后面两个参数的定义依赖于nCode参数,一般用于存放与窗口消息相关的内容。
SetWindowsHookEx函数会自动安装一个钩子过程,这个过程位于钩子链表的头
部,最后安装的钩子函数总是最先得到响应。前面的钩子处理过程可以决定是否调用
钩子链中的下一个过程,这可以通过调用CallNextHookEx函数实现。
安装钩子函数要用到SetWindowsHookEx函数。对于全局钩子而言,钩子过程必
须在一个动态链接库模块中实现,这个过程必须作为动态链接库的输出函数,以便能
够在安装钩子程序中通过调用LoadLibrary/GetProcAddress函数获得回调过程的地址,
然后把回调函数的地址传递给SetWindowsHookEx函数。
HOOKPROChkprcSysMsg;
staticHINSTANCEhinstDLL;
staticHHOOKhhookSysMsg;
hinstDLL=LoadLibrary((LPCTSTR)c:\\windows\\sysmsg.dll);
hkprcSysMsg=(HOOKPROC)GetProcAddress(hinstDLL,SysMessageProc);
hhookSysMsg=SetWindowsHookEx(WH_SYSMSGFILTER,hkprcSysMsg,hinstDLL,0);
同样释放全局钩子函数要用到UnhookWindowsHookEx,这个钩子函数本身不会
释放包含钩子过程的动态链接库。这是因为全局钩子会被同一桌面的所有应用程序调
用,系统会自动调用LoadLibrary函数,把实现钩子过程的动态链接库映射到受它影
响的当前进程的地址空间中去。同样,最后系统会自动在所有使用该动态链接库的应
用程序不再使用这个钩子时,调用FreeLibrary函数释放动态链接库。
编写全局钩子,最好不要使用MFC,也尽可能地不要使用C运行库函数,应该
尽可能地使用API函数代替使用这些函数,比如常用lstrcpy代理strcpy、_tcscpy等。
这是因为全局钩子会被映射到受它影响的所有进程的地址空间,一个不依赖这些运行
库的运行的程序可能会产生更多的潜在冲突。比如一个采用VisualBasic或者Java编
写的应用程序,它们不会使用MFC类库。
另外全局钩子中的全局变量,当映射到某个进程中时,它将变成属于该进程所有
的私有变量,不能被其他进程共享,因为它们映射的地址是不同的。为了实现变量共
享,可以使用前面谈到的共享节的办法。
#pragmadata_seg(.Share)
HANDLEhWnd=NULL;
#pragmadta_seg()
#pragmacomment(linker,/section:.Share,rws)
当然还可以借助于其他方式进行通
您可能关注的文档
最近下载
- 标准图集-陕09J01-建筑用料及做法.pdf VIP
- 2025年江苏省事业单位综合知识与能力素质(经济统计类)模拟试卷.docx VIP
- 2025年度民主生活会五个带头个人对照检查(含典型案例剖析).docx VIP
- HY_T 0366-2023 海洋数据分类分级标准.docx VIP
- 泵站施工管理工作报告.doc VIP
- ai办公软件培训课件.ppt VIP
- 浙江省杭州市萧山区2024-2025学年八年级上学期期末考试英语试卷(含答案,无听力音频及原文).docx VIP
- 《卵巢囊肿医学》课件.ppt VIP
- 城市建筑群基于弹塑性时程分析的震害评估标准.docx VIP
- 【教学创新大赛】《运动解剖学》教学创新成果报告.pdf VIP
原创力文档


文档评论(0)