C++ 鍵盤鉤子

#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******************************************/
相關文章
相關標籤/搜索