HHOOK keyHook = NULL;//先声明函数,实现在下面LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam);//初始化钩子,关闭键盘事件(除了ALT+CTRL+DELETE)void initHook(){keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), 0);}//销毁钩子void unHook(){if (keyHook){UnhookWindowsHookEx(keyHook);}}//钩子用的函数LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam){//在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;//如果nCode等于HC_ACTION则处理该消息,如果小于0,则钩子子程就必须将该消息传递给 CallNextHookExif (nCode == HC_ACTION) {if (pkbhs->vkCode == VK_ESCAPE){CLogHelp::ITCLog("keyProc---->Esc");if (g_pthisDlg){CLogHelp::ITCLog("Closescreen_FULL");g_pthisDlg->Closescreen_FULL();}}else 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) {CLogHelp::ITCLog("Alt+Tab ");}else if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){CLogHelp::ITCLog("Alt+Esc");}else if (pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN) {CLogHelp::ITCLog("VK_LWIN vs VK_RWIN ");}else if (pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN) {CLogHelp::ITCLog("Alt+F4 ");}else if (pkbhs->vkCode == VK_F1 && pkbhs->flags &LLKHF_ALTDOWN) {CLogHelp::ITCLog("Alt+F1 back room ");unHook();}else if (pkbhs->vkCode == VK_F1){CLogHelp::ITCLog("F1 Key press ");}return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递}return CallNextHookEx(keyHook, nCode, wParam, lParam);}
如果觉得《VC++键盘钩子demo》对你有帮助,请点赞、收藏,并留下你的观点哦!