qt键盘钩子完善

/*** *LRESULT CALLBACK 是 Windows 回调函数的固定格式,不能随意修改。 *LRESULT 返回值类型(long 指针结果) 固定 *CALLBACK 调用约定(__stdcall) 固定 *int nCode 钩子代码 固定 *WPARAM wParam 附加参数1 固定 *LPARAM lParam 附加参数2 固定 */

//定义键盘钩子的回调函数 LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam){

复制代码
qDebug()<<"nCode--->"<<nCode;
qDebug()<<"wParam-->"<<wParam;
qDebug()<<"lParam-->"<<lParam;
​
//将 lParam 转换为指向 KBDLLHOOKSTRUCT 结构体的指针,并命名为 pkbhs。这个结构体包含了关于键盘事件的信息
KBDLLHOOKSTRUCT *pkbhs=(KBDLLHOOKSTRUCT *) lParam;
​
qDebug()<<"pkbhs-->"<<pkbhs;
复制代码
// 检查 nCode 是否等于 HC_ACTION。这意味着钩子过程应该处理该消息
if(nCode==HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){
​
    bool block = false;
​
    // 1. 功能键 F1-F12
    if(pkbhs->vkCode >= VK_F1 && pkbhs->vkCode <= VK_F12){
        block = true;
    }
​
    // 2. win 键
    if(pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){
        block = true;
    }
​
    // 3. alt 组合键
    if(pkbhs->flags & LLKHF_ALTDOWN){
        //alt + 任何键都拦截
        block = true;
    }
​
    //4. ctrl 组合键
    if(GetAsyncKeyState(VK_CONTROL) & 0x8000){
        //ctrl + 任何键都拦截
        block = true;
    }
​
    //5. 单独的系统键
    switch (pkbhs->vkCode){
    case VK_TAB:     // Tab 键
    case VK_ESCAPE:  // ESC 键
    case VK_RETURN:  // Enter 键
    case VK_SPACE:   // 空格键
    case VK_DELETE:  // Delete 键
    case VK_BACK:    //backspace 键
    case VK_APPS:    //右键菜单键
        block = true;
        break;
    }
​
    //6. Ctrl + Alt + Del (特殊处理)
    //ctrl + alt + del 无法直接拦截,但可以禁用其功能
    if(pkbhs->vkCode == VK_DELETE && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_MENU) & 0x8000)){
        block = true;
    }
​
    //7. 任务管理器快捷键
    //ctrl + shift + esc
    if(pkbhs->vkCode == VK_ESCAPE && (GetAsyncKeyState(VK_CONTROL) & 0x8000) && (GetAsyncKeyState(VK_SHIFT) & 0x8000)){
        block = true;
    }
​
    //8. 锁定屏幕
    //win + l
    if(pkbhs->vkCode == 'L' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    //9. 运行对话框
    //win + r
    if(pkbhs->vkCode == 'R' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    //10. 搜索/资源管理器
    //win + e
    if(pkbhs->vkCode == 'E' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    //11. 系统设置
    //win + i
    if(pkbhs->vkCode == 'I' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    //12. 截图工具
    //win + shift + s
    if(pkbhs->vkCode == 'S' && (GetAsyncKeyState(VK_LWIN) & 0x8000) && (GetAsyncKeyState(VK_SHIFT) & 0x8000)){
        block = true;
    }
​
    //13. 切换虚拟桌面
    //win + ctrl + 左/右
    if((pkbhs->vkCode == VK_LEFT || pkbhs->vkCode == VK_RIGHT) && (GetAsyncKeyState(VK_LWIN) & 0x8000) && (GetAsyncKeyState(VK_CONTROL) & 0x8000)){
        block = true;
    }
​
    //14. 任务视图
    //win + tab
    if(pkbhs->vkCode == VK_TAB && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    //15. 快速访问
    //win + x
    if(pkbhs->vkCode == 'X' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
复制代码
    //16. 辅助功能
    //win + u
    if(pkbhs->vkCode == 'U' && (GetAsyncKeyState(VK_LWIN) & 0x8000)){
        block = true;
    }
​
    if(block){
        return 1; //拦截按键
    }
}
​
//如果没有匹配任何条件,则调用 CallNextHookEx 函数将控制权传递给下一个钩子过程。这是必要的以确保其他钩子也能接收到消息
​
return CallNextHookEx(keyHook_lockScreen,nCode,wParam,lParam);

}

相关推荐
云泽80817 小时前
STM32 USART 详解(四):数据帧及标志位的收发机制与寄存器深度剖析
stm32·单片机·嵌入式硬件
神仙别闹17 小时前
基于 QT(C++)开发的地铁换乘系统
数据库·c++·qt
EleganceJiaBao18 小时前
【嵌入式】STM32 状态机设计:枚举、位掩码、结构体、变量与宏定义的合理选择
stm32·单片机·嵌入式硬件·枚举·状态机·位掩码
一条破秋裤19 小时前
STM32F103 UART 第一层复习:USART1 收发、回显与默写测试
stm32·单片机·嵌入式硬件
老当益壮梁奶奶20 小时前
51单片机入门总结(一):基本概念、最小系统、流水灯与按键实验(附完整代码)
笔记·stm32·单片机·嵌入式硬件·51单片机
C++ 老炮儿的技术栈20 小时前
西门子 S7 常用存储区(I/Q/M/T/C/DB/PI/PQ)
linux·开发语言·c++·windows·qt·io
abc light1 天前
单片机(2)
stm32·单片机·嵌入式硬件
j7~1 天前
【Qt】(篇二)《信号与槽:信号和槽的概述,使用、自定义信号和槽、信号与槽的连接方式、信号和槽的其他说明》---详解
qt·信号·qt5·信号与槽··qt creater
糖糖单片机设计2 天前
基于 STM32 的小型鸟类宠物繁殖系统
stm32·嵌入式硬件·宠物
Littlehero_1212 天前
QT自定义控件之电气接线图(源码开源)
开发语言·qt