#include <windows.h> #pragma comment(lib, "User32.lib") HHOOK g_hKeyboard = NULL; #pragma data_seg("MySec") #pragma data_seg() #pragma comment(linker,"/section:MySec,RWS") HHOOK g_Hook; //此處爲鉤子過程函數,與方案一中的鉤子過程函數相同,再也不重複,其中函數名改成KeyboardHookProc LRESULT WINAPI KeyboardHookProc(int nCode,WPARAM wParam,LPARAM lParam) { LPKBDLLHOOKSTRUCT pKB = (LPKBDLLHOOKSTRUCT)lParam; BOOL bKeyToShield = FALSE; if(nCode == HC_ACTION){ switch(wParam){ case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP:{ bKeyToShield = (pKB->vkCode == VK_LWIN) || (pKB->vkCode == VK_RWIN)|| /* win鍵*/ (pKB->vkCode == VK_ESCAPE) || (pKB->vkCode == VK_RETURN) || /* esc鍵*/ ((pKB->vkCode == VK_TAB) && ((pKB->flags & LLKHF_ALTDOWN) != 0))|| /* alt+tab*/ ((pKB->vkCode == VK_ESCAPE) && ((pKB->flags & LLKHF_ALTDOWN) != 0))|| /* alt+esc*/ ((pKB->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)); /* ctrl+tab*/ break; } default: break; } } return(bKeyToShield?TRUE:CallNextHookEx(g_Hook,nCode,wParam,lParam)); } void SetHook()//安裝鉤子 { g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, GetModuleHandle(L"KeyboardHook"), 0); } void UnHook() //卸載鉤子 { UnhookWindowsHookEx(g_hKeyboard); } /******************************************dll END******************************************/