消息钩子
概述
钩子过程
操作系统在传递消息时,将我们感兴趣的消息先传递给HOOK过程,在此函数中进行检查,然后在决定是否放行该消息,就好像逃犯在逃亡时可能会经过许多段路段,为了抓住他,警察要在某些地方设置检查站,以便检查过往的车辆和行人,我们可以把车辆和行人看做是消息,检查站就好像是HOOK过程,如果在摸个检查站发现了这个逃犯,就会把他抓起来,这样就相当于阻止了逃犯的逃亡过程,让他无法在继续逃亡下去了,这个道理和钩子过程是一样的,操作系统将我们感兴趣的消息都交给钩子过程,后者实际就是一个函数,在此函数中进行判断,如果是我们希望屏蔽的消息,那么就直接处理掉,不然它继续向下传递.如果我们不感兴趣的消息,就直接放弃对它们的处理,这就好像对于那些不是逃犯的行人和车辆一样,警察会让他们继续前进
钩子链
SetWindowsHookEx函数作用是安装一个应用程序定义的钩子过程,并将其放到钩子链中,为了让读者更好的理解钩子的概念,让我们在看看前面所举的逃犯的例子.警察在抓捕逃犯时,可以再多个地方设置检查站,逐一对车辆和行人进行排查,同样地,应用程序也可以在多个地方安装钩子函数,对我们感兴趣的多个消息逐一进行排查,这样多个钩子过程就形成了钩子链,要注意的是,最后安装的钩子过程总是排列在该链的前面
消息钩子分类
- 进程内钩子 勾取本进程消息
- 全局钩子 勾取所有消息
相关函数
函数原型
HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
参数说明
- idHook
指定要安装的钩子过程的类型
- WH_CALLWNDPROC 安装一个钩子过程,在操作系统将消息发送到目标窗口处理过程之前,对该消息进行监视
- WH_CALLWNDPROCRET 安装一个钩子过程,它对被目标窗口处理过了的消息进行监视
- WH_CBT 安装一个钩子过程,接受对CBT应用程序有用的消息
- WH_DEBUG 安装一个钩子过程,以便对其他钩子过程调试
- WH_FOREGROUNDIDLE 安装一个钩子过程,该钩子过程当应用程序的前提线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务
- WH_GETMESSAGE 安装一个钩子过程对发送到消息队列的消息进行监视
- WH_JOURNALPLAYBACK 安装一个钩子过程,对此前由WH_JORNALRECORD钩子过程记录的消息进行发送
- WH_JOURNALRECORD 安装一个钩子过程,对发送到系统消息队列的输入消息进行记录
- WH_KEYBOARD 安装一个钩子过程,对键盘按键消息进行监视
- WH_KEYBOARD_LL 安装一个钩子过程,只能在Windows NT中安装,用来对底层的键盘输入事件进行监视
- WH_MOUSE 安装一个钩子过程,对鼠标消息进行监视
- WH_MOUSE_LL 安装一个钩子过程,只能在Windows NT中安装,用来对底层的鼠标输入事件进行监视
- WH_MSGFILTER 安装一个钩子过程,以监视由对话框,消息框,菜单条,或滚动条中输入事件引发的消息
- WH_SHELL 安装一个钩子过程,以接受外壳应用程序有用的通知