hook。链子链,CallNextHookEx() 的填写。
安装多个钩子,就会形成钩子链表。
钩子链是由下到上的,先安装钩子在下,后安装钩子在上。最后加入的钩子,最先获得控制权。
CallNextHookEx(),参数1填写当前钩子的句柄。由当前钩子句柄,返回到钩子链表中,执行下一个钩子。
(1)线程钩子链,再到系统钩子链。
如果对于同一事件(如鼠标消息)既安装了线程勾子,又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。
(2)对同一事件消息,可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后,应把钩子信息传递给下一个钩子函数。
而且最后安装的钩子,放在链的开始,而最早安装的钩子放在结束。后加入的钩子,先获得控制权。
这里还有一个问题需要注意:
所有的钩子都串在一个链表上,最近加入的钩子放在链表的头部。当一个事件发生时,WINDOWS将按照从链表头到链表尾调用的顺序。所以您的钩子函数有责任把消息传到下一个链中的钩子函数。当然您可以不这样做,但是您最好明白这时这么做的原因。在大多数的情况下,最好把消息事件传递下去以便其它的钩子都有机会获得处理这一消息的机会。调用下一个钩子函数可以调用函数CallNextHookEx。
该函数的原型如下:
CallNextHookEx proto hHook:DWORD, nCode:DWORD, wParam:DWORD, lParam:DWORD
hHook 时是您(当前的)自己的钩子函数的句柄。利用该句柄可以从上到下,遍历钩子链(的其它钩子)。
nCode, wParam and lParam 您只要把传入的参数简单传给CallNextHookEx即可。
安装多个钩子,就会形成钩子链表。
钩子链是由下到上的,先安装钩子在下,后安装钩子在上。最后加入的钩子,最先获得控制权。
CallNextHookEx(),参数1填写当前钩子的句柄。由当前钩子句柄,返回到钩子链表中,执行下一个钩子。
(1)线程钩子链,再到系统钩子链。
如果对于同一事件(如鼠标消息)既安装了线程勾子,又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。
(2)对同一事件消息,可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后,应把钩子信息传递给下一个钩子函数。
而且最后安装的钩子,放在链的开始,而最早安装的钩子放在结束。后加入的钩子,先获得控制权。
这里还有一个问题需要注意:
所有的钩子都串在一个链表上,最近加入的钩子放在链表的头部。当一个事件发生时,WINDOWS将按照从链表头到链表尾调用的顺序。所以您的钩子函数有责任把消息传到下一个链中的钩子函数。当然您可以不这样做,但是您最好明白这时这么做的原因。在大多数的情况下,最好把消息事件传递下去以便其它的钩子都有机会获得处理这一消息的机会。调用下一个钩子函数可以调用函数CallNextHookEx。
该函数的原型如下:
CallNextHookEx proto hHook:DWORD, nCode:DWORD, wParam:DWORD, lParam:DWORD
hHook 时是您(当前的)自己的钩子函数的句柄。利用该句柄可以从上到下,遍历钩子链(的其它钩子)。
nCode, wParam and lParam 您只要把传入的参数简单传给CallNextHookEx即可。