Mémoire tampon d’entrée d’une 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. Lorsque la fenêtre d'une console a le focus de clavier, la console formate chaque événement d'entrée (comme une simple touche, un mouvement de souris ou un clic sur le bouton de souris) en tant qu'enregistrement d'entrée qu'elle 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 renvoyant 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 le descripteur vers la mémoire tampon d’entrée de la 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 de clavier
Les événements de clavier sont générés lorsqu'une touche est appuyée ou relâchée, y compris les touches 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 descripteur d’entrée est en mode traité.
Si l’événement d’entrée est une touche, le membre Event dans INPUT_RECORD est une structure KEY_EVENT_RECORD contenant les informations suivantes :
- Une valeur booléenne indiquant si la touche a été enfoncée ou libérée.
- Une valeur de répétition pouvant être supérieure à un lorsqu’une touche est conservée en panne.
- Le code de touche virtuelle, identifiant la touche donnée de manière indépendante de l’appareil.
- Le code de la touche virtuelle appuyée, indiquant la valeur dépendante de l’appareil générée par le matériel du clavier.
- Le caractère Unicode™ ou ANSI traduit.
- Une variable d’indicateur précisant l'état des touches de contrôle (ALT, CTRL, SHIFT, Verr. pavé num., verr. roulette, et Verr. maj) et indiquant si une touche améliorée a été appuyée. Les touches améliorées pour les claviers IBM® 101 et 102 sont les touches INS, Suppr, Accueil, Arrêter, Page précédente, Page suivante et les touches de direction dans les groupements à gauche du pavé numérique ainsi que les touches de division (/) et la touche 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 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 de 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 Event dans INPUT_RECORD est une structure MOUSE_EVENT_RECORD contenant les informations suivantes :
- Les 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 la console.
- Une variable d’indicateur précisant l’état des boutons de souris.
- Une variable d’indicateur précisant l'état des touches de contrôle (ALT, CTRL, SHIFT, Verr. pavé num., verr. roulette, et Verr. maj) et indiquant si une touche améliorée a été appuyée. Les touches améliorées pour les claviers IBM 101 et 102 sont les touches INS, Suppr, Accueil, Arrêter, Page précédente, Page suivante et les touches de direction dans les groupements à gauche du pavé numérique ainsi que les touches de division (/) et la touche ENTRÉE dans le pavé numérique.
- Une variable indicateur indiquant si l'événement était une pression ou un relâchement de bouton normal, un mouvement de souris ou le second clic d'un double-clic.
Remarque
Les coordonnées de la position de la souris correspondent à la mémoire tampon de l'écran de la console, et non à la fenêtre de la console. La mémoire tampon de l'écran peut avoir été déplacée par rapport à la fenêtre, de sorte que 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 possède un bit correspondant à chaque bouton de la souris. Le bit est 1 si le bouton est enfoncé et 0 si le bouton est relâché. Un événement de relâchement de bouton est détecté par une valeur 0 pour le membre dwEventFlags de la structure MOUSE_EVENT_RECORD et un changement du bit d'un bouton est détecté par une valeur comprise entre 1 et 0. La fonction GetNumberOfConsoleMouseButtons récupère le nombre de boutons sur la souris.
Événements de redimensionnement des mémoires tampons
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 la mémoire tampon, le membre Event 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 contenues dans la partie rejeté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.