/*** *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);
}