JXJSongRuoJun 第 1 页 2010/11/19
本文摘自科学出版社出版、王维玉编著《Visual C++ 6.0 高级编程技术精粹》第十七章 钩子技术。
本文仅作学习交流使用,版权归原作者所有。
钩子技术
Windows 系统采用的是事件驱动的机制,也就是说,整个系统都是通过消
息的传递来实现的。而钩子是 Windows 系统中非常重要的系统接口,它可以截
获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子
可以监控系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
我们可以在系统中安装自定义的钩子,监视系统中特定时间的发生,完成特定的
功能。比如截获键盘、鼠标的输入、屏幕取词、日志监视等等。可见、利用钩子
可以实现许多特殊而有用的功能。因此,对于高级编程人员来说,掌握钩子的编
程方法是很有必要的。本文将详细地介绍钩子的基础知识和钩子的实现。最后介
绍两个应用实例,类似金山词霸屏幕取词功能的鼠标钩子和利用键盘钩子屏蔽任
意键。
钩子的基础知识
钩子的原理
钩子的本质是一段用于处理系统消息的程序,通过系统调用,将其挂入到系
统。钩子的种类有很多,每一种钩子负责截获并处理相应的消息。钩子机制允许
应用程序截获并处理发往指定窗口的消息或特定事件,其监视的窗口既可以是本
进程内的也可以是由其他进程所创建的。当特定的消息发出后,在到达目的窗口
前,钩子程序先行截获此消息并得到控制权。此时在钩子函数中就可以对截获的
消息进行各种修改处理,甚至强行终止该消息的继续传递。
任何一个钩子都由系统来维护一个指针列表(钩子链表),其指针指向钩子
的各个处理函数。最近安装的钩子放在链表的开始,最早安装的钩子则放在最后,
当钩子监视的消息出现时,操作系统调用链表开始处的第一个钩子处理函数进行
处理,也就是说最后加入的钩子优先获得控制权。在这里提到的钩子处理函数必
须是一个回调函数(callback function),而且不能定义为类成员函数,必须定义
为普通的 C 函数。在使用钩子时可以根据监视范围的不同分为全局钩子和线程
钩子两大类,其中线程钩子只能监视某个线程,而全局钩子则可对在当前系统下
运行的所有线程进行监视。显然,线程钩子可以看作是全局钩子的一个子集,全
局钩子虽然功能强大但同时实现起来也比较烦琐:其钩子函数的实现必须封装在
动态链接库中才可以使用。
评论6