Windows 钩子函数

本文介绍了Windows钩子函数中,关于lParam第30位的含义。在WH_KEYBOARD类型的钩子中,第30位用于标识键的状态,帮助判断按键是按下还是松开,避免重复消息的发送。

今天看书,发出一个钩子函数,代码如下:

// 键盘钩子函数
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),所以这样可以过虑掉其中的一个,防止消息重复发送。

Windows钩子函数是一种Windows API机制,它允许程序在操作系统中拦截和监视特定事件或消息。这些事件或消息可以是键盘、鼠标、消息队列等。钩子函数通常用于记录用户输入,或者在特定条件下触发自定义操作。 实现Windows钩子函数需要以下步骤: 1. 定义钩子函数 钩子函数是一个回调函数,当特定事件或消息发生时,操作系统将调用该函数钩子函数需要根据钩子类型和事件类型进行定义,例如键盘钩子函数可以监视按键事件,鼠标钩子函数可以监视鼠标事件等。 2. 安装钩子 安装钩子需要使用`SetWindowsHookEx`函数。该函数需要三个参数:钩子类型、钩子函数地址、以及钩子函数所属进程的句柄。钩子类型可以是全局钩子或局部钩子,具体取决于监视的事件或消息。 3. 卸载钩子 卸载钩子需要使用`UnhookWindowsHookEx`函数。该函数需要一个参数,即之前安装钩子时返回的句柄。 下面是一个示例键盘钩子函数的实现: ```c++ LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { // 拦截到键盘事件 PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; if (wParam == WM_KEYDOWN) { // 按键按下事件 // 处理按键事件 } } return CallNextHookEx(NULL, nCode, wParam, lParam); // 调用下一个钩子 } int main() { HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHook, NULL, 0); // 安装键盘钩子 // ... UnhookWindowsHookEx(hook); // 卸载键盘钩子 return 0; } ``` 在上面的示例中,`KeyboardHook`函数是一个键盘钩子函数,它拦截键盘事件并进行处理。在`main`函数中,使用`SetWindowsHookEx`函数安装了一个全局键盘钩子,并使用`UnhookWindowsHookEx`函数卸载了该钩子
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值