2017-10-19 250 views
-3

我在Google和Microsoft鉤子文檔中搜索了很多,我發現了很多如何創建鉤子,但我已經知道如何做到這一點。如何讓我的鉤子(在這種情況下是鍵盤鉤子)在隊列中首先接收消息?我試圖讓我的鉤子儘可能靠近硬件輸入,以防止另一個鍵鉤改變輸入。 I.E:App1運行一個關鍵鉤子來欺騙不注入KBDLLHOOK的標誌。在他們可以更改LLKHF_INJECTED中的標誌之前,我如何獲得該消息?在別人之前處理我的WindowsHook

TL; DR我的鉤子如何在另一個之前獲得消息以防止密鑰注入?我知道的消息隊列轉爲在最後一階,但不知何故,不管我以前開始我的程序或應用1後,仍然得到了:我使用的測試

LRESULT CALLBACK keybdProc(int n, WPARAM w, LPARAM l) 
{ 
    KBDLLHOOKSTRUCT *kbdll = (KBDLLHOOKSTRUCT*)l; 
    if (w == WM_KEYDOWN) 
    { 
     switch (kbdll->flags) 
     { 
     case LLKHF_INJECTED: 
      printf("%d/%c is an Injected Key Press (Reject)\n", kbdll->vkCode, char(kbdll->vkCode)); 
      break; 
     default: 
      printf("%d/%c Not injected (Continue)\n", kbdll->vkCode, char(kbdll->vkCode)); 
      break; 
     } 
    } 
    return 0; //CallNextHookEx(NULL, n, w, l); 
} 

int main() 
{ 
    HHOOK keybdHk = SetWindowsHookEx(WH_KEYBOARD_LL, keybdProc, GetModuleHandle(NULL), 0); 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)>0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    UnhookWindowsHookEx(keybdHk); 
    return 0; 
} 

編輯

簡單的代碼在我的Keyhook之前輸入,然後不會調用NextHook(所以我的鉤子永遠不會得到它)或欺騙它。

+6

思想實驗:說有一種方法把自己放在第一位。其他鉤子程序不會*也這麼做嗎? – Blorgbeard

+0

是的,但是我的計劃是在它把自己放在第一位之後,我把它放在它前面。如果每隔x分鐘刷新一次,我會刷新x-1分鐘。創造某種'軍備競賽'的情況。 @Blorgbeard – Exsanity

+1

文檔確實提到'WH_KEYBOARD'掛鉤在'WH_KEYBOARD_LL'之前運行。如果你真的想成爲第一,沒有什麼會擊敗一位車手,但這可能有點過分。現在進入無證土地,如果內存服務,我通常會看到(低級別)鍵盤掛鉤稍後註冊,但我沒有這樣說。 – chris

回答

1

掛鉤在hook chains中管理,掛鉤程序按從前到後的順序執行。 As documented

SetWindowsHookEx函數總是在鉤子鏈的開始處安裝鉤子過程。當發生由特定類型的鉤子監控的事件時,系統在與鉤子相關聯的鉤子鏈的開始處調用該過程。鏈中的每個掛鉤過程都決定是否將事件傳遞給下一個過程。

要讓您的鉤子首先被調用,它需要最後安裝。雖然這很容易確定,但在鉤鏈中維持該位置是不可能的。

相關問題