我们知道,Windows应用程序的工作本质是:消息基础,事件驱动。操作系统为应用程序维护这一个消息列表,应用程序则从这个表中取得消息,并作出相关反应。而钩子则可以监视这些消息,在应用程序获得消息之前截获之,并处理之,处理完了还可以决定该消息的去向。所以利用钩子可以完成很多特殊的功能。
钩子分线程钩子和全局钩子两种。线程钩子只监视某一特定线程的消息,而全局钩子则监视所有线程。全局钩子一般都写在dll中。
一、钩子的安装。
首先我们看一下安装钩子的函数:
<span style="font-size:24px;">HHOOK SetWindowsHookEx(
int idHook, // 钩子类型
HOOKPROC lpfn, // 钩子函数
HINSTANCE hMod, // 模块句柄
DWORD dwThreadId // 线程ID
);</span>
这个函数四个参数:
1、idHook:钩子有很多中类型,WH_CBT,WH_CALLWNDPROC,WH_DEBUG,WH_JOURNALRECORD等等。本文主要讲比较常用的两种:WH_KEYBOARD和WH_MOUSE,分别是监视键盘事件和鼠标事件。
2、lpfn:钩子函数。这是一个我们自己定义的回调函数,当系统监视到我们需要的事件时,就会调用该函数。该函数原型如下:
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//wParam和lParam为所钩的消息的参数,nCode与钩子的类型有关
return CallNextHookEx(hook,nCode,wParam,lParam);
}
这个函数的名字HookPrco可以自己任意取。nCode值与不同的钩子类型相关,wParam和lParam的值和不同的窗口消息相关。这里主要讲下WH_KEYBOARD和WH_MOUSE