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

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


相关推荐

  • 怎么用ps提取图片颜色分析色彩搭配

    怎么用ps提取图片颜色分析色彩搭配这个小工具(PS插件)还是挺好用的,无需网络,直接在PS软件上面即可使用,支持Win与MAC版PSCS6以上版本,再也不用为分析图片配色发愁了,这个PS脚本插件可以搜一下“图片颜色分析识别PS插件Win/Mac版”即可找到。1、安装PS脚本(插件),选中PS软件图标右键“属性”-“打开文件位置”-“Presets”-“Scripts”复制脚本(.jsx)到以上目录粘贴。2、打开PS软件,打开我们…

    2022年6月15日
    38
  • html5 sexteen,Teen guilty of rape and murder

    html5 sexteen,Teen guilty of rape and murderMANITOWOC,Wis.-Ajuryconvicteda17-year-oldboyWednesdayofrapingaphotographerandhelpinghisuncle,whosepreviousbrusheswiththelawbroughtattentiontothecase,killherandburnher…

    2022年5月10日
    35
  • java请求webservice_java service

    java请求webservice_java service展开全部java返回list这你应该会吧,然后转换成json格式给其它语言.json(javascriptObjectNotation的缩写)是一个基于文本的,人类可读32313133353236313431303231363533e4b893e5b19e31333361313936的,开放标准的轻量级数据交换格式。它继承了javascript中的简单数据结构和相关数组对象,称为对象。不管…

    2022年10月16日
    3
  • 增长黑客手册——03

    增长黑客手册——03ToB,ToC案例;增长团队的组建;用数据驱动增长的方法(三个过程、五步搭建方法)

    2025年12月14日
    2
  • 数据结构之循环队列

    数据结构之循环队列数据结构之循环队列前言:关于循环队列需明白以下几点:1、循环队列是队列的顺序存储结构2、循环队列用判断是否为空利用Q.front=Q.rear3、循环队列头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置4、按照队列的定义,队头删除,队尾插入,在这里插入图片描述会导致队头之前可能有空余的内存空间(如下图J1,J2出队后,空间被浪费),为了解决该问题,提出循环队列的解决方…

    2022年6月2日
    37
  • JavaWeb实现qq邮箱验证(一)[通俗易懂]

    JavaWeb实现qq邮箱验证(一)[通俗易懂]需求:用户注册时给邮箱发送邮件,得到验证码并填写,进行激活邮箱。有基础的可以直接看下篇JavaWeb实现qq邮箱验证(二):https://blog.csdn.net/BlackPlus28/article/details/85114001首先一步一步来写,这篇是以java简单的发送邮件一、设置发件人的邮箱和密码等 // 下面需要补充的是,你自己的邮箱和授权码还…

    2022年6月13日
    39

发表回复

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

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