Partager via


Mémoire tampon d’entrée de la console

Chaque console a une mémoire tampon d’entrée qui contient une file d’attente d’enregistrements d’événements d’entrée. Quand la fenêtre d’une console a le focus clavier, une console met en forme chaque événement d’entrée (par exemple, une seule séquence de touches, un mouvement de la souris ou un clic de bouton de la souris) en tant qu’enregistrement d’entrée qu’il place dans la mémoire tampon d’entrée de la console.

Les applications peuvent accéder indirectement à la mémoire tampon d’entrée d’une console à l’aide des fonctions d’E/S de console de haut niveau, ou directement à l’aide des fonctions d’entrée de console de bas niveau. Les fonctions d’entrée de haut niveau filtrent et traitent les données dans la mémoire tampon d’entrée, en retournant uniquement un flux de caractères d’entrée. Les fonctions d’entrée de bas niveau permettent aux applications de lire des enregistrements d’entrée directement à partir de la mémoire tampon d’entrée d’une console ou de placer des enregistrements d’entrée dans la mémoire tampon d’entrée. Pour ouvrir un handle dans la mémoire tampon d’entrée d’une console, spécifiez la valeur CONIN$ dans un appel à la fonction CreateFile .

Un enregistrement d’entrée est une structure contenant des informations sur le type d’événement qui s’est produit (clavier, souris, redimensionnement de fenêtre, focus ou événement de menu) ainsi que des détails spécifiques sur l’événement. Le membre EventType d’une structure INPUT_RECORD indique le type d’événement contenu dans l’enregistrement.

Les événements de focus et de menu sont placés dans la mémoire tampon d’entrée d’une console pour une utilisation interne par le système et doivent être ignorés par les applications.

Événements clavier

Les événements clavier sont générés quand une touche est enfoncée ou libérée ; cela inclut les clés de contrôle. Toutefois, la touche ALT a une signification particulière pour le système lorsqu’elle est enfoncée et libérée sans être combinée avec un autre caractère, et elle n’est pas transmise à l’application. En outre, la combinaison de touches Ctrl+C n’est pas transmise si le handle d’entrée est en mode traité.

Si l’événement d’entrée est une séquence de touches, le membre d’événement dans INPUT_RECORD est une structure KEY_EVENT_RECORD contenant les informations suivantes :

  • Valeur booléenne indiquant si la touche a été enfoncée ou libérée.
  • Nombre de répétitions pouvant être supérieur à un lorsqu’une clé est conservée en panne.
  • Code de clé virtuelle, identifiant la clé donnée de manière indépendante de l’appareil.
  • Code d’analyse virtuelle, indiquant la valeur dépendante de l’appareil générée par le matériel clavier.
  • Caractère Unicode™ ou ANSI traduit.
  • Variable d’indicateur indiquant l’état des touches de contrôle (alt, ctrl, maj, verrouillage num, verrouillage de défilement et touches de verrouillage CAPS) et indiquant si une touche améliorée a été enfoncée. Les touches améliorées pour les claviers IBM® 101 touches et 102 touches sont les touches INS, DEL, HOME, END, PAGE UP, PAGE DOWN et flèches dans les clusters à gauche du pavé numérique et les touches de division (/) et entrée dans le pavé numérique.

Événements de souris

Les événements de souris sont générés chaque fois que l’utilisateur déplace la souris ou appuie ou relâche l’un des boutons de la souris. Les événements de souris sont placés dans la mémoire tampon d’entrée uniquement si les conditions suivantes sont remplies :

  • Le mode d’entrée de la console est défini sur ENABLE_MOUSE_INPUT (mode par défaut).
  • La fenêtre de console a le focus clavier.
  • Le pointeur de la souris se trouve dans les bordures de la fenêtre de la console.

Si l’événement d’entrée est un événement de souris, le membre d’événement dans INPUT_RECORD est une structure MOUSE_EVENT_RECORD contenant les informations suivantes :

  • Coordonnées du pointeur de la souris en termes de ligne et de colonne de cellule de caractère dans le système de coordonnées de la mémoire tampon de l’écran de console.
  • Variable d’indicateur indiquant l’état des boutons de la souris.
  • Variable d’indicateur indiquant l’état des touches de contrôle (Alt, Ctrl, Maj, NUM LOCK, SCROLL LOCK et CAPS LOCK) et indiquant si une touche améliorée a été enfoncée. Les touches améliorées pour les claviers IBM 101 touches et 102 touches sont les touches INS, DEL, HOME, END, PAGE UP, PAGE DOWN et flèches dans les clusters à gauche du pavé numérique et les touches de division (/) et entrée dans le pavé numérique.
  • Variable d’indicateur indiquant si l’événement était un événement normal d’appui sur bouton ou de mise en production de bouton, d’un événement de déplacement de la souris ou du deuxième clic d’un événement en double-clic.

Remarque

Les coordonnées de position de la souris sont en termes de mémoire tampon d’écran de la console, et non de la fenêtre de console. La mémoire tampon d’écran a peut-être été défilement par rapport à la fenêtre. Par conséquent, le coin supérieur gauche de la fenêtre n’est pas nécessairement la coordonnée (0,0) de la mémoire tampon de l’écran de la console. Pour déterminer les coordonnées de la souris par rapport au système de coordonnées de la fenêtre, soustrayez les coordonnées d’origine de la fenêtre des coordonnées de position de la souris. Utilisez la fonction GetConsoleScreenBufferInfo pour déterminer les coordonnées d’origine de la fenêtre.

Le membre dwButtonState de la structure MOUSE_EVENT_RECORD a un bit correspondant à chaque bouton de la souris. Le bit est 1 si le bouton est enfoncé et 0 si le bouton est haut. Un événement de mise en production de bouton est détecté par une valeur de 0 pour le membre dwEventFlags de MOUSE_EVENT_RECORD et une modification du bit d’un bouton de 1 à 0. La fonction GetNumberOfConsoleMouseButtons récupère le nombre de boutons sur la souris.

événements Buffer-Resizing

Le menu d’une fenêtre de console permet à l’utilisateur de modifier la taille de la mémoire tampon d’écran active ; cette modification génère un événement de redimensionnement de mémoire tampon. Les événements de redimensionnement des mémoires tampons sont placés dans la mémoire tampon d’entrée si le mode d’entrée de la console est défini sur ENABLE_WINDOW_INPUT (autrement dit, le mode par défaut est désactivé).

Si l’événement d’entrée est un événement de redimensionnement de mémoire tampon, le membre d’événement de INPUT_RECORD est une structure WINDOW_BUFFER_SIZE_RECORD contenant la nouvelle taille de la mémoire tampon de l’écran de la console, exprimée en colonnes et lignes de cellule de caractères.

Si l’utilisateur réduit la taille de la mémoire tampon de l’écran de la console, toutes les données de la partie ignorée de la mémoire tampon sont perdues.

Les modifications apportées à la taille de la mémoire tampon de l’écran de la console suite aux appels d’application à la fonction SetConsoleScreenBufferSize ne sont pas générées en tant qu’événements de redimensionnement de mémoire tampon.