window 键盘 hook 使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include "widget.h" #include <QApplication> HHOOK key_keep=NULL; HWND window_hwhd=NULL; LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam ) { KBDLLHOOKSTRUCT *pkbhs=(KBDLLHOOKSTRUCT*)lParam; if (nCode == HC_ACTION){ if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)& 0x8000 && GetAsyncKeyState(VK_SHIFT)&0x8000){ qDebug() << "Ctrl+Shift+Esc" ; } else if (pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000){ qDebug() << "Ctrl+Esc" ; } else if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN){ qDebug() << "Alt+Tab" ; } else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){ qDebug() << "Alt+Esc" ; } else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){ qDebug() << "LWIN/RWIN" ; } else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN){ qDebug() << "Alt+F4" ; } qDebug() << QTime::currentTime().toString( "hh:mm:ss zzz" ) << nCode << pkbhs->vkCode << pkbhs-> time ; return 1; //返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递 } return CallNextHookEx(key_keep, nCode, wParam, lParam); } int main( int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); window_hwhd=( HWND )w.winId(); key_keep= SetWindowsHookEx( /*WH_KEYBOARD*/ WH_KEYBOARD_LL,KeyboardProc,NULL,0 /*GetCurrentThreadId()*/ ); return a.exec(); } |
1 | LIBS += -luser32 |
全局监听键盘事件,不管界面是否激活状态,都可以获取键盘输入
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!