SetWindowHookEx全局鉤子將應用程序定義的掛鉤過程安裝到掛鉤鏈中。您將安裝掛鉤過程來監視系統中某些類型的事件。這些事件與特定線程或與調用線程同一桌面中的所有線程相關聯.
idHook
要安裝的掛鉤過程的類型。此參數可以是以下值之一。
Value | Meaning |
---|---|
WH_CALLWNDPROC 4 |
安裝一個掛鉤過程,在系統將消息發送到目標窗口過程之前監視消息。有關詳細信息,請參閱CallWndProc掛鉤過程。 |
WH_CALLWNDPROCRET 12 |
安裝一個掛鉤過程,在目標窗口過程處理消息後監視它們。有關詳細信息,請參閱CallWndRetProc掛鉤過程。 |
WH_CBT 5 |
安裝接收對 CBT 應用程序有用的通知的掛鉤過程。有關詳細信息,請參閱CBTProc掛鉤過程。 |
WH_DEBUG 9 |
安裝可用於調試其他掛鉤過程的掛鉤過程。有關詳細信息,請參閱DebugProc掛鉤過程。 |
WH_FOREGROUNDIDLE 11 |
安裝應用程序前臺線程即將空閒時將調用的掛鉤過程。此掛鉤可用於在空閒時間執行低優先級任務。有關詳細信息,請參閱前景IdleProc掛鉤過程。 |
WH_GETMESSAGE 3 |
安裝一個掛鉤過程,用於監視發佈到消息隊列的消息。有關詳細信息,請參閱GetMsgProc掛鉤過程。 |
WH_JOURNALPLAYBACK 1 |
安裝一個掛鉤過程,該過程會發布以前由WH_JOURNALRECORD掛鉤過程記錄的消息。有關詳細信息,請參閱日記本PlaybackProc掛鉤程序。 |
WH_JOURNALRECORD 0 |
安裝一個掛鉤過程,用於記錄發佈到系統消息隊列的輸入消息。此掛鉤可用於錄製宏。有關詳細信息,請參閱日記記錄Proc掛鉤過程。 |
WH_KEYBOARD 2 |
安裝監視擊鍵消息的掛鉤過程。有關詳細信息,請參閱鍵盤Proc掛鉤過程。 |
WH_KEYBOARD_LL 13 |
安裝監視低級鍵盤輸入事件的掛鉤過程。有關詳細信息,請參閱低級別鍵盤Proc掛鉤過程。 |
WH_MOUSE 7 |
安裝監視鼠標消息的掛鉤過程。有關詳細信息,請參閱MouseProc掛鉤過程。 |
WH_MOUSE_LL 14 |
安裝監視低級鼠標輸入事件的掛鉤過程。有關詳細信息,請參閱低級別鼠標Proc掛鉤過程。 |
WH_MSGFILTER -1 |
安裝一個掛鉤過程,用於監視對話框、消息框、菜單或滾動條中輸入事件生成的消息。有關詳細信息,請參閱MessageProc掛鉤過程。 |
WH_SHELL 10 |
安裝一個掛鉤過程,該過程接收對 shell 應用程序有用的通知。有關詳細信息,請參閱殼牌Proc掛鉤過程。 |
WH_SYSMSGFILTER 6 |
安裝一個掛鉤過程,用於監視對話框、消息框、菜單或滾動條中輸入事件生成的消息。掛鉤過程監視與調用線程位於同一桌面中的所有應用程序的這些消息。有關詳細信息,請參閱SysMsgProc掛鉤過程。 |
CallNextHookEx將掛鉤信息傳遞到當前掛鉤鏈中的下一個掛鉤過程。掛鉤過程可以在處理掛鉤信息之前或之後調用此函數。
LRESULT CallNextHookEx(
HHOOK hhk,//此參數將被忽略
int nCode,//轉接代碼傳遞到當前掛鉤過程。下一個掛鉤過程使用此代碼來確定如何處理掛鉤信息。
WPARAM wParam,//wParam值傳遞給當前掛鉤過程。此參數的含義取決於與當前掛鉤鏈關聯的掛鉤類型。
LPARAM lParam//lParam值傳遞給當前掛鉤過程。此參數的含義取決於與當前掛鉤鏈關聯的掛鉤類型
);
WH_KEYBOARD_LL 安裝監視低級鍵盤輸入事件的掛鉤過程。
HOOKPROC類型定義指向此回調函數的指針。低級別鍵盤Proc是應用程序定義或庫定義的函數名稱的佔位符
LRESULT CALLBACK LowLevelKeyboardProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
鍵盤鉤子實現
HHOOK g_Hook;
LRESULT CALLBACK LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
BOOL bControlKeyDown = 0;
switch (nCode)
{
case HC_ACTION:
{
// 檢查是否按了ctrl鍵
bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
//Disable CTRL+ESC
if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
return 1;
if(wParam == WM_KEYUP)
printf("%c", pkbhs->vkCode);
break;
}
}
return CallNextHookEx(g_Hook, nCode, wParam, lParam); //回調
//return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
MSG msg;
g_Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC)LowLevelKeyboardProc, GetModuleHandleW(0),0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);
return 0;
}