钩子函数的使用范围(学习摘录)
信息来源:msdn
grit翻译
钩子函数的使用范围
钩子(hook)从使用范围上分,可分为:线程范围的钩子和系统范围的钩子,有的两者皆顾。
钩子类型 使用范围
WH_CALLWNDPROC Thread or System
WH_CBT Thread or System
WH_DEBUG Thread or System
WH_GETMESSAGE Thread or System
WH_JOURNALRECORD System Only
WH_JOURNALPLAYBACK System Only
WH_FOREGROUNDIDLE Thread or System
WH_SHELL Thread or System
WH_KEYBOARD Thread or System
WH_MOUSE Thread or System
WH_MSGFILTER Thread or System
WH_SYSMSGFILTER System Only
对于给定的一种钩子类型(hook type),线程钩子首先被调用,然后调用系统钩子;
相对于系统钩子,使用线程钩子有以下几点好处:
1、在整个系统范围内,对于对钩子调用不感兴趣的其他程序,线程钩子不会引起不必要的开销;
2、不会序列化所有的事件,即让所有的事件串行执行。举个例子,如果一个程序安装了系统范围的响应键盘消息的钩子,传给所有程序的所有键盘消息都将串行通过这个程序的钩子函数,这对系统固有的多通道并行输入队列机制明显是一个浪费。如果钩子函数停止处理键盘事件,那么系统看上去就像停止工作(死机),但实际上它还在运行,只是不响应用户的操作了。如果是这种情况,用户通常会使用ctrl+alt+delete组合注销用户来解决这个问题(虽然用户可能并不了以这样做)。而更有可能有的用户就意识不到使用这种办法。
3、不需要将钩子函数的实现封装在一个独立的dll中。而所有系统范围的钩子和希望监控其他应用程序线程的钩子要求必须驻留在dll中。
4、不需要在一个dll中和其他的不同的进程共享数据。而一个系统范围的钩子由于必须驻留在dll中,所以如果要和其他进程共享数据也只能在dll中进行。但是这种在dll中和其他进程共享数据的方法并不是dll本身具有的功能,所以你在实现系统范围的钩子函数时必须小心处理共享问题。如果一个钩子函数没有设计好,共用了无效的数据,那么进程可能崩溃。
问题点数:0、回复次数:0Top




