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

设置全局键盘钩子 和 注意事项注意事项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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ConnectionString 属性尚未初始化「建议收藏」

    ConnectionString 属性尚未初始化「建议收藏」关于“ConnectionString属性尚未初始化”的问题(如下图),我在下面一段代码中发现了问题所在:publicboolReturnFlag(stringstrSQL){Chec

    2022年7月1日
    28
  • C++ 数值与 string 的相互转换

    C++ 数值与 string 的相互转换使用函数模板将基本数据类型(整型、字符型、实型、布尔型)转换成string。//ostringstream对象用来进行格式化的输出,常用于将各种类型转换为string类型//ostringstream只支持&amp;lt;&amp;lt;操作符template&amp;lt;typenameT&amp;gt;stringtoString(constT&amp;amp;t){ostringstreamoss;//创建一个格式化输出流

    2022年5月14日
    36
  • 狂神说SpringCloud学习笔记[通俗易懂]

    狂神说SpringCloud学习笔记[通俗易懂]注:本文根据哔哩哔哩Up主狂神老师:狂神说Java所讲的springcloud课程所作的笔记,狂神老师springcloud哔哩哔哩视频连接:https://www.bilibili.com/video/BV1jJ411S7xr?p=18spring,课程代码可用在狂神老师的Java交流群中获取,或者到我的码云仓库https://gitee.com/cao_shi_peng/dashboard/projects获取,如果想进一步深入学习springcloud详细内容可自行参考Spring

    2022年5月1日
    55
  • Ant是什么?「建议收藏」

    Ant是什么?「建议收藏」Ant是Java的生成工具,是Apache的核心项目;Ant类似于Unix中的Make工具,都是用来编译、生成;Ant是跨平台的,而Make不能;Ant的主要目的就是把你想做的事情自动化,不用你手动一步一步做,因为里面内置了javac、java、创建目录、复制文件等功能,所以可以直接点击Ant文件,即可编译生成你的项目。……

    2022年7月26日
    4
  • ds什么意思_小店源码

    ds什么意思_小店源码介绍:云铺购最新Ds网系统无后门全开源可运营版本控制端功能支持一键通秒搭建Ds网站点,一键新增修改站点版本,支持QQ一键通登录自主添加站点域名管理站点,可配置后台安全访问域名白名单IP(实时保护)控制端支持一键备份旗下所有站点数据,共享数据版大大减少服务器压力主站点功能前后台支持QQ一键通登录,前台风格8套内页风格3套,免密支付,订单代付自定义网站公告导航,等级配置,邮箱配置,密匙配置,站点一键通装修支持一键通秒对接云铺购系统,玖伍系统,亿乐系统,各大卡盟系统,网商系统等对接商品价格支持

    2022年8月13日
    6
  • linux wifi驱动框架_嵌入式Linux驱动开发教程

    linux wifi驱动框架_嵌入式Linux驱动开发教程对于SDIO接口的wifi,首先,它是一个sdio的卡的设备,然后具备了wifi的功能,所以,注册的时候还是先以sdio的卡的设备去注册的。然后检测到卡之后就要驱动他的wifi功能了,显然,他是用sdio的协议,通过发命令和数据来控制的。下面先简单回顾一下SDIO的相关知识:一、SDIO相关基础知识解析1、SDIO接口    SDIO故名思义,就是SD的I/O接口(in

    2022年10月3日
    3

发表回复

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

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