2010-03-14 5 views
4

Windows 메시지 루프에서 키 누름 및 키 업 이벤트를 처리하려면 어떻게합니까? 두 개의 함수를 호출 할 수 있어야합니다. OnKeyUp(char c);OnKeyDown(char c);.키보드 입력 및 Win32 메시지 루프

Google 검색에서 찾은 바에 따르면 WM_CHAR 또는 WM_KEYUP 및 WM_KEYDOWN에 대한 혼란을 겪고 있으며 일반적으로 PDA 또는 Managed Code를 대상으로합니다. 반면 C++를 사용하고 있습니다.

답변

6

char c = MapVirtualKey(param,MAPVK_VK_TO_CHAR);을 사용하여 가상 키 코드를 char로 변환하고 WM_KEYUP, WM_KEYDOWN 및 해당 wParams를 처리하십시오.

if (PeekMessage (&mssg, hwnd, 0, 0, PM_REMOVE)) 
{ 
    switch (mssg.message) 
    { 
     case WM_QUIT: 
      PostQuitMessage (0); 
      notdone = false; 
      quit = true; 
      break; 

     case WM_KEYDOWN: 
      WPARAM param = mssg.wParam; 
      char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR); 
      this->p->Input()->Keyboard()->Listeners()->OnKeyDown (c); 
      break; 

     case WM_KEYUP: 
      WPARAM param = mssg.wParam; 
      char c = MapVirtualKey (param, MAPVK_VK_TO_CHAR); 
      this->p->Input()->Keyboard()->Listeners()->OnKeyUp (c); 
      break; 
    } 
    // dispatch the message 
    TranslateMessage (&mssg); 
    DispatchMessage (&mssg); 
} 
11

일반적인 C++ 메시지 루프처럼 보이는이

MSG msg; 
while (GetMessage(&msg, null, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
TranslateMessage의 기능은 당신이 당신이 메시지를 WM_KEYDOWN 통과해야 할 필요가 WM_CHAR 메시지를보고 싶다면, WM_KEYDOWN 메시지에서 WM_CHAR 메시지를 생성하는 것입니다

그것. WM_CHAR 메시지에 대해 신경 쓰지 않는다면, 건너 뛰고 다음과 같이 할 수 있습니다. onKeyDown에와 OnKeyUp을 메시지는 문자보다는 WPARAM을 복용으로 정의된다

extern void OnKeyDown(WPARAM key); 
extern void OnKeyUp(WPARAM key); 

MSG msg; 
while (GetMessage(&msg, null, 0, 0)) 
{ 
    if (msg.message == WM_KEYDOWN) 
     OnKeyDown (msg.wParam); 
    else (msg.message == WM_KEYUP) 
     OnKeyUp(msg.wParam); 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

알 수 있습니다. WM_KEYDOWN 및 WM_KEYUP의 값이 char에 들어 맞는 값으로 제한되지 않기 때문입니다. WM_KEYDOWN

+1

여기서 문제는 키 업과 키 다운을 실행하는 코드가 있지만, 이식성이없는 코드가 있다는 것입니다. WPARAM을 더 휴대용으로 변환하는 방법이 필요합니다. 대신 모든 크로스 플랫폼 코드를 가져 와서 창만 만들어 가상 키 값을 테스트 할 수 있습니다. 따라서 'char'가 사용됩니다. 나는 또한 모든 문자를 변환하는 데 하루의 코드를 보내고 싶지 않다. –