钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。
钩子是在捕获消息的时候立即执行钩子函数。
理解:
钩子函数是在系统在进行消息的传递处理时候利用钩子机制截取消息,可以对一些特定的消息进行处理。
像一些系统的开发功能可以基于消息处理机制,对消息进行初始化、动态创建分配空间,然后转发消息,对各个模块的消息进行实时监听,而钩子函数就是监听消息在传递到制定的模块窗口时候的操作,如果消息没有满足条件,钩子函数就可以把它进行处理然后让它无法最后成功达到目的地。如果满足了条件,就可以继续往后面传递。
特点:
1、是个函数,在系统消息触发时被系统调用
2、不是用户自己触发的
3、使用时直接编写函数体
4、钩子函数的名称是确定的,当系统消息触发,自动会调用。
举例
在window系统里,对键盘的获取,鼠标输入、屏幕取词等都是利用了钩子函数来实现。
钩子类型
创建钩子函数:
当创建一个钩子函数时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。
钩子类型分为
局部:仅钩挂自己进程的事件。
远程:钩挂其它进程发生的事件。
远程钩子分为:
1.系统级的全局钩子,
2.线程级的钩子
系统级的全局钩子
系统范围的 将捕捉系统中所有进程将发生的事件消息。
全局钩子函数需要定义在 DLL(动态链接库) 中,提供设置钩子的方法接口,然后再建立一个新的测试程序,来加载这个dll,调用钩子接口
线程级的钩子
作用范围只是限定在某个进程中,或者某个线程中。
钩子程序组成部分
主程序——用来实现界面或其他功能
钩子回调函数——用来接收系统发过来的消息
钩子的安装和卸载模块
钩子操作流程
1.关于钩子的操作方法都可以从一个函数出发,推导出来:
HHOOKWINAPISetWindowsHookEx(
int idHook,\钩子类型
HOOK PROClpfn,\回调函数地址
HINSTANCE hMod,\实例句柄
DWORD dwThreadId);\线程ID
)