今天看书,发出一个钩子函数,代码如下:
// 键盘钩子函数
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
if(lParam & 0x40000000) // 消息重复就交给下一个hook链
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
其中的“lParam & 0x40000000”这句不好理解,其实这个代码主要是检测lParam第30位是否为1(从第0位开始计算)。那么第30位到底代表什么意思呢?
当钩子应用于键盘检测时(钩子类型WH_KEYBOARD),此时lParam的每一位的含义如下:
可以看出第 30 位是表示这个键的之前状态(previous state)是否按下。通过检测这个位是否为1而判断某个键是按下(down)还是松开(up)。因为按下一个键有两个消息(down、up),所以这样可以过虑掉其中的一个,防止消息重复发送。