[WIN-Konsole] Tastendruck wird doppelt erkannt



  • Ich will über WINAPI-Funktionen erkennen, ob eine Taste gedrückt wurde. Dies funktioniert auch wunderbar, nur erkennt der folgende Beispielcode beim Drücken einer Taste zwei Events...

    Der Code guckt, ob im Eingabebuffer was steht und überprüft in diesem Fall, ob eine Tastatureingabe erfolgte. Ist dies der Fall wird die gedrückte Taste aus dem Eingabebuffer geholt und ausgegeben. ReadConsoleInput sollte dann auch die Eingabe aus dem Eingabebuffer löschen und da nur eine Taste gedrückt wurde, sollte GetNumberOfConsoleInputEvents danach keine Eingabeereignisse mehr erkennen. Tut es aber doch 😮

    Weiß einer woran das liegen könnte? Testsystem ist Windows 2000.
    Hier ein Beispielcode:

    #include <iostream>
    #include <windows.h>
    
    bool isEvent ( void );
    bool isKeyEvent ( void );
    
    int main ( void )
    {
        do
        {
            if ( isEvent() )
            {
                if ( isKeyEvent() )
                {
                    INPUT_RECORD ir;
                    DWORD NumberOfEventsRead = 0;
                    ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&ir,1,&NumberOfEventsRead);
                    std::cout << ir.Event.KeyEvent.uChar.AsciiChar;
                }
                else
                    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
            }
        }while(1);
    }
    
    bool isEvent ( void )
    {
        DWORD NumberOfEvents = 0;
        GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE),&NumberOfEvents);
    
        if ( NumberOfEvents )
            return true;
        return false;
    }
    
    bool isKeyEvent ( void )
    {
        INPUT_RECORD ir;
        DWORD NumberOfEvents = 0;
    
        PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE),&ir,1,&NumberOfEvents);
    
        if ( ir.EventType == KEY_EVENT )
            return true;
        return false;
    }
    


  • Afaik kriegst du bei ReadConsoleInput() einmal das Drücken und einmal das Loslassen geschickt...bin mir jetzt aber nicht sicher.

    MfG SideWinder



  • doch. genau das wars.

    INPUT_RECORD.Event.KeyEvent.bKeyDown ist true beim drücken einer taste und false beim loslassen der taste.

    thx 🙂


Anmelden zum Antworten