Konsoleneingabepuffer

Jede Konsole verfügt über einen Eingabepuffer, der eine Warteschlange mit Eingabeereignisdatensätzen enthält. Wenn das Fenster einer Konsole den Tastaturfokus hat, formatiert eine Konsole jedes Eingabeereignis (z. B. einen einzelnen Tastenanschlag, eine Mausbewegung oder einen Mausklick) als Eingabedatensatz, den sie im Eingabepuffer der Konsole platziert.

Anwendungen können indirekt über die I/O-Funktionen der Konsole oder direkt über die Eingabefunktionen der Konsole auf den Eingabepuffer einer Konsole zugreifen. Die Eingabefunktionen auf hoher Ebene filtern und verarbeiten die Daten im Eingabepuffer und geben nur einen Datenstrom von Eingabezeichen zurück. Mit den Eingabefunktionen auf niedriger Ebene können Anwendungen Eingabedatensätze direkt aus dem Eingabepuffer einer Konsole lesen oder Eingabedatensätze in den Eingabepuffer einfügen. Zum Öffnen eines Handles zum aktiven Bildschirmpuffer einer Konsole geben Sie den CONOUT$-Wert in einem Aufruf der Funktion CreateFile an.

Ein Eingabedatensatz ist eine Struktur, die Informationen zum Ereignistyp enthält, die aufgetreten ist (Tastatur, Maus, Fenstergröße, Fokus oder Menüereignis) sowie spezifische Details zum Ereignis. Das EventType-Element in einer INPUT_RECORD-Struktur gibt an, welcher Ereignistyp im Datensatz enthalten ist.

Fokus- und Menüereignisse werden im Eingabepuffer einer Konsole für die interne Verwendung durch das System platziert und sollten von Anwendungen ignoriert werden.

Tastaturereignisse

Tastaturereignisse werden generiert, wenn eine Taste gedrückt oder losgelassen wird; dazu gehören Steuertasten. Die ALT-Taste hat jedoch eine besondere Bedeutung für das System, wenn sie gedrückt und losgelassen wird, ohne mit einem anderen Zeichen kombiniert zu werden, und sie wird nicht an die Anwendung übergeben. Außerdem wird die TASTENkombination STRG+C nicht durchlaufen, wenn sich der Eingabepunkt im verarbeiteten Modus befindet.

Wenn das Eingabeereignis ein Tastenanschlag ist, ist das Ereigniselement in INPUT_RECORD eine KEY_EVENT_RECORD Struktur, die die folgenden Informationen enthält:

  • Ein boolescher Wert, der angibt, ob die Taste gedrückt oder losgelassen wurde.
  • Eine Wiederholungsanzahl, die größer als eine sein kann, wenn eine Taste gedrückt gehalten wird.
  • Der virtuelle Schlüsselcode, der den angegebenen Schlüssel auf geräteunabhängige Weise identifiziert.
  • Der virtuelle Scancode, der den geräteabhängigen Wert angibt, der von der Tastaturhardware generiert wird.
  • Das übersetzte Unicode- oder ANSI-Zeichen™.
  • Eine Flagvariable, die den Status der Steuertasten angibt (ALT, STRG, UMSCHALT, NUM-TASTE, SCROLL-TASTE und FESTSTELLTASTE) und gibt an, ob eine erweiterte Taste gedrückt wurde. Erweiterte Tasten für die IBM® 101-Taste und 102-Tastentastaturen sind die INS-, DEL-, HOME-, ENDE-, BILD-AUF-, BILD-NACH-UNTEN- und Pfeiltasten in den Clustern links neben der Zehnertastatur und die Trenntaste (/) und die EINGABETASTE auf der Zehnertastatur.

Mausereignisse

Mausereignisse werden generiert, wenn der Benutzer die Maus bewegt oder eine der Maustasten drückt oder loslässt. Mausereignisse werden nur dann im Eingabepuffer platziert, wenn die folgenden Bedingungen erfüllt sind:

  • Der Konsoleneingabemodus ist auf ENABLE_MOUSE_INPUT (Standardmodus) festgelegt.
  • Das Konsolenfenster hat den Tastaturfokus.
  • Der Mauszeiger befindet sich innerhalb der Rahmen des Konsolenfensters.

Wenn das Eingabeereignis ein Mausereignis ist, ist das Ereigniselement in INPUT_RECORD eine MOUSE_EVENT_RECORD Struktur, die die folgenden Informationen enthält:

  • Die Koordinaten des Mauszeigers im Hinblick auf die Zeichenzellenzeile und -spalte im Koordinatensystem des Konsolenbildschirmpuffers.
  • Eine Flagvariable, die den Status der Maustasten angibt.
  • Eine Flagvariable, die den Status der Steuertasten angibt (ALT, STRG, UMSCHALT, NUM LOCK, SCROLL LOCK und FESTSTELLTASTE), und gibt an, ob eine erweiterte Taste gedrückt wurde. Erweiterte Tasten für die IBM 101-Taste und 102-Tastentastaturen sind die INS-, DEL-, HOME-, ENDE-, BILD-AUF-, BILD-NACH-UNTEN- und Pfeiltasten in den Clustern links neben der Zehnertastatur und die Trenntaste (/) und die EINGABETASTE auf der Zehnertastatur.
  • Eine Flagvariable, die angibt, ob es sich bei dem Ereignis um ein normales Ereignis zum Drücken oder Loslassen einer Schaltfläche, ein Mausbewegungsereignis oder den zweiten Klick eines Doppelklickereignisses handelt.

Hinweis

Die Mauspositionskoordinaten beziehen sich auf den Konsolenbildschirmpuffer, nicht auf das Konsolenfenster. Möglicherweise wurde der Bildschirmpuffer im Hinblick auf das Fenster gescrollt, sodass die obere linke Ecke des Fensters nicht unbedingt die Koordinate (0,0) des Konsolenbildschirmpuffers ist. Um die Koordinaten der Maus relativ zum Koordinatensystem des Fensters zu bestimmen, subtrahieren Sie die Fensterursprungkoordinaten von den Mauspositionskoordinaten. Verwenden Sie die GetConsoleScreenBufferInfo-Funktion , um die Fensterursprungkoordinaten zu bestimmen.

Das dwButtonState-Element der MOUSE_EVENT_RECORD-Struktur weist ein bisschen die entsprechenden Maustasten auf. Das Bit ist 1, wenn die Schaltfläche nach unten und 0 ist, wenn die Schaltfläche nach oben ist. Ein Button-Release-Ereignis wird durch einen Wert von 0 für das dwEventFlags-Element von MOUSE_EVENT_RECORD und eine Änderung des Bits einer Schaltfläche von 1 bis 0 erkannt. Die GetNumberOfConsoleMouseButtons-Funktion ruft die Anzahl der Schaltflächen auf der Maus ab.

Puffer-Größenänderungsereignisse

Mit dem Menü eines Konsolenfensters kann der Benutzer die Größe des aktiven Bildschirmpuffers ändern. diese Änderung generiert ein Ereignis zum Ändern der Größe eines Puffers. Ereignisse zum Ändern der Größe von Puffern werden im Eingabepuffer platziert, wenn der Eingabemodus der Konsole auf ENABLE_WINDOW_INPUT festgelegt ist (d. a. der Standardmodus ist deaktiviert).

Wenn es sich bei dem Eingabeereignis um ein Ereignis zum Ändern der Größe eines Puffers handelt, ist das Ereigniselement von INPUT_RECORD eine WINDOW_BUFFER_SIZE_RECORD Struktur, die die neue Größe des Konsolenbildschirmpuffers enthält, ausgedrückt in Spalten und Zeilen in Zeichenzellen.

Wenn der Benutzer die Größe des Konsolenbildschirmpuffers reduziert, gehen alle Daten im nicht Karte teil des Puffers verloren.

Änderungen an der Größe des Konsolenbildschirmpuffers als Ergebnis von Anwendungsaufrufen an die SetConsoleScreenBufferSize-Funktion werden nicht als Pufferänderungsereignisse generiert.