최근이 문제가 발생합니다. 좋은 해결책을 찾을 수 없지만 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
으로 설정할 수 있습니다.
키보드 후크의 많은 문제 중 하나 인 키보드 상태는 프로세스 별 속성입니다. 그래서 전적으로 당신이 얻는 것은 어떤 프로세스가 전경 윈도우를 소유하고 그것이 전에 열쇠를 보았는지 여부에 달려 있습니다. –
알아,하지만이 경우에는 상관 없어. 사용자가 내 프로세스에만 집중할 것으로 기대하지만 위험에 대해 알고 있습니다. 감사합니다! –
@Hans 키보드 상태는 스레드 (또는 AttachThreadInput 호출 결과로 여러 스레드가 묶여있는 경우 스레드 그룹)별로 제어됩니다. * process *를 * thread 또는 thread group *으로 바꾸면 주석이 수정됩니다. – IInspectable