钩子函数

简介:
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>

            何为钩子函数,课上老师给了个通俗的解答。任务分为操作系统任务和用户任务,当用户任务需要调用系统功能,如硬件上的键盘,鼠标锁定等,就需要底层应用,而钩子函数就是让用户任务可以嵌入到底层,调用操作系统功能,因此钩子函数就是可以嵌入到底层工作的用户程序。

             详细解释:WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。
            局部钩子仅钩挂您自己进程的事件。
            远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:
基于线程的,它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。 系统范围的 将捕捉系统中所有进程将发生的事件消息。 当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。

           钩子一共有14种,以下是它们被调用的时机:
WH_CALLWNDPROC 当调用SendMessage时
WH_CALLWNDPROCRET 当SendMessage的调用返回时
WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时
WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时
WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时
WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时
WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。
WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的
WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时
WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时
WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮.
WH_CBT 当基于计算机的训练(CBT)事件发生时
WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用
WH_DEBUG 用来给钩子函数除错



本文转自 netcorner 博客园博客,原文链接:http://www.cnblogs.com/netcorner/archive/2009/08/23/2912061.html   ,如需转载请自行联系原作者


相关文章
|
机器学习/深度学习 定位技术 容器
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
468 0
|
11月前
|
敏捷开发 监控 数据可视化
如何管理复杂项目?Cynefin框架,Stacey矩阵和CAS实战指南
本文将详细介绍 Cynefin 框架、Stacey 矩阵 和 复杂适应系统模型CAS,高效应对复杂项目。
501 1
如何管理复杂项目?Cynefin框架,Stacey矩阵和CAS实战指南
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
AigcPanel:开源的 AI 虚拟数字人系统,一键安装开箱即用,支持视频合成、声音合成和声音克隆
AigcPanel 是一款开源的 AI 虚拟数字人系统,支持视频合成、声音克隆等功能,适用于影视制作、虚拟主播、教育培训等多种场景。
1422 12
AigcPanel:开源的 AI 虚拟数字人系统,一键安装开箱即用,支持视频合成、声音合成和声音克隆
|
存储 缓存 人工智能
[计算机网络(谢希仁 第八版)]第一章 概述(小节随堂测验+答案解析)
[计算机网络(谢希仁 第八版)]第一章 概述(小节随堂测验+答案解析)
|
Linux 编译器 Go
cgo--在Go中链接外部C库
cgo--在Go中链接外部C库
|
缓存 机器人 网络安全
解决steam错误提示“您对 CAPTCHA 的响应似乎无效,请在下方重新验证您不是机器人”的解决办法
在使用 Steam 的过程中,许多新手用户可能会遇到这样一个问题:当他们试图完成注册或其他操作时,系统提示“您对 CAPTCHA 的响应似乎无效,请在下方重新验证您不是机器人。”即使多次尝试,错误提示仍然出现,阻碍了用户的下一步操作。这种情况可能令人沮丧,但了解其背后的原因和解决办法可以帮助我们顺利解决这个问题。
16099 11
|
存储 算法 安全
9张图深入剖析ConcurrentHashMap
9张图深入剖析ConcurrentHashMap
|
存储 Python
python字典(定义、查找、增加、删除、修改)
python字典(定义、查找、增加、删除、修改)
136 0
|
SQL 关系型数据库 MySQL
7. 数值函数
7. 数值函数
cnpm i安装报错-Install fail! Error: Unsupported URL Type: npm:vue-loader@^15.9.7
cnpm i安装报错-Install fail! Error: Unsupported URL Type: npm:vue-loader@^15.9.7
1098 1