c - Ingen konsol nøgle op begivenhed, mens skift tasten trykkes

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et stykke kode, der læser en nøglehændelse fra konsollen ved hjælp af ReadConsoleInput-funktionen. Det virker mest, bortset fra at det ikke læses, når en knap frigives, mens skifttasten trykkes.


Jeg skrev den mest minimale eksempelkode jeg kunne. Hvad det gør lige nu, læser om 'a' tasten trykkes eller ej, og viser den til skærmen. Hvis du kører det og trykker på 'a' får du


41[down]
41[up]


hvis du kører det og holder nede skiftetasten før du trykker på 'a', er alt du får er


41[down]


og du vil ikke få en nøgle op begivenhed, indtil du frigiver skift nøglen og trykke på 'a' igen.


Her er min kode:


#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include <Tchar.h>

int main()
{
    HANDLE rhnd = GetStdHandle(STD\_INPUT\_HANDLE);

    while(1)
    {

        INPUT\_RECORD buf[128];
        DWORD Events = 0;
        DWORD EventsRead = 0;

        GetNumberOfConsoleInputEvents(rhnd, &Events);
        if(Events == 0)continue;
        int i;
        for(i=0;i<sizeof(buf);++i)//clear buf in case ReadConsoleInput doesn't do it for me, probably unnecessary
            ((char *)buf)[i]=0;
        ReadConsoleInput(rhnd, buf, 128, &(EventsRead));
        for(i=0;i<128;++i)//I would just loop while i<EventsRead but this ensures there are not extra elements (a little paranoid, I know)
        {
            if(buf[i].EventType == KEY\_EVENT && (buf[i].Event.KeyEvent.wVirtualKeyCode & 0xff) == 0x41 /*keycode for 'a' button -- you can remove this condition to see the results for all key presses*/)
            {
                printf("\%x",buf[i].Event.KeyEvent.wVirtualKeyCode);
                if(buf[i].Event.KeyEvent.bKeyDown)
                {
                    printf("[down]
");
                }
                else //if this else gets executed it's what I'm calling a key up event
                    //this conditional should only be reached if either 'a' is pressed or 'a' was just released
                   //and the else should only be executed if it was just released
                {
                    printf("[up]
");
                }
            }
        }
    }
}


Eventuelle ideer om, hvorfor dette sker, og hvordan man løser det


Kompileret på Windows 10 ved hjælp af gcc (MinGW-64) og også ved hjælp af Visual Studio 15

Bedste reference