2009-04-07 23 views
1

Weiß jemand, warum gibt es ein Zögern, wenn Sie eine Tastaturtaste gedrückt halten und versuchen, sie zu verarbeiten? Ich rufe eine Funktion in meinem WinProc (...) auf, die ein Bild auf dem Bildschirm (OpenGL) verschiebt, wenn eine Taste gedrückt gehalten wird. Ich drücke es und bekomme eine einzige Antwort, dann gibt es etwa 0,5 Sekunden nichts, dann verhält es sich wie normal (bewegt sich 1 Pixel pro WinMain-Schleife).Tastatureingabe zögert, wenn gedrückt?

Ich frage mich, ob die Windows-Nachrichten irgendwie wegen einer Funktion verzögert werden, die ich deaktivieren muss ???

Hier ist mein Code:

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; 
} 

und WinProc (gab es mehr Fälle aber gleiche ...):

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; 
} 
} 

und key_RIGHT:

void key_RIGHT() 
{ 
    MoveObjectRight1Pixel(); 
} 

Antwort

3

Es ist eine Standard-Tastatureinstellung, eine kleine Verzögerung zwischen dem Drücken der Taste und dem Erzeugen von Wiederholungsmeldungen zu haben.

Anstatt die Tastatureingabe in Ihrem Windows-Meldungshandler zu verarbeiten, können Sie stattdessen ein Array von 256 Bits beibehalten, die den aktuellen Status der Tastatur anzeigen. Wenn Sie eine WM_KEYDOWN oder WM_KEYUP empfangen, aktualisieren Sie das Bit des entsprechenden Schlüssels. Dann überprüfen Sie in Ihrer Hauptschleife den aktuellen Zustand des Schlüssels und den vorherigen Zustand des Schlüssels (indem Sie ein zweites Array von 256 Bits behalten, die Sie in jeden Rahmen kopieren).

Wenn die Taste momentan nicht gedrückt ist, aber im vorherigen Frame nicht gedrückt war, verschieben Sie Ihr Objekt entsprechend. Eine andere Alternative ist es, die GetAsyncKeyState() Funktion zu verwenden.

+0

Ich hatte Angst, ich müsste eine alberne Problemumgehung machen ... Es gibt keine Möglichkeit, Windows zu zwingen, mir Nachrichten mit einer zivilisierten Rate zu schicken? –

+0

Das ist eine riesige Tastatur. :) Die meisten Standard-PC-Tastaturen haben ungefähr 105 Tasten, daher klingen 128 Bit wie eine Menge für mich. – unwind

+0

@unwind: True, die meisten Tastaturen haben eine vernünftige Anzahl von Schlüsseln, aber die virtuellen Schlüsselcodes (VK_ * Konstanten) reichen von 0 bis 255. –

1

Nun, ich Ich denke, hier handelt es sich um ein Standard-Windows-Feature. Windows hat in der Regel eine Verzögerung, bevor die wiederholten Tastenanschläge ausgelöst werden, wenn der Schlüssel unterdrückt wird.

Ich weiß nichts über andere Methoden, aber beim ersten Tastendruck konnte man einen Timer aktivieren, der alle paar Millisekunden überprüft, ob der Schlüssel unterdrückt ist und dann den Code entsprechend bearbeiten.

Ich denke, das würde das Problem lösen, das Sie haben.