Tastendruck in der Windows-Konsole abrufen

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer1806687

ich fand dieses Stück Code online:

CHAR getch() {
    DWORD mode, cc;
    HANDLE h = GetStdHandle( STD_INPUT_HANDLE );

    if (h == NULL) {
        return 0; // console not found
    }

    GetConsoleMode( h, &mode );
    SetConsoleMode( h, mode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT) );
    TCHAR c = 0;
    ReadConsole( h, &c, 1, &cc, NULL );
    SetConsoleMode( h, mode );
    return c;
}

Verwenden Sie es wie:

while(1) {
    TCHAR key = getch();
}

Ich bin in der Lage, numerische, alphabetische und sogar Return-Tastendrücke zu erhalten. Aber ich bin nicht in der Lage, Escape oder andere Funktionstasten wie Strg, Alt zu bekommen. Ist es möglich, es zu ändern, um auch diese Schlüssel zu erkennen?

Wenn Dinge wie Strg- und Alt-Tasten, dies virtuelle Tastenanschläge sind, sind sie Ergänzungen zu Zeichen. Sie müssen verwenden ReadConsoleInput. Aber Sie werden alles bekommen, die Maus auch. Sie müssen also wirklich eine Struktur aus dem Aufruf filtern und zurückgeben, damit Sie wissen, ob es sich um Strg-A Alt-A handelt. Filtern Sie Wiederholungen, wenn Sie sie nicht möchten.

Dies kann Arbeit erfordern, weiß nicht, was Sie suchen …

bool getconchar( KEY_EVENT_RECORD& krec )
{
    DWORD cc;
    INPUT_RECORD irec;
    HANDLE h = GetStdHandle( STD_INPUT_HANDLE );

    if (h == NULL)
    {
        return false; // console not found
    }

    for( ; ; )
    {
        ReadConsoleInput( h, &irec, 1, &cc );
        if( irec.EventType == KEY_EVENT
            &&  ((KEY_EVENT_RECORD&)irec.Event).bKeyDown
            )//&& ! ((KEY_EVENT_RECORD&)irec.Event).wRepeatCount )
        {
            krec= (KEY_EVENT_RECORD&)irec.Event;
            return true;
        }
    }
    return false; //future ????
}

int main( )
{
    KEY_EVENT_RECORD key;
    for( ; ; )
    {
        getconchar( key );
        std::cout << "key: " << key.uChar.AsciiChar
            << " code:  " << key.wVirtualKeyCode << std::endl;
    }
}

ReadConsoleInput-Funktion

INPUT_RECORD-Struktur

KEY_EVENT_RECORD-Struktur

Virtuelle Schlüsselcodes

Benutzer-Avatar
Stig Rosenlund

Der folgende Code erfasst jeden Tastendruck. Es wird verwendet, um von einer Funktion zurückzukehren.

Dokumentation:

https://docs.microsoft.com/en-us/windows/console/readconsoleinput?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/windows/console/input-record-str?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/windows/console/key-event-record-str?redirectedfrom=MSDN

Zweck Die Funktion führt einige Berechnungen durch, deren Fortschritt dem Benutzer auf der Konsole angezeigt wird. Wenn alles fertig ist, möchte der Benutzer von der Funktion zurückkehren. Sie tut das, indem sie eine beliebige Taste drückt. In allen meinen anderen Anwendungen kann der Benutzer mit der Esc-Taste zurückkehren, also ist es schön, dass das auch hier funktioniert.

Es funktioniert, indem es die Konsole zuweist und Handles für die Ausgabe von und die Eingabe in die Konsole setzt. Flags OKflg_out und OKflg_in werden gesetzt, um die Operationen am Ende zu verifizieren. Die for (; ;)-Schleife nach der Meldung „Press any key.“ an den Benutzer endet, wenn der Benutzer eine Taste drückt.

Der numerische Code für die gedrückte Taste ist (((irec.Event).KeyEvent).uChar).AsciiChar, wird hier aber nicht verwendet. Es könnte natürlich als Rückgabecode verwendet werden, um die folgenden Aktionen in der aufrufenden Funktion festzulegen.

#include <windows.h>
// Various other includes.
void wrintf0(HANDLE stdOut, unsigned char *message)
{
    DWORD written=0;
    WriteConsoleA(stdOut, message, strleni(message), &written, NULL);
}
#define wrintf(message) wrintf0(stdOut,message)
// Various code lines.
void Myfunction(void)
{
    unsigned char OKflg_in=0,OKflg_out=0;
    HANDLE stdIn,stdOut;
    // Various code lines.
    AllocConsole();
    stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (stdOut != NULL && stdOut != INVALID_HANDLE_VALUE)
    {
        OKflg_out = 1;
        stdIn = GetStdHandle(STD_INPUT_HANDLE);
        if (stdIn != NULL && stdIn != INVALID_HANDLE_VALUE) OKflg_in = 1;
    }
    // Various code lines.
    if (OKflg_out)
    {
        if (OKflg_in)
        {
          DWORD cc;
          INPUT_RECORD irec;
          wrintf("Press any key.");
          for(; ;) {
              ReadConsoleInput(stdIn, &irec, 1, &cc );
              if (irec.EventType == KEY_EVENT && ((irec.Event).KeyEvent).bKeyDown) break;
          }
          CloseHandle(stdIn);
        }
        CloseHandle(stdOut);
    }
    FreeConsole();
    return;
}

  • Eine Nur-Code-Antwort ist nicht von hoher Qualität. Obwohl dieser Code nützlich sein kann, können Sie ihn verbessern, indem Sie sagen, warum er funktioniert, wie er funktioniert, wann er verwendet werden sollte und welche Einschränkungen er hat. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung und einen Link zu relevanter Dokumentation einzufügen.

    – Muhammad Mohsin Khan

    3. April um 22:36 Uhr

Sie haben viele Möglichkeiten, die Tastatureingaben zu erhalten

Sie können GetAsyncKeyState verwenden https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646293(v=vs.85).aspx
oder GetKeyState https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646301.aspx

die weitaus besser sind als Getch

  • Diese sind für GUI-Anwendungen, nicht für Konsolenanwendungen. Die Ergebnisse, die Sie erhalten werden, werden nicht mit dem Status des Konsoleneingabepuffers synchronisiert.

    – Matteo Italien

    18. Dezember 2016 um 21:55 Uhr

  • Sie werden Zeichen erhalten, Sie werden sie nicht mit den Konsoleneingabefunktionen, Win32 stdin und CRT stdin (und mit GetAsyncKeyState Sie werden sie nicht einmal mit der Eingabewarteschlange des Threads synchronisieren). Dies hat subtile Implikationen, also sollten Sie dieses Zeug vermeiden, es sei denn, Sie verstehen es vollständig.

    – Matteo Italien

    12. Januar 2017 um 16:29 Uhr


1012660cookie-checkTastendruck in der Windows-Konsole abrufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy