我在窗口上使用低級別鍵盤掛鉤。它的作用就像一個魅力,儘管我目前無法分辨出鑰匙是最初被按下還是再次按下。 documentation(+ here)說,位7保持過渡狀態。但是,當鑰匙被釋放時,這似乎只是真的。當我第一次按下鍵時,位7很遺憾地沒有設置。使用KBDLLHOOKSTRUCT確定第一次按鍵
有什麼辦法可以判斷最初是否按下了按鍵?
我在窗口上使用低級別鍵盤掛鉤。它的作用就像一個魅力,儘管我目前無法分辨出鑰匙是最初被按下還是再次按下。 documentation(+ here)說,位7保持過渡狀態。但是,當鑰匙被釋放時,這似乎只是真的。當我第一次按下鍵時,位7很遺憾地沒有設置。使用KBDLLHOOKSTRUCT確定第一次按鍵
有什麼辦法可以判斷最初是否按下了按鍵?
我碰巧遇到這個問題最近。我找不到任何好的解決方案,但我最終在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
。
這正是我目前所做的,直到有人發佈更好的解決方案。謝謝! – 2014-08-28 19:17:54
鍵盤鉤子的許多問題之一是鍵盤狀態是每個進程的屬性。所以你完全取決於擁有前景窗口的過程以及它*之前是否已經看到了密鑰。 – 2014-08-27 11:52:35
我知道,但我不在乎這種情況。我希望用戶只關注我的流程,但我意識到風險,謝謝! – 2014-08-27 12:31:45
@Hans鍵盤狀態由每個線程(或線程組,如果多個線程由於調用'AttachThreadInput'而連接在一起)控制。用*線程或線程組*替換* process *的所有匹配項*修復您的評論。 – IInspectable 2014-08-27 14:30:54