当前位置:首页 > Windows程序 > 正文

SetWindowsHookEx()

2021-03-27 Windows程序

钩子函数可以用来获取系统的按键消息,进而可以屏蔽某些按键或者按键组合。我们发现WH_KEYBORAD_LL和WH_MOUSE_LL这两个low-level的hook可以被安装成全局的,这我们不妨用这两个low-level的hook替换掉WH_KEYBORAD和WH_MOUSE。
1 首先在xxDlg.h中添加如下代码

#if (_WIN32_WINNT >= 0x0400) #define WH_KEYBOARD_LL 13 #define WH_MOUSE_LL 14 #define LLKHF_ALTDOWN (KF_ALTDOWN >> 8) #endif // (_WIN32_WINNT >= 0x0400) typedef struct { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; DWORD dwExtraInfo; } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

不添加这些代码的话,那么编译器会显示有些变量是没有被定义的
2 然后添加键盘按键处理函数,它是一个回调函数

LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam) { // By returning a non-zero value from the hook procedure, the // message does not get passed to the target window KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam; BOOL bControlKeyDown = 0; switch (nCode) { case HC_ACTION: { // Check to see if the CTRL key is pressed bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);//获取指定按键的状态 //Disable CTRL+ESC //if (bControlKeyDown) // { // AfxMessageBox("control按下"); //} if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown) return 1; //Disable ALT+TAB if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN) return 1; //Disable ALT+ESC if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN) return 1; break; } default: break; } return 1; }

我们要知道pkbhs->vkCode指定的是键盘按键的虚拟键码,,而LOBYTE(pkbhs->vkCode)指定的是键盘按键的ascii码

3添加全局键盘钩子函数 一般在OnCreate()函数中添加

int CHOOKEXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here Hook =(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeyboardProc,AfxGetApp()->m_hInstance,0); return 0; }

4添加卸载钩子函数,一般在OnDestory()函数中添加

void CHOOKEXDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here if(Hook) { BOOL result = UnhookWindowsHookEx((HHOOK)Hook); // 卸载钩子 if (result) Hook = NULL; } }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68490.html