在Dialog程序中使用WH_KEYBOARD_LL类型HOOK的方法:
SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, AfxGetApp()->m_hInstance, NULL);
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 (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;
// Response to Up if ((pkbhs->vkCode == VK_UP) && (WM_KEYUP == wParam)) { HWND hwnd=::FindWindow(NULL, "WindowCaption"); ::PostMessage(hwnd, WM_COMMAND, ID_MENU_ITEM, 0L); } } default: break; } return CallNextHookEx (NULL, nCode, wParam, lParam); }
BOOL InstallKbHook( ) {
if (hhookKb ) UninstallKbHook();
hhookKb = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, AfxGetApp()->m_hInstance, NULL);
return(hhookKb != NULL);
}
BOOL UninstallKbHook() {
BOOL fOk = FALSE; if (hhookKb ) { fOk = UnhookWindowsHookEx(hhookKb ); hhookKb = NULL; }
return(fOk); } 
|