2009-04-07 5 views
1

키보드 키를 누른 채로 처리하려고하면 주저하는 이유를 아는 사람이 있습니까? 내 WinProc (...)에서 키를 눌렀을 때 화면 (OpenGL)에서 이미지를 이동할 함수를 호출하고 있습니다. 나는 그것을 누르고 하나의 응답을 얻는다. 그 다음 약 0.5 초간 아무 것도 없다. 그러면 정상적으로 동작한다 (WinMain 루프마다 1 픽셀 씩 움직인다).키보드 입력을 멈추었습니까?

Windows 메시지가 사용하지 않도록 설정해야하는 기능 때문에 지연되고 있는지 궁금합니다. 여기

내 코드입니다 : 나는

void key_RIGHT() 
{ 
    MoveObjectRight1Pixel(); 
} 

답변

3

키를 누른 후 반복되는 메시지가 생성 될 때까지 약간의 지연이있는 다소 표준적인 키보드 설정입니다.

Windows 메시지 처리기에서 키보드 입력을 처리하는 대신 키보드의 현재 상태를 나타내는 256 비트 배열을 유지할 수 있습니다. WM_KEYDOWN 또는 WM_KEYUP을 받으면 해당 키의 비트를 업데이트합니다. 그런 다음 주 루프에서 키의 이전 상태와 키의 이전 상태를 확인합니다 (모든 프레임에 복사 할 256 비트의 두 번째 배열 유지).

키가 현재 작동 중지되었지만 이전 프레임에서 작동 중지되지 않은 경우 그에 따라 개체를 이동합니다.

또 다른 대안은 GetAsyncKeyState() 기능을 사용하는 것입니다.

+0

나는 어리석은 해결 방법을 취해야 할 것 같았습니다 ... 문명화 된 속도로 메시지를 보내도록 Windows를 강요 할 방법이 없습니까? –

+0

거대한 키보드입니다. :) 대부분의 표준 PC 키보드는 약 105 개의 키가 있으므로 128 비트는 나에게 많이 들립니다. – unwind

+0

@unwind : 대부분의 키보드에는 정상적인 키 수가 있지만 가상 키 코드 (VK_ * 상수)의 범위는 0에서 255까지입니다. –

1

음 :

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
    { 
     switch(msg) 
     { 
      case WM_KEYDOWN: 
       switch (wparam) 
       { 
        case VK_RIGHT: 
         key_RIGHT(); 
         return 0; 
       } 
       return 0; 
} 
} 

및 key_RIGHT :

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) 
{ 
    bool quit = false; 
    MSG msg; 

    createWindow(hinstance, SCRW, SCRH, SCRD, WINDOWED); 

    // Main loop 
    while (!quit) 
    {  
     if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) 
     { 
      if (msg.message == WM_QUIT) 
       quit = true; 

      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     renderFrame();  // processes graphics 
     SwapBuffers(hdc); 
    } 
    return msg.lParam; 
} 

및 WinProc (많은 경우하지만 같은 일 ... 있었다) 표준 Windows 기능을 다루고 있다고 생각합니다. Windows는 키가 표시되지 않을 때 반복 키 입력 이벤트가 발생하기 전에 보통 지연됩니다.

다른 방법에 대해서는 잘 모르지만 첫 번째 키를 누르면 몇 밀리 초마다 키가 표시되지 않는지 확인한 다음 그에 따라 코드를 처리하는 타이머를 활성화 할 수 있습니다.

나는 그것이 당신이 가진 문제를 해결할 것이라고 생각합니다.

관련 문제