钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递
相关API
SetWindowsHookEx
安装钩子- 如果钩子需要关联当前系统所有窗口。则需要在DLL动态库中安装钩子
UnhookWindowsHookEx
卸载钩子
g_hHook = ::SetWindowsHookEx(
WH_KEYBOARD, //钩子类型:键盘钩子
KeyboardProc, //回调函数
NULL, //局部钩子:填 NULL 全局钩子:填DLL的模块句柄
GetCurrentThreadId());//当前线程 填 NULL则挂所有窗口线程
UnhookWindowsHookEx(g_hHook);//卸载钩子
- 回调函数
KeyboardProc
- 返回值:若为非0值,则不把消息传递给钩子链中的下一个钩子,直接发送给目标窗口
- LRESULT CALLBACK `KeyboardProc`
(int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//nCode小于零,必须立即调用 CallNextHookEx并返回
if (code < 0)
{
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
if (code == HC_ACTION)
{
TCHAR szBuff[MAXBYTE];
wsprintf(szBuff, TEXT("KeyboardProc: %c"), wParam);
OutputDebugString(szBuff);
}
// 钩子无法更改具体消息携带的数据,只能做监视使用
wParam = 0x123; //设置无效
lParam = 0x789; //设置无效
return CallNextHookEx(g_hHook, code, wParam, lParam);
}