2014-08-27 2 views
5

Windows에서 하위 수준 키보드 후크를 사용하고 있습니다. 그것은 현재 키가 처음 눌려 지거나 다시 눌려 졌는지 여부를 알 수 없다는 사실에도 불구하고 charme처럼 작동합니다. documentation (+ here)은 비트 7이 전환 상태를 유지한다고 말합니다. 그러나 이것은 키가 공개 될 때만 사실 인 것처럼 보입니다. 비트 7은 처음에 키를 누를 때 슬프게도 설정되지 않습니다.KBDLLHOOKSTRUCT를 사용하여 첫 번째 키 누르기 확인

키를 처음 눌렀는지 확인할 방법이 있습니까?

+0

키보드 후크의 많은 문제 중 하나 인 키보드 상태는 프로세스 별 속성입니다. 그래서 전적으로 당신이 얻는 것은 어떤 프로세스가 전경 윈도우를 소유하고 그것이 전에 열쇠를 보았는지 여부에 달려 있습니다. –

+0

알아,하지만이 경우에는 상관 없어. 사용자가 내 프로세스에만 집중할 것으로 기대하지만 위험에 대해 알고 있습니다. 감사합니다! –

+3

@Hans 키보드 상태는 스레드 (또는 AttachThreadInput 호출 결과로 여러 스레드가 묶여있는 경우 스레드 그룹)별로 제어됩니다. * process *를 * thread 또는 thread group *으로 바꾸면 주석이 수정됩니다. – IInspectable

답변

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

그것은 누군가가 더 나은 해결책을 게시 할 때까지 현재 내가하는 일입니다. 감사! –