2009-11-28 2 views
1

Win32에서 Perl, Python 또는 Ruby (또는 C 언어)를 사용하여 왼쪽 Shift 또는 오른쪽 Alt를 눌렀는지 여부를 감지하는 방법이 궁금합니다.Win32에서 Perl, Python 또는 Ruby (또는 C)를 사용하여 Left Shift 또는 Right Alt 키를 누르는 방법을 감지하는 방법은 무엇입니까?

현재 창뿐만 아니라 전반적인 글로벌 환경을위한 것입니다. 예 : 문서를 타이핑 할 때 Right ALT를 눌러 Ruby로 작성된 음악 플레이어를 시작한 다음 Right ALT를 다시 누르면 일시 중지되거나 프로그램이 중단 될 수 있습니다. 감사.

답변

4

저수준 키보드 후크를 설치해야합니다. LowLevelKeyboardProc을 사용하여 SetWindowsHookEx를 호출 한 다음 적절한 virtual key code을 감시합니다.

왼쪽 및 오른쪽 시프트 및 Alt 키의 키 코드가 있습니다.

+1

이것은 당신이 인용 한 링크에서 언급되었지만 기억해야 할 좋은 점은 시스템이 이러한 콜백에 타임 아웃을 부과하기 때문에 너무 많은 계산을하지 않는 것이 좋습니다. – asveikau

+0

예. 장시간 작업해야하는 경우 다른 스레드에서 처리하기 위해 대기열에 보관해야하며 훅 자체에서는 수행하지 않아야합니다. –

0

저는 GetKeyState를 통해 가상 키의 상태를 볼 수 있다고 생각합니다. 예 : GetKeyState (VK_RSHIFT)입니다. Reed Copsey가 설명한 것처럼 후크를 사용하는 것이이 기능을 폴링하는 것이 아니라 목적에 더 잘 맞을 것입니다. 당신이 지금 키 의 현재 상태를 알고 싶다면

-1

, 당신은 각각 왼쪽 이동 오른쪽 고도에 대한 VK_LSHIFT 또는 VK_RMENU의 인수와 함께 GetAsyncKeyState()를 사용할 수 있습니다. 결과에 1 비트 이상의 정보가 포함되어 있으므로 결과의 최상위 비트를 테스트해야합니다.

if(GetAsyncKeyState(VK_LSHIFT) & 0x8000) 
    ; // left shift is currently down 

대신합니다

가 키 누름 대신 비동기 폴링을 통보받을 수, 당신은 WM_KEYDOWN 창 알림을 수신해야한다. 창문의 메시지 처리기에서 같은 것을 넣어 :

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
{ 
    switch(msg) 
    { 
    ... 
    case WM_KEYDOWN: 
     if(wparam == VK_LSHIFT) 
      ; // left shift was pressed 
     // etc. 
     break; 
    } 
} 

또한 키가 해제 될 때 알 수있는 WM_KEYUP 메시지를 처리해야합니다.

+2

아니요, VK_HIFT 대신 VK_SHIFT가 WM_KEYDOWN에서 wparam으로 지정됩니다. http://msdn.microsoft.com/en-us/library/windows/desktop/ms646280%28v=vs.85%29.aspx 지금 당장이 방법을 모색하고 있습니다. – cib

0

WM_KEYDOWN 및 WM_KEYUP 대신 WM_SYSKEYDOWN 및 WM_SYSKEYUP을 사용하십시오. 그러면 VK_LSHIFT 또는 VK_MENU 등인지 확인할 수 있으며 발생하는 이벤트를 잡아낼 수 있습니다.

+0

사용자가 [Alt] 키를 누른 채 ** 키 **를 입력하면 WM_SYSKEY [DOWN | UP]'이 전송됩니다. 그것은 OP가 요구하는 것이 아닙니다. 올바른 [Alt] 키를 누를 때 통보를 받고 싶습니다. 저수준 키보드 후크에서'WM_KEYDOWN'이 올바른 해결책입니다. – IInspectable

관련 문제