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

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

相关推荐

  • SQL SERVER 的压缩功能

    SQL SERVER 的压缩功能请关注个人小站:http://sqlhis.com/SQLSERVER2008及以上提供数据库表压缩功能1.压缩分类和比率压缩分为行(ROW)压缩和页(PAGE)压缩,页压缩的压缩比率更

    2022年8月1日
  • 解决-iOS: Thead 1: signal SIGABRT

    出现这个错误,很有可能是你修改过控件的referencingoutlets。有可能出现了重复添加或者添加了无用的引用。查看办法是:点开Main.storyboard,在xcode面板右侧点击showtheconnectionsinspector查看是否存在错误的outlet设置,找到之后删除。如果不能解决,请查看更多解决办法。…

    2022年4月8日
  • idea正则表达式替换(idea正则搜索)

    待替换代码如下(ledger.getPrinciple().intValue()*100)需要替换成((int)(ledger.getPrinciple()*100))我们需要怎么做呢?ctrl+r打开文件替换勾选替换选项Regex待匹配行正则表达式逐步分解首先我们看到有三个括号,一个*100,于是有了\(\(\))\(\)\*100\),特殊字符…

    2022年4月10日
  • model.addattribute()的作用___attribute__()

    model.addattribute()的作用___attribute__()在前台用JS写的脚本方法,除了可以直接用在前台控件的属性中,还可以在后台运用。即在后台页面加载时,调用JS方法。语法格式有两种,如下:1.第一种写法:控件ID名.Attributes.Add(“事件名称”,“JS方法”);如:一个按钮控件Button1.Attributes.Add(“onclick”,“returnconfirm(‘确认?’)”);2.另一写法…

    2022年9月26日
  • make menuconfig学习

    make menuconfig学习1.简介menuconfig是一套图像化配置工具,由ncurses库提供软件支持。ncurses库提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,比如说通过上下左右调整光标,Enter选中等,并不负责提供内容。menuconfig运行之后会读取Kconfig、读取/写入.config文件,Kconfi…

    2022年5月20日
  • Jetty 与 Tomcat

    Jetty 与 TomcatJetty也是一个“HTTP服务器+Servlet容器Jetty整体架构简单来说,JettyServer就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成。整体结构请看下面这张图。JettyServer可以有多个Connector在不同的端口上监听客户请求。对比一下Tomcat的整体架构,两者非常的相像。区别:第一个区别是Jetty中没有Service的概念,Tomcat中的Service包装了多个连接器和.

    2022年10月28日

发表回复

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

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