呵呵,兴趣和需求,很快就促进了我的行动,查资料,编代码,yeah,成功。
在学习过程中,发现网络上的资料都很零碎,比较完整的资料都是英文的。所以,俺决定整理加翻译再实践,在编写俺的后台钩子的时候,炮制一篇文章出来,一是为了以后查找资料方便,二是,呵呵,发到俺的blog上,是不是应该有点吸引力呢。呵呵。
下面开始了我的钩子接触过程。
第一步。了解什么是钩子。
我们可以首先从字面上了解钩子,钩子是干什么的呢?日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,Windows的钩子Hook也是用来钩东西的,比较抽象的是他是用来钩Windows事件或者消息的。最常见的就是鼠标和键盘钩子,用Hook钩子钩住鼠标、键盘,当你的鼠标、键盘有任何操作时,通过Hook就能知道他们都做了什么了,多么形象啊,把老鼠Mouse钩住了,不管你干什么,都逃不过我钩子Hook的手掌心。
技术上讲,钩子(Hook)是Windows消息处理机制的一个很重要的内容,谁叫Windows是基于消息的呢。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。
我们可以在同一个钩子上挂很多东西。
想起参加工作前要求被体检的时候,当你被登记之后,按照你的登记表上的顺序,就等着到各个科室一个一个的去检查吧。每一个科室都有决定你是否继续的可能,只有通过了这个,你才可以到下一个去,如果没有通过,那么,你是看不到最后的大夫了,可以直接over回家了。
如果把体检比喻为事件的话,当事件发生时,应用程序(体检过程)可以在相应的钩子Hook上设置多个钩子子程序(Hook Procedures)(多个科室的检查),由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)(体检表,确定了你要走的顺序)。当钩子所监视的消息出现时(你拿着表格来体检了),Windows(导诊员)首先将其送到调用链表中所指向的第一个钩子函数中(体检表上第一个科室,一般是身高体重吧,呵呵),钩子函数将根据其各自的功能(每个科室检查的项目不一样啊)对消息进行监视(有的大夫就随便看看了事),、修改(碰到好心的大夫还可以帮你往好里添点呢,呵呵)和控制(有的大夫好严格啊),并在处理完成后(当然有的大夫就直接把你刷下了,回家吧,没有下一个了)把消息传递给下一钩子函数(下一个项目的科室,当然,也可以强制消息的传递,直接打发你回家)直至到达钩子链表的末尾(检查完了!)。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数(好了,拿着表去上班吧)。
虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。
哦,想起来了,金山词霸的屏幕取词是不是就是使用Hook实现的吧?
2007-4-4 Helios