类
按事件分类,钩子函数有如下几种常用类型。
? 键盘钩子和低级键盘钩子可以监视各种键盘消息;
? 鼠标钩子和低级鼠标钩子可以监视各种鼠标消息;
? 外壳钩子可以监视各种Shell 事件消息。比如启动和关闭应用程序;
? 日志钩子可以记录从系统消息队列中取出的各种事件消息;
? 窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
下面对常用的Hook 类型进行介绍:
(1)WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC 和WH_CALLWNDPROCRET Hooks 可以监视发送到窗口过
程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook 子程,
并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook 子程。
WH_CALLWNDPROCRET Hook 传递指针到CWPRETSTRUCT 结构,再传递到Hook 子程。
CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息
关联的消息参数。
(2)WH_CBT Hook
在如下事件之前,系统都会调用WH_CBT Hook 子程。
? 激活、建立、销毁、最小化、最大化、移动、改变尺寸等窗口事件。
? 完成系统指令。
? 来自系统消息队列中的移动鼠标、键盘事件。
? 设置输入焦点事件。
? 同步系统消息队列事件。
? Hook 子程的返回值确定系统是否允许或者防止这些cāo作中的一个。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·272·
(3)WH_DEBUG Hook
在系统调用系统中与其他Hook 关联的Hook 子程之前,系统会调用WH_DEBUG Hook
子程。可以使用这个Hook 来决定是否允许系统调用与其他Hook 关联的Hook 子程。
(4)WH_FOREGROUNDIDLE Hook
当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook 执行
低优先级的任务。当应用程序的前台线程要变成空闲状态时, 系统就会调用
WH_FOREGROUNDIDLE Hook 子程。
(5)WH_GETMESSAGE Hook
应用程序用WH_GETMESSAGE Hook 来监视从GetMessage 或者PeekMessage 函数返回
的消息。可以使用WH_GETMESSAGE Hook 去监视鼠标和键盘输入,以及其他发送到消息
队列中的消息。
(6)WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK Hook 使应用程序可以chā入消息到系统消息队列。可以使用
该Hook 回放用WH_JOURNALRECORD Hook 记录下来的连续的鼠标和键盘事件。只要
WH_