Windows 钩子函数

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值