Konsolens indatabuffert

Varje konsol har en indatabuffert som innehåller en kö med indatahändelseposter. När en konsols fönster har tangentbordsfokus formaterar en konsol varje indatahändelse (till exempel en enda tangenttryckning, en rörelse av musen eller ett musklick) som en indatapost som placeras i konsolens indatabuffert.

Program kan komma åt en konsols indatabuffert indirekt med hjälp av konsol-I/O-funktionerna på hög nivå, eller direkt med hjälp av indatafunktionerna för konsolen på låg nivå. Indatafunktionerna på hög nivå filtrerar och bearbetar data i indatabufferten och returnerar endast en ström med indatatecken. Med indatafunktioner på låg nivå kan program läsa indataposter direkt från en konsols indatabuffert eller placera indataposter i indatabufferten. Om du vill öppna en referens till en konsols indatabuffert anger du CONIN$ -värdet i ett anrop till funktionen CreateFile .

En indatapost är en struktur som innehåller information om vilken typ av händelse som inträffade (tangentbord, mus, storleksändring av fönster, fokus eller menyhändelse) samt specifik information om händelsen. EventType-medlemmen i en INPUT_RECORD struktur anger vilken typ av händelse som finns i posten.

Fokus- och menyhändelser placeras i en konsols indatabuffert för internt bruk av systemet och bör ignoreras av program.

Tangentbordshändelser

Tangentbordshändelser genereras när någon tangent trycks eller släpps. detta inkluderar kontrollnycklar. ALT-tangenten har dock särskild betydelse för systemet när den trycks och släpps utan att kombineras med ett annat tecken, och den skickas inte vidare till programmet. Dessutom skickas inte tangentkombinationen CTRL+C genom om indatahandtaget är i bearbetat läge.

Om indatahändelsen är en tangenttryckning är händelsemedlemmen i INPUT_RECORD en KEY_EVENT_RECORD struktur som innehåller följande information:

  • Ett booleskt värde som anger om nyckeln trycktes eller släpptes.
  • Ett upprepningsantal som kan vara större än ett när en nyckel hålls nere.
  • Den virtuella nyckelkoden som identifierar den angivna nyckeln på ett enhetsoberoende sätt.
  • Den virtuella genomsökningskoden som anger det enhetsberoende värde som genereras av tangentbordsmaskinvaran.
  • Det översatta Unicode™- eller ANSI-tecknet.
  • En flaggvariabel som anger tillståndet för kontrollnycklarna (tangenterna ALT, CTRL, SKIFT, NUM LOCK, SCROLL LOCK och CAPS LOCK) och som anger om en utökad nyckel trycktes ned. Förbättrade nycklar för IBM-tangentborden® 101-tangenter och 102-tangenter är INS-, DEL-, HOME-, END-, PAGE UP-, PAGE DOWN- och piltangenterna i klustren till vänster om det numeriska knappsatsen och dividera (/) och RETUR-tangenterna i det numeriska knappsatsen.

Mus-händelser

Mushändelser genereras när användaren flyttar musen eller trycker eller släpper en av musknapparna. Mushändelser placeras endast i indatabufferten om följande villkor uppfylls:

  • Konsolens indataläge är inställt på ENABLE_MOUSE_INPUT (standardläget).
  • Konsolfönstret har tangentbordsfokus.
  • Muspekaren ligger inom ramen för konsolens fönster.

Om indatahändelsen är en mushändelse är händelsemedlemmen i INPUT_RECORD en MOUSE_EVENT_RECORD struktur som innehåller följande information:

  • Koordinaterna för muspekaren när det gäller raden och kolumnen teckencell i konsolskärmsbuffertens koordinatsystem.
  • En flaggvariabel som anger musknapparnas tillstånd.
  • En flaggvariabel som anger tillståndet för kontrollnycklarna (ALT, CTRL, SKIFT, NUM LOCK, SCROLL LOCK och CAPS LOCK) och som anger om en förbättrad nyckel trycktes ned. Förbättrade nycklar för IBM-tangentborden 101-tangenter och 102-tangenter är INS-, DEL-, HOME-, END-, PAGE UP-, PAGE DOWN- och piltangenterna i klustren till vänster om det numeriska knappsatsen och dividera (/) och RETUR-tangenterna i det numeriska knappsatsen.
  • En flaggvariabel som anger om händelsen var en normal händelse för knapptryckning eller knapputgivning, en händelse för musrörelse eller det andra klicket på en dubbelklickshändelse.

Anmärkning

Koordinaterna för muspositionen gäller konsolskärmsbufferten, inte konsolfönstret. Skärmbufferten kan ha rullats med avseende på fönstret, så det övre vänstra hörnet i fönstret är inte nödvändigtvis koordinaten (0,0) för konsolskärmsbufferten. Om du vill fastställa koordinaterna för musen i förhållande till fönstrets koordinatsystem subtraherar du koordinaterna för fönstrets ursprung från muspositionskoordinaterna. Använd funktionen GetConsoleScreenBufferInfo för att fastställa koordinaterna för fönstrets ursprung.

DwButtonState-medlemmen i MOUSE_EVENT_RECORD-strukturen har en bit som motsvarar varje musknapp. Biten är 1 om knappen är nere och 0 om knappen är uppe. En knapputgivningshändelse identifieras med ett 0-värde för dwEventFlags-medlemmen i MOUSE_EVENT_RECORD och en ändring i en knapps bit från 1 till 0. Funktionen GetNumberOfConsoleMouseButtons hämtar antalet knappar på musen.

Buffer-Resizing händelser

Med en konsolfönstermeny kan användaren ändra storleken på den aktiva skärmbufferten. den här ändringen genererar en buffertändringshändelse. Buffertändringshändelser placeras i indatabufferten om konsolens indataläge är inställt på ENABLE_WINDOW_INPUT (det vill:s standardläget är inaktiverat).

Om indatahändelsen är en buffertändringshändelse är händelsemedlemmen i INPUT_RECORD en WINDOW_BUFFER_SIZE_RECORD struktur som innehåller den nya storleken på konsolskärmsbufferten, uttryckt i kolumner och rader i teckencellen.

Om användaren minskar storleken på konsolskärmsbufferten går alla data i den borttagna delen av bufferten förlorade.

Ändringar i konsolens skärmbuffertstorlek som ett resultat av programanrop till funktionen SetConsoleScreenBufferSize genereras inte som buffertändringshändelser.