windows消息钩子Hook的学习

4492 人浏览 | 时间: 2015-12-25 12:12:50 | 作者: 阿郎
通常消息的处理都是在消息到达线程的消息队列后进行的。这时线程通过一个消息循环处理所有到达的消息。那么,有没有办法在消息到达应用程序之前就进行处理呢?办法当然有,他就是消息钩子。
windows操作系统定义了若干消息钩子,每个消息沟子包含一个函数队列。每当特定的消息发生之后,该消息对应的消息钩子中的函数队列中的第一个函数就会被操作系统调用。因为消息钩子的函数队列中的函数总是有操作系统负责调用,所以这样的函数又称为回调函数。回调函数又称为消息过滤器。
为了利用消息钩子进行特殊的消息处理,必须将消息过滤器安装到狗子的函数队列中。因为函数钩子可能增加系统负担,所以要及时是房贷哦消息钩子中的过滤器。操作系统提供了SetWindowHookEx和UnhookWindowHookEx,分别为特定类型的消息钩子安装和卸载过滤器。
注意,不能保证消息钩子中的过滤器都会执行。因为操作系统总是调用队列中的第一个过滤器。而对不同类型的钩子,允许对过滤器的消息进行不同类型的处理。例如,有的消息钩子只是起到监视的作用,这种狗子的过滤器不能修改传入的消息,并可以调用过滤器的下一步继续处理;有的消息允许过滤器修改内容,过滤器可决定是否忽略该消息或将该消息传递给后续的过滤器继续处理。推荐使用系统提供的CallNextHookEx,以调用下一个过滤器对消息进行进一步处理。
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
参数nCode表示钩子代码,过滤器将依据此参数进行特定的操作,其值依赖钩子的类型。不同类型的钩子都定义了自己的钩子代码集合。wParam,lParam,也依赖与个定的钩子代码,但典型情况下包含了要发送或投递的消息的信息。

windows操作系统提供了下面几类消息钩子:

消息钩子有线程范围和系统范围之分。线程范围的消息钩子,其过滤器在该线程的上下文执行。换句话说,这种类型的消息钩子的过滤器只拦截与特定线程相关的消息。系统范围的消息钩子的过滤器则可能在系统所有进程的上下文中执行,也就是说这种过滤器能监视系统范围内的所有消息。请读者注意,消息钩子的范围确定了过滤器的执行上下文以及处理何种范围的消息。应尽可能使用线程范围的消息,而不是系统范围的过滤器。系统范围的过滤器将影响系统当前所有进程,并且在实现要有特别的考虑,例如要考虑进程间的数据共享问题。不同类型的钩子,其范围如下图所示。当同一个消息钩子的处理链中同时存在两种范围的过滤器时,线程范围的过滤器的将首先执行