c ++ - Tastaturindgang tøven, når den holdes nede?

Indlæg af Hanne Mølgaard Plasc

Problem



Ved der nogen, hvorfor der er nogen tøven, når du holder nede en tastatur nøgle og forsøger at behandle det? Jeg kalder en funktion lige i min WinProc (...), der vil flytte et billede på skærmen (OpenGL), når en nøgle holdes nede. Jeg trykker på den og får et enkelt svar, så er der omkring .5 sekunder af intet, så opfører det sig som normalt (flytter 1 pixel hver WinMain-loop).


Jeg undrer mig over, om Windows-meddelelserne bliver forsinket på en eller anden måde på grund af nogle funktioner, jeg skal deaktivere ???


Her er min kode:


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


og WinProc (der var flere tilfælde men samme ting ...):


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


og key\_RIGHT:


void key\_RIGHT()
{
    MoveObjectRight1Pixel();
}

Bedste reference


Det er en ret standard tastaturindstilling for at have en lille forsinkelse mellem, hvornår nøglen blev trykket, og når gentagne meddelelser genereres.


I stedet for at behandle tastaturindtastning i din Windows-meddelelseshåndterer, kan du i stedet beholde en række 256 bits, der angiver tastaturets aktuelle tilstand. Når du modtager en WM\_KEYDOWN eller WM\_KEYUP, opdaterer du den bit af den tilsvarende tast. Derefter kontrollerer du i hovedlinjen den aktuelle tilstand af nøglen og den tidligere tilstand af nøglen (ved at holde et andet array på 256 bits, som du laver en kopi til hver ramme).


Hvis nøglen for øjeblikket er nede, men ikke var nede i den foregående ramme, flytter du dit objekt i overensstemmelse hermed.


Et andet alternativ er at bruge funktionen GetAsyncKeyState(). [7]

Andre referencer 1


Nå, jeg tror, ​​at du har at gøre med en standard Windows-funktion her. Windows har normalt en forsinkelse, før den brænder de repititive tastetrydsbegivenheder, når thekey er undertrykt.


Jeg ved ikke om andre metoder, men i den første tastetryk kan du aktivere en timer, der kontrollerer om nøglen undertrykkes hvert par millisekunder og derefter behandler din kode i overensstemmelse hermed.


Det tror jeg ville løse det problem, du har.