一、概述
在 Windows 中大部分的应用程序都是基于消息机制的,它们都有一个过程函数,根据不同的消息完成不同的功能。
Windows 操作系统提供的钩子机制就是用来截获和监视系统中这些消息的。
按照钩子作用的范围不同,它们又可以分为局部钩子和全局钩子。局部钩子是针对某个线程的,而全局钩子则是作用于整个系统的基于消息的应用。
全局钩子需要使用 DLL 文件,在 DLL 中实现相应的钩子函数。
二、实现原理
如果创建的是全局钩子,那么钩子函数必须在一个 DLL 中。这是因为进程的地址空间是独立的,发生对应事件的进程不能调用其他进程地址空间的钩子函数。
如果钩子函数是实现代码在 DLL 中,则在对应事件发生时,系统会把这个 DLL 加载到发生事件的进程地址空间中,使它能够调用钩子函数进行处理。
为了能够让 DLL 注入到所有的进程中,程序设置 WH_GETMESSAGE 消息的全局钩子。因为 WH_GETMESSAGE 类型的钩子会监视消息队列,并且 Windows 系统是基于消息驱动的,所以所有进程都会有自己的一个消息队列,都会加载 WH_GETMESSAGE 类型的全局钩子 DLL。
三、主要代码
- 设置全局钩子:
// 设置全局钩子
BOOL SetGlobalHook()
{
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hDllModule, 0);
if (NULL == g_hHook)
{
return FALSE;
}
return TRUE;
}
- 钩子回调函数:
// 钩子回调函数
LRESULT GetMsgPro