2014-08-27 236 views
5

我在窗口上使用低級別鍵盤掛鉤。它的作用就像一個魅力,儘管我目前無法分辨出鑰匙是最初被按下還是再次按下。 documentation(+ here)說,位7保持過渡狀態。但是,當鑰匙被釋放時,這似乎只是真的。當我第一次按下鍵時,位7很遺憾地沒有設置。使用KBDLLHOOKSTRUCT確定第一次按鍵

有什麼辦法可以判斷最初是否按下了按鍵?

+0

鍵盤鉤子的許多問題之一是鍵盤狀態是每個進程的屬性。所以你完全取決於擁有前景窗口的過程以及它*之前是否已經看到了密鑰。 – 2014-08-27 11:52:35

+0

我知道,但我不在乎這種情況。我希望用戶只關注我的流程,但我意識到風險,謝謝! – 2014-08-27 12:31:45

+3

@Hans鍵盤狀態由每個線程(或線程組,如果多個線程由於調用'AttachThreadInput'而連接在一起)控制。用*線程或線程組*替換* process *的所有匹配項*修復您的評論。 – IInspectable 2014-08-27 14:30:54

回答

1

我碰巧遇到這個問題最近。我找不到任何好的解決方案,但我最終在SetWindowHookEx之前使用了一個標誌和一個GetAsyncKeyState

BOOL wasDown; 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    if (nCode == HC_ACTION) { 
     LPKBDLLHOOKSTRUCT key = (LPKBDLLHOOKSTRUCT) lParam; 
     if (key->vkCode == VK_SOMETHING) { 
      switch (wParam) { 
       case WM_KEYDOWN: 
       case WM_SYSKEYDOWN: 
        if (!wasDown) { 
         // Processing on first key down 
         wasDown = true; 
        } 
        break; 
       case WM_KEYUP: 
       case WM_SYSKEYUP: 
        // Processing on key up 
        wasDown = FALSE; 
        break; 
      } 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

wasDown = GetAsyncKeyState(VK_SOMETHING) < 0; 
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); 

當然,這段代碼只能用於一個鍵。您可以使用一組標誌來執行多個鍵。根據您的應用程序,如果您希望在設置鉤子後進行第一次按下,則可以無條件地將標誌設置爲false

+0

這正是我目前所做的,直到有人發佈更好的解決方案。謝謝! – 2014-08-28 19:17:54