设置全局键盘钩子 和 注意事项

设置全局键盘钩子 和 注意事项注意事项1.SetWindowsHookEx设置好全局键盘钩子后一定要使用PeekMessage或GetMessage来处理信息,不然程序会卡死,或者键盘失灵,反正就是不执行钩子例程2.网上多数看到设置全局键盘钩子而没有PeekMessage或GetMessage处理消息过程是因为他们使用MFC编程,MFC中自带消息处理过程,而这里直接

大家好,又见面了,我是你们的朋友全栈君。

注意事项
1. SetWindowsHookEx 设置好全局键盘钩子后 一定要 使用 PeekMessage 或 GetMessage 来处理信息,不然程序会 卡死 ,或者 键盘失灵,反正就是 不执行 钩子例程
2. 网上多数看到 设置全局键盘钩子 而没有 PeekMessage 或 GetMessage 处理消息 过程 是因为 他们使用 MFC 编程, MFC中 自带 消息处理过程,而这里直接 空程序 走起则需要自己处理消息
3. 设置 全局键盘钩子 可以不使用 dll ,完全可以直接在一个exe中调用
4. CallNextHookEx 的 第一个 参数 是 忽略 的,MSDN https://msdn.microsoft.com/en-us/library/ms644974(VS.85).aspx 中可以发现
5. 在XP以后的系统中已经无法拦截系统功能键 Ctrl+Alt+Delete
6. 如果要检测 a-z 键,要使用大写 A-Z 不然会无效并且检测到其他按键,小写的 a-z 与其他VK_键重叠

附上一个简单完整的钩子例程,屏蔽 a 键
关掉窗口结束程序

#include <Windows.h>
#include <iostream>
using namespace std;

HHOOK keyboardHook = 0;

LRESULT CALLBACK HookCallback(int code, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
    if(ks->vkCode == 'A')
    {
        cout << "已拦截A键" << endl;
        return 1;
    }
    return CallNextHookEx(0, code, wParam, lParam);
}

int main()
{
    keyboardHook = SetWindowsHookExA(WH_KEYBOARD_LL, HookCallback, GetModuleHandleA(0), 0);
    if (keyboardHook == 0)
    {
        cout << "挂钩键盘失败" << endl;
        return -1;
    }
    cout << "程序正常运行" << endl;

    //不可漏掉消息处理,不然程序会卡死
    MSG msg;
    while(1)
    {
        if (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
        else
            Sleep(0);    //避免CPU全负载运行
    }
    UnhookWindowsHookEx(keyboardHook);

    cout << "程序正常退出" << endl;

    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135211.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月5日 下午4:16
下一篇 2022年6月5日 下午4:16


相关推荐

  • mac配置环境变量文件

    mac配置环境变量文件mac 配置环境变量

    2025年9月29日
    5
  • lan8742a_常用以太网PHY芯片DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A「建议收藏」

    lan8742a_常用以太网PHY芯片DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A「建议收藏」常用的PHY芯片有DM9161AEP、RTL8201、DP83848CVV、LAN8720A、LAN8742A…DM9161AEP、DP83848CVV支持RMII、MII接口,而RTL8201只支持MII接口。拿DM9161AEP举例,可以支持8根通信线(TXD0/TXD1/TXD2/TXD3/RXD0/RXD1/RXD2/RXD3)的MII接口,也可以支持4根通信线(TXD0/TXD1/R…

    2022年6月17日
    80
  • Python爬取书包网文章实战总结

    Python爬取书包网文章实战总结这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入爬取书包网文…

    2022年6月29日
    31
  • 工业智能体来了?

    工业智能体来了?

    2026年3月16日
    2
  • PostgresSQL 分页查询 SQL语句

    PostgresSQL 分页查询 SQL语句SELECT*FROM“库名”.“表名”wheretellike‘%1%’orderbyidasclimit3OFFSET0;

    2022年10月19日
    5
  • MySQL中聚集索引、非聚集索引、联合索引、覆盖索引[通俗易懂]

    MySQL中聚集索引、非聚集索引、联合索引、覆盖索引[通俗易懂]在《面试官:为啥加了索引查询会变快?》一文中,我们介绍了索引的数据结构,正是因为索引使用了B+树,才使得查询变快。说白了,索引的原理就是减少查询的次数、减少磁盘IO,达到快速查找所需数据的目的我们一起来看一下InnoDB存储引擎中的索引聚集索引聚集索引(clusteredindex)就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分(备注:真实的B+树叶子节点是通过链表相连的,

    2022年6月4日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号