第4章钩子函数和窗口子类化.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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) 当然还可以借助于其他方式进行通

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档