Vue d’ensemble des entrées du clavier
Les applications doivent accepter les entrées utilisateur à partir du clavier, ainsi que de la souris. Une application reçoit une entrée du clavier sous la forme de messages publiés dans ses fenêtres.
Modèle d’entrée du clavier
Le système fournit une prise en charge du clavier indépendant de l’appareil pour les applications en installant un pilote de périphérique de clavier approprié pour le clavier actuel. Le système fournit une prise en charge du clavier indépendant de la langue à l’aide de la disposition de clavier spécifique à la langue actuellement sélectionnée par l’utilisateur ou l’application. Le pilote de périphérique de clavier reçoit des codes d’analyse du clavier, qui sont envoyés à la disposition du clavier où ils sont traduits en messages et publiés dans les fenêtres appropriées de votre application.
Chaque touche d’un clavier est associée à une valeur unique appelée code d’analyse, un identificateur dépendant de l’appareil pour la touche du clavier. Un clavier génère deux codes d’analyse lorsque l’utilisateur tape une touche : l’un lorsque l’utilisateur appuie sur la touche et l’autre lorsque l’utilisateur relâche la touche.
Le pilote de périphérique de clavier interprète un code d’analyse et le traduit (mappe) en code de touche virtuelle, une valeur indépendante de l’appareil définie par le système qui identifie l’objectif d’une clé. Après avoir traduit un code d’analyse, la disposition du clavier crée un message qui inclut le code d’analyse, le code de touche virtuelle et d’autres informations sur la séquence de touche, puis place le message dans la file d’attente des messages système. Le système supprime le message de la file d’attente des messages système et le publie dans la file d’attente des messages du thread approprié. Enfin, la boucle de message du thread supprime le message et le transmet à la procédure de fenêtre appropriée pour le traitement. La figure suivante illustre le modèle d’entrée du clavier.
Focus et activation du clavier
Le système publie des messages clavier dans la file d’attente des messages du thread de premier plan qui a créé la fenêtre avec le focus clavier. Le focus clavier est une propriété temporaire d’une fenêtre. Le système partage le clavier entre toutes les fenêtres de l’écran en déplaçant le focus clavier, selon les instructions de l’utilisateur, d’une fenêtre à l’autre. La fenêtre qui a le focus clavier reçoit (à partir de la file d’attente de messages du thread qui l’a créée) tous les messages clavier jusqu’à ce que le focus passe à une autre fenêtre.
Un thread peut appeler la fonction GetFocus pour déterminer laquelle de ses fenêtres (le cas échéant) a actuellement le focus clavier. Un thread peut donner au clavier le focus sur l’une de ses fenêtres en appelant la fonction SetFocus. Lorsque le focus du clavier passe d’une fenêtre à l’autre, le système envoie un message WM_KILLFOCUS à la fenêtre qui a perdu le focus, puis envoie un message WM_SETFOCUS à la fenêtre qui a obtenu le focus.
Le concept de focus clavier est lié à celui de la fenêtre active. La fenêtre active est la fenêtre de niveau supérieur avec laquelle l’utilisateur travaille actuellement. La fenêtre avec le focus clavier est soit la fenêtre active, soit une fenêtre enfant de la fenêtre active. Pour aider l’utilisateur à identifier la fenêtre active, le système la place en haut de l’ordre Z et met en surbrillance sa barre de titre (le cas échéant) et sa bordure.
L’utilisateur peut activer une fenêtre de niveau supérieur en cliquant dessus, en la sélectionnant à l’aide de la combinaison de touches ALT+TAB ou ALT+Échap, ou en la sélectionnant dans la liste des tâches. Un thread peut activer une fenêtre de niveau supérieur à l’aide de la fonction SetActiveWindow. Il peut déterminer si une fenêtre de niveau supérieur qu’il a créée est active à l’aide de la fonction GetActiveWindow.
Lorsqu’une fenêtre est désactivée et qu’une autre est activée, le système envoie le message WM_ACTIVATE. Le mot d’ordre faible du paramètre wParam est égal à zéro si la fenêtre est désactivée et non nul si elle est activée. Lorsque la procédure de fenêtre par défaut reçoit le message WM_ACTIVATE, elle définit le focus clavier sur la fenêtre active.
Pour empêcher les événements d’entrée du clavier et de la souris d’atteindre les applications, utilisez BlockInput. Notez que la fonction BlockInput n’interfère pas avec la table d’état d’entrée asynchrone du clavier. Cela signifie que l’appel de la fonction SendInput alors que l’entrée est bloquée modifie la table d’état d’entrée asynchrone du clavier.
Messages de frappe
En appuyant sur une touche, un message WM_KEYDOWN ou WM_SYSKEYDOWN est placé dans la file d’attente de messages de thread attachée à la fenêtre qui a le focus clavier. La libération d’une clé entraîne la mise en place d’un message WM_KEYUP ou WM_SYSKEYUP dans la file d’attente.
Les messages d’activation et de désactivation des touches se produisent généralement par paires, mais si l’utilisateur conserve une touche enfoncée suffisamment longtemps pour démarrer la fonctionnalité de répétition automatique du clavier, le système génère un certain nombre de messages WM_KEYDOWN ou WM_SYSKEYDOWN à la suite. Il génère ensuite un seul message WM_KEYUP ou WM_SYSKEYUP lorsque l’utilisateur relâche la touche.
Cette section couvre les sujets suivants :
- Séquences de touches système et non système
- Description des codes de touche virtuelle
- Indicateurs de message de frappe
Séquences de touches système et non système
Le système fait une distinction entre les séquences de touches système et les séquences de touches non système. Les séquences de touches système produisent des messages de frappe système, WM_SYSKEYDOWN et WM_SYSKEYUP. Les séquences de touches non système produisent des messages de frappe non système, WM_KEYDOWN et WM_KEYUP.
Si votre procédure de fenêtre doit traiter un message de frappe système, assurez-vous qu’après avoir traité le message, la procédure le transmet à la fonction DefWindowProc. Sinon, toutes les opérations système impliquant la touche ALT sont désactivées chaque fois que la fenêtre a le focus clavier. Autrement dit, l’utilisateur ne pourra pas accéder aux menus de la fenêtre ou au menu Système, ou utiliser la combinaison ALT+Échap ou ALT+TAB pour activer une autre fenêtre.
Les messages de frappe système sont principalement destinés au système plutôt qu’à une application. Le système les utilise pour fournir son interface clavier intégrée aux menus et pour permettre à l’utilisateur de contrôler la fenêtre active. Les messages de frappe système sont générés lorsque l’utilisateur tape une touche en combinaison avec la touche ALT, ou lorsque l’utilisateur tape et qu’aucune fenêtre n’a le focus clavier (par exemple, lorsque l’application active est réduite). Dans ce cas, les messages sont publiés dans la file d’attente des messages attachée à la fenêtre active.
Les messages de frappe non système sont destinés à être utilisés par les fenêtres d’application ; la fonction DefWindowProc n’en fait rien. Une procédure de fenêtre peut ignorer tous les messages de frappe non système dont elle n’a pas besoin.
Description des codes de touche virtuelle
Le paramètre wParam d’un message de frappe contient le code de touche virtuelle de la touche qui a été enfoncée ou relâchée. Une procédure de fenêtre traite ou ignore un message de frappe, en fonction de la valeur du code de touche virtuelle.
Une procédure de fenêtre classique traite uniquement un petit sous-ensemble des messages de frappe qu’elle reçoit et ignore le reste. Par exemple, une procédure de fenêtre peut traiter uniquement les messages de frappe WM_KEYDOWN et uniquement ceux qui contiennent des codes de touche virtuelle pour les touches de déplacement du curseur, les touches maj (également appelées touches de contrôle) et les touches de fonction. Une procédure de fenêtre classique ne traite pas les messages de frappe à partir de touches de caractères. Au lieu de cela, il utilise la fonction TranslateMessage pour convertir le message en messages de caractères. Pour plus d’informations sur TranslateMessage et les messages de caractères, consultez Messages de caractères.
Indicateurs de message de frappe
Le paramètre lParam d’un message de frappe contient des informations supplémentaires sur la séquence de touches qui a généré le message. Ces informations incluent le nombre de répétitions, le code d’analyse, l’indicateur de touche étendue, le code de contexte, l’indicateur d’état de touche précédente et l’indicateur d’état de transition. L’illustration suivante montre les emplacements de ces indicateurs et valeurs dans le paramètre lParam.
Une application peut utiliser les valeurs suivantes pour obtenir les indicateurs de séquences de touches à partir d’un mot d’ordre élevé du lParam.
Value | Description |
---|---|
KF_EXTENDED 0x0100 |
Manipule l’indicateur de touche étendue. |
KF_DLGMODE 0x0800 |
Manipule l’indicateur de mode de dialogue, qui indique si une boîte de dialogue est active. |
KF_MENUMODE 0x1000 |
Manipule l’indicateur de mode de menu, qui indique si un menu est actif. |
KF_ALTDOWN 0x2000 |
Manipule l’indicateur de code de contexte. |
KF_REPEAT 0x4000 |
Manipule l’indicateur d’état de touche précédente. |
KF_UP 0x8000 |
Manipule l’indicateur d’état de transition. |
Exemple de code :
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
WORD vkCode = LOWORD(wParam); // virtual-key code
WORD keyFlags = HIWORD(lParam);
WORD scanCode = LOBYTE(keyFlags); // scan code
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
if (isExtendedKey)
scanCode = MAKEWORD(scanCode, 0xE0);
BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT; // previous key-state flag, 1 on autorepeat
WORD repeatCount = LOWORD(lParam); // repeat count, > 0 if several keydown messages was combined into one message
BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP; // transition-state flag, 1 on keyup
// if we want to distinguish these keys:
switch (vkCode)
{
case VK_SHIFT: // converts to VK_LSHIFT or VK_RSHIFT
case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
case VK_MENU: // converts to VK_LMENU or VK_RMENU
vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
break;
}
// ...
}
break;
Nombre de répétitions
Vous pouvez vérifier le nombre de répétitions pour déterminer si un message de frappe représente plusieurs séquences de touches. Le système incrémente le nombre lorsque le clavier génère des messages WM_KEYDOWN ou WM_SYSKEYDOWN plus rapidement qu’une application ne peut les traiter. Cela se produit souvent lorsque l’utilisateur maintient une touche suffisamment longtemps pour démarrer la fonctionnalité de répétition automatique du clavier. Au lieu de remplir la file d’attente de messages système avec les messages de désactivation de touches résultants, le système combine les messages en un seul message d’activation de touches et incrémente le nombre de répétitions. Le relâchement d’une touche ne peut pas démarrer la fonctionnalité de répétition automatique, de sorte que le nombre de répétitions pour les messages WM_KEYUP et WM_SYSKEYUP est toujours défini sur 1.
Codes d’analyse
Le code d’analyse est la valeur générée par le système lorsque l’utilisateur appuie sur une touche. Il s’agit d’une valeur qui identifie la touche enfoncée indépendamment de la disposition du clavier actif, par opposition au caractère représenté par la touche. Une application ignore généralement les codes d’analyse. Elle utilise plutôt les codes de touche virtuelle pour interpréter les messages de frappe.
Les claviers modernes utilisent la spécification IHM (en anglais, Human Interface Devices ou HID) pour communiquer avec un ordinateur. Le pilote de clavier convertit les valeurs d’utilisation IHM envoyées par le clavier en сodes d’analyse et les transmet aux applications.
Remarque
Bien que les codes de touches virtuelles soient généralement plus utiles pour les applications bureautiques, les codes d’analyse peuvent être requis dans des cas spécifiques lorsque vous devez savoir quelle touche est enfoncée indépendamment de la disposition actuelle du clavier. Par exemple, les liaisons de touches WASD (W est haut, A à gauche, S est vers le bas et D à droite) pour les jeux garantissent une formation de touches cohérente sur les dispositions de clavier QWERTY aux Etat-Unis ouAZERTY en France.
Le tableau suivant répertorie l’ensemble des codes d’analyse actuellement reconnus par Windows. Les touches indiquées correspondent à un clavier américain QWERTY. Les valeursHID Usage Page (ou « Page d’utilisation IHM »)/HID Usage ID (ou « ID d’utilisation IHM »)/HID Usage Name (ou « Nom d’utilisation IHM ») font référence au document HID Usage Tables (ou « Tables d’utilisation IHM ») (ce document est uniquement disponible en anglais). Les valeurs d’emplacement de touche se rapportent à la précédente image du clavier.
Le code Scan 1 Make est remis dans les messagesWM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/ WM_SYSKEYUP et WM_INPUT.
Nom de la page d’utilisation IHM | Nom d’utilisation IHM | Page d’utilisation IHM | ID d’utilisation IHM | Scan 1 Make | Emplacement de la touche |
---|---|---|---|---|---|
Generic Desktop (Bureau générique) | System Power Down (Mise hors tension du système) | 0x0001 | 0x0081 | 0xE05E | |
Generic Desktop | System Power Down (Mise en veille du système) | 0x0001 | 0x0082 | 0xE05F | |
Generic Desktop | System Wake Up (Sortie de veille du système) | 0x0001 | 0x0083 | 0xE063 | |
Keyboard/Keypad (Clavier/pavé numérique) | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Keyboard/Keypad (Clavier/pavé numérique) | Keyboard A | 0x0007 | 0x0004 | 0x001E | 31 |
Keyboard/Keypad | Keyboard B | 0x0007 | 0x0005 | 0x0030 | 50 |
Keyboard/Keypad | Keyboard C | 0x0007 | 0x0006 | 0x002E | 48 |
Keyboard/Keypad | Keyboard D | 0x0007 | 0x0007 | 0x0020 | 33 |
Keyboard/Keypad | Keyboard E | 0x0007 | 0x0008 | 0x0012 | 19 |
Keyboard/Keypad | Keyboard F | 0x0007 | 0x0009 | 0x0021 | 34 |
Keyboard/Keypad | Keyboard G | 0x0007 | 0x000A | 0x0022 | 35 |
Keyboard/Keypad | Keyboard H | 0x0007 | 0x000B | 0x0023 | 36 |
Keyboard/Keypad | Keyboard I | 0x0007 | 0x000C | 0x0017 | 24 |
Keyboard/Keypad | Keyboard J | 0x0007 | 0x000D | 0x0024 | 37 |
Keyboard/Keypad | Keyboard K | 0x0007 | 0x000E | 0x0025 | 38 |
Keyboard/Keypad | Keyboard L | 0x0007 | 0x000F | 0x0026 | 39 |
Keyboard/Keypad | Keyboard M | 0x0007 | 0x0010 | 0x0032 | 52 |
Keyboard/Keypad | Keyboard N | 0x0007 | 0x0011 | 0x0031 | 51 |
Keyboard/Keypad | Keyboard O | 0x0007 | 0x0012 | 0x0018 | 25 |
Keyboard/Keypad | Keyboard P | 0x0007 | 0x0013 | 0x0019 | 26 |
Keyboard/Keypad | Keyboard Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Keyboard/Keypad | Keyboard R | 0x0007 | 0x0015 | 0x0013 | 20 |
Keyboard/Keypad | Keyboard S | 0x0007 | 0x0016 | 0x001F | 32 |
Keyboard/Keypad | Keyboard T | 0x0007 | 0x0017 | 0x0014 | 21 |
Keyboard/Keypad | Keyboard U | 0x0007 | 0x0018 | 0x0016 | 23 |
Keyboard/Keypad | Keyboard V | 0x0007 | 0x0019 | 0x002F | 49 |
Keyboard/Keypad | Keyboard W | 0x0007 | 0x001A | 0x0011 | 18 |
Keyboard/Keypad | Keyboard X | 0x0007 | 0x001B | 0x002D | 47 |
Keyboard/Keypad | Keyboard Y | 0x0007 | 0x001C | 0x0015 | 22 |
Keyboard/Keypad | Keyboard Z | 0x0007 | 0x001D | 0x002C | 46 |
Keyboard/Keypad | Keyboard 1 and Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Keyboard/Keypad | Keyboard 2 and At | 0x0007 | 0x001F | 0x0003 | 3 |
Keyboard/Keypad | Keyboard 3 And Hash | 0x0007 | 0x0020 | 0x0004 | 4 |
Keyboard/Keypad | Keyboard 4 and Dollar | 0x0007 | 0x0021 | 0x0005 | 5 |
Keyboard/Keypad | Keyboard 5 and Percent | 0x0007 | 0x0022 | 0x0006 | 6 |
Keyboard/Keypad | Keyboard 6 and Caret | 0x0007 | 0x0023 | 0x0007 | 7 |
Keyboard/Keypad | Keyboard 7 and Ampersand | 0x0007 | 0x0024 | 0x0008 | 8 |
Keyboard/Keypad | Keyboard 8 and Star | 0x0007 | 0x0025 | 0x0009 | 9 |
Keyboard/Keypad | Keyboard 9 and Left Bracket | 0x0007 | 0x0026 | 0x000A | 10 |
Keyboard/Keypad | Keyboard 0 and Right Bracket | 0x0007 | 0x0027 | 0x000B | 11 |
Keyboard/Keypad | Keyboard Return Enter | 0x0007 | 0x0028 | 0x001C | 43 |
Keyboard/Keypad | Keyboard Escape | 0x0007 | 0x0029 | 0x0001 | 110 |
Keyboard/Keypad | Keyboard Delete | 0x0007 | 0x002A | 0x000E | 15 |
Keyboard/Keypad | Keyboard Tab | 0x0007 | 0x002B | 0x000F | 16 |
Keyboard/Keypad | Keyboard Spacebar | 0x0007 | 0x002C | 0x0039 | 61 |
Keyboard/Keypad | Keyboard Dash and Underscore | 0x0007 | 0x002D | 0x000C | 12 |
Keyboard/Keypad | Keyboard Equals and Plus | 0x0007 | 0x002E | 0x000D | 13 |
Keyboard/Keypad | Keyboard Left Brace | 0x0007 | 0x002F | 0x001A | 27 |
Keyboard/Keypad | Keyboard Right Brace | 0x0007 | 0x0030 | 0x001B | 28 |
Keyboard/Keypad | Keyboard Pipe and Slash | 0x0007 | 0x0031 | 0x002B | 29 |
Keyboard/Keypad | Keyboard Non-US | 0x0007 | 0x0032 | 0x002B | 42 |
Keyboard/Keypad | Keyboard SemiColon and Colon | 0x0007 | 0x0033 | 0x0027 | 40 |
Keyboard/Keypad | Keyboard Apostrophe and Double Quotation Mark | 0x0007 | 0x0034 | 0x0028 | 41 |
Keyboard/Keypad | Keyboard Grave Accent and Tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
Keyboard/Keypad | Keyboard Comma | 0x0007 | 0x0036 | 0x0033 | 53 |
Keyboard/Keypad | Keyboard Period | 0x0007 | 0x0037 | 0x0034 | 54 |
Keyboard/Keypad | Keyboard QuestionMark | 0x0007 | 0x0038 | 0x0035 | 55 |
Keyboard/Keypad | Keyboard Caps Lock | 0x0007 | 0x0039 | 0x003A | 30 |
Keyboard/Keypad | Keyboard F1 | 0x0007 | 0x003A | 0x003B | 112 |
Keyboard/Keypad | Keyboard F2 | 0x0007 | 0x003B | 0x003C | 113 |
Keyboard/Keypad | Keyboard F3 | 0x0007 | 0x003C | 0x003D | 114 |
Keyboard/Keypad | Keyboard F4 | 0x0007 | 0x003D | 0x003E | 115 |
Keyboard/Keypad | Keyboard F5 | 0x0007 | 0x003E | 0x003F | 116 |
Keyboard/Keypad | Keyboard F6 | 0x0007 | 0x003F | 0x0040 | 117 |
Keyboard/Keypad | Keyboard F7 | 0x0007 | 0x0040 | 0x0041 | 118 |
Keyboard/Keypad | Keyboard F8 | 0x0007 | 0x0041 | 0x0042 | 119 |
Keyboard/Keypad | Keyboard F9 | 0x0007 | 0x0042 | 0x0043 | 120 |
Keyboard/Keypad | Keyboard F10 | 0x0007 | 0x0043 | 0x0044 | 121 |
Keyboard/Keypad | Keyboard F11 | 0x0007 | 0x0044 | 0x0057 | 122 |
Keyboard/Keypad | Keyboard F12 | 0x0007 | 0x0045 | 0x0058 | 123 |
Keyboard/Keypad | Keyboard PrintScreen | 0x0007 | 0x0046 | 0xE037 0x0054 *Note 1 |
124 |
Keyboard/Keypad | Keyboard Scroll Lock | 0x0007 | 0x0047 | 0x0046 | 125 |
Keyboard/Keypad | Keyboard Pause | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Note 2 0x0045 *Note 3 |
126 |
Keyboard/Keypad | Keyboard Insert | 0x0007 | 0x0049 | 0xE052 | 75 |
Keyboard/Keypad | Keyboard Home | 0x0007 | 0x004A | 0xE047 | 80 |
Keyboard/Keypad | Keyboard PageUp | 0x0007 | 0x004B | 0xE049 | 85 |
Keyboard/Keypad | Keyboard Delete Forward | 0x0007 | 0x004C | 0xE053 | 76 |
Keyboard/Keypad | Keyboard End | 0x0007 | 0x004D | 0xE04F | 81 |
Keyboard/Keypad | Keyboard PageDown | 0x0007 | 0x004E | 0xE051 | 86 |
Keyboard/Keypad | Keyboard RightArrow | 0x0007 | 0x004F | 0xE04D | 89 |
Keyboard/Keypad | Keyboard LeftArrow | 0x0007 | 0x0050 | 0xE04B | 79 |
Keyboard/Keypad | Keyboard DownArrow | 0x0007 | 0x0051 | 0xE050 | 84 |
Keyboard/Keypad | Keyboard UpArrow | 0x0007 | 0x0052 | 0xE048 | 83 |
Keyboard/Keypad | Keypad Num Lock and Clear | 0x0007 | 0x0053 | 0x0045 0x0045 *Note 3 |
90 |
Keyboard/Keypad | Keypad Forward Slash | 0x0007 | 0x0054 | 0xE035 | 95 |
Keyboard/Keypad | Keypad Star | 0x0007 | 0x0055 | 0x0037 | 100 |
Keyboard/Keypad | Keypad Dash | 0x0007 | 0x0056 | 0x004A | 105 |
Keyboard/Keypad | Keypad Plus | 0x0007 | 0x0057 | 0x004E | 106 |
Keyboard/Keypad | Keypad ENTER | 0x0007 | 0x0058 | 0xE01C | 108 |
Keyboard/Keypad | Keypad 1 and End | 0x0007 | 0x0059 | 0x004F | 93 |
Keyboard/Keypad | Keypad 2 and Down Arrow | 0x0007 | 0x005A | 0x0050 | 98 |
Keyboard/Keypad | Keypad 3 and PageDn | 0x0007 | 0x005B | 0x0051 | 103 |
Keyboard/Keypad | Keypad 4 and Left Arrow | 0x0007 | 0x005C | 0x004B | 92 |
Keyboard/Keypad | Keypad 5 | 0x0007 | 0x005D | 0x004C | 97 |
Keyboard/Keypad | Keypad 6 and Right Arrow | 0x0007 | 0x005E | 0x004D | 102 |
Keyboard/Keypad | Keypad 7 and Home | 0x0007 | 0x005F | 0x0047 | 91 |
Keyboard/Keypad | Keypad 8 and Up Arrow | 0x0007 | 0x0060 | 0x0048 | 96 |
Keyboard/Keypad | Keypad 9 and PageUp | 0x0007 | 0x0061 | 0x0049 | 101 |
Keyboard/Keypad | Keypad 0 and Insert | 0x0007 | 0x0062 | 0x0052 | 99 |
Keyboard/Keypad | Keypad Period | 0x0007 | 0x0063 | 0x0053 | 104 |
Keyboard/Keypad | Keyboard Non-US Slash Bar | 0x0007 | 0x0064 | 0x0056 | 45 |
Keyboard/Keypad | Keyboard Application | 0x0007 | 0x0065 | 0xE05D | 129 |
Keyboard/Keypad | Keyboard Power (Touche d’alimentation) | 0x0007 | 0x0066 | 0xE05E | |
Keyboard/Keypad | Keypad Equals (Touche «Egal» du pavé numérique) | 0x0007 | 0x0067 | 0x0059 | |
Keyboard/Keypad | Keyboard F13 (Touche F13) | 0x0007 | 0x0068 | 0x0064 | |
Keyboard/Keypad | Keyboard F14 (Touche F14) | 0x0007 | 0x0069 | 0x0065 | |
Keyboard/Keypad | Keyboard F15 (Touche F15) | 0x0007 | 0x006A | 0x0066 | |
Keyboard/Keypad | Keyboard F16 (Touche F16) | 0x0007 | 0x006B | 0x0067 | |
Keyboard/Keypad | Keyboard F17 (Touche F17) | 0x0007 | 0x006C | 0x0068 | |
Keyboard/Keypad | Keyboard F18 (Touche F18) | 0x0007 | 0x006D | 0x0069 | |
Keyboard/Keypad | Keyboard F19 (Touche F19) | 0x0007 | 0x006E | 0x006A | |
Keyboard/Keypad | Keyboard F20 (Touche F20) | 0x0007 | 0x006F | 0x006B | |
Keyboard/Keypad | Keyboard F21 (Touche F21) | 0x0007 | 0x0070 | 0x006C | |
Keyboard/Keypad | Keyboard F22 (Touche F22) | 0x0007 | 0x0071 | 0x006D | |
Keyboard/Keypad | Keyboard F23 (Touche F23) | 0x0007 | 0x0072 | 0x006E | |
Keyboard/Keypad | Keyboard F24 (Touche F24) | 0x0007 | 0x0073 | 0x0076 | |
Keyboard/Keypad | Keypad Comma | 0x0007 | 0x0085 | 0x007E | 107 *Note 4 |
Keyboard/Keypad | Keyboard International1 | 0x0007 | 0x0087 | 0x0073 | 56 *Notes 4, 5 |
Keyboard/Keypad | Keyboard International2 | 0x0007 | 0x0088 | 0x0070 | 133 *Note 5 |
Keyboard/Keypad | Keyboard International3 | 0x0007 | 0x0089 | 0x007D | 14 *Note 5 |
Keyboard/Keypad | Keyboard International4 | 0x0007 | 0x008A | 0x0079 | 132 *Note 5 |
Keyboard/Keypad | Keyboard International5 | 0x0007 | 0x008B | 0x007B | 131 *Note 5 |
Keyboard/Keypad | Keyboard International6 (Touche International6) | 0x0007 | 0x008C | 0x005C | |
Keyboard/Keypad | Keyboard LANG1 (Touche LANG1) | 0x0007 | 0x0090 | 0x0072 *Note 6 0x00F2 *Notes 3, 6 |
|
Keyboard/Keypad | Keyboard LANG2 (Touche LANG2) | 0x0007 | 0x0091 | 0x0071 *Note 6 0x00F1 *Notes 3, 6 |
|
Keyboard/Keypad | Keyboard LANG3 (Touche LANG3) | 0x0007 | 0x0092 | 0x0078 | |
Keyboard/Keypad | Keyboard LANG4 (Touche LANG4) | 0x0007 | 0x0093 | 0x0077 | |
Keyboard/Keypad | Keyboard LANG5 (Touche LANG5) | 0x0007 | 0x0094 | 0x0076 | |
Keyboard/Keypad | Keyboard LeftControl | 0x0007 | 0x00E0 | 0x001D | 58 |
Keyboard/Keypad | Keyboard LeftShift | 0x0007 | 0x00E1 | 0x002A | 44 |
Keyboard/Keypad | Keyboard LeftAlt | 0x0007 | 0x00E2 | 0x0038 | 60 |
Keyboard/Keypad | Keyboard Left GUI | 0x0007 | 0x00E3 | 0xE05B | 127 |
Keyboard/Keypad | Keyboard RightControl | 0x0007 | 0x00E4 | 0xE01D | 64 |
Keyboard/Keypad | Keyboard RightShift | 0x0007 | 0x00E5 | 0x0036 | 57 |
Keyboard/Keypad | Keyboard RightAlt | 0x0007 | 0x00E6 | 0xE038 | 62 |
Keyboard/Keypad | Keyboard Right GUI | 0x0007 | 0x00E7 | 0xE05C | 128 |
Consommateur | Scan Next Track (Piste suivante) | 0x000C | 0x00B5 | 0xE019 | |
Consommateur | Scan Previous Track (Piste précédente) | 0x000C | 0x00B6 | 0xE010 | |
Consommateur | Arrêter | 0x000C | 0x00B7 | 0xE024 | |
Consommateur | Jouer/Pause | 0x000C | 0x00CD | 0xE022 | |
Consommateur | Muet | 0x000C | 0x00E2 | 0xE020 | |
Consommateur | Volume Increment (Augmenter le volume) | 0x000C | 0x00E9 | 0xE030 | |
Consommateur | Volume Decrement (Baisser le volume) | 0x000C | 0x00EA | 0xE02E | |
Consommateur | AL Consumer Control Configuration (Configuration du contrôle consommateur) | 0x000C | 0x0183 | 0xE06D | |
Consommateur | AL Email Reader (Lecteur d’e-mail) | 0x000C | 0x018A | 0xE06C | |
Consommateur | AL Calculator (Calculatrice) | 0x000C | 0x0192 | 0xE021 | |
Consommateur | AL Local Machine Browser (Navigateur ordinateur local) | 0x000C | 0x0194 | 0xE06B | |
Consommateur | AC Search (Recherche) | 0x000C | 0x0221 | 0xE065 | |
Consommateur | AC Home (Accueil) | 0x000C | 0x0223 | 0xE032 | |
Consommateur | AC Back (Précédent) | 0x000C | 0x0224 | 0xE06A | |
Consommateur | AC Forward (Suivant) | 0x000C | 0x0225 | 0xE069 | |
Consommateur | AC Stop (Arrêt) | 0x000C | 0x0226 | 0xE068 | |
Consommateur | AC Refresh (Actualiser) | 0x000C | 0x0227 | 0xE067 | |
Consommateur | Signets AC | 0x000C | 0x022A | 0xE066 |
Remarques :
- Le code de touche enfoncée SysRq correspond à la séquence de touches Alt+Impr. écran
- Le code de touche enfoncée Break correspond à la séquence de touches Ctrl+Pause
- Comme indiqué dans les messages clavier hérités
- La touche est présente sur les claviers brésiliens
- La touche est présente sur les claviers japonais
- Le code de touche enfoncée est transmis uniquement lorsque l’utilisateur relâche la touche
Indicateur de touche étendue
L’indicateur de touche étendue indique si le message de frappe provient de l’une des touches supplémentaires du clavier amélioré 101/102. Les touches étendues sont les touches ALT et CTRL situées à droite du clavier ; les touches INSER, SUPPR, DÉBUT, FIN, PAGE HAUT, PAGE BAS et les flèches dans les clusters à gauche du pavé numérique ; la touche VERR NUM ; la touche ATTN (CTRL+PAUSE) ; la touche IMPR ÉCRAN ; et les touches de division (/) et ENTRÉE dans le pavé numérique. La touche MAJ de droite n’est pas considérée comme une touche étendue, elle possède un code d’analyse distinct.
S’il est spécifié, le code d’analyse se compose d’une séquence de deux octets, où le premier octet a une valeur de 0xE0.
Code de contexte
Le code de contexte indique si la touche ALT était enfoncée lorsque le message de frappe a été généré. Le code est 1 si la touche ALT était enfoncée et 0 si elle ne l’était pas.
Indicateur d’état de touche précédente
L’indicateur d’état de la touche précédente indique si la touche qui a généré le message de frappe était précédemment enfoncée ou non. Il vaut 1 si la touche était précédemment enfoncée et 0 si la touche était précédemment en position haute. Vous pouvez utiliser cet indicateur pour identifier les messages de frappe générés par la fonctionnalité de répétition automatique du clavier. Cet indicateur est défini sur 1 pour les messages de frappes WM_KEYDOWN et WM_SYSKEYDOWN générés par la fonctionnalité de répétition automatique. Elle est toujours définie sur 1 pour les messages WM_KEYUP et WM_SYSKEYUP.
Indicateur d’état de transition
L’indicateur d’état de transition indique si le fait d’appuyer sur une touche ou de relâcher une touche a généré le message de frappe. Cet indicateur est toujours défini sur 0 pour les messages WM_KEYDOWN et WM_SYSKEYDOWN ; il est toujours défini sur 1 pour les messages WM_KEYUP et WM_SYSKEYUP.
Messages de caractères
Les messages de frappe fournissent beaucoup d’informations sur les séquences de touches, mais ils ne fournissent pas de codes de caractères pour les séquences de touches de caractères. Pour récupérer des codes de caractères, une application doit inclure la fonction TranslateMessage dans sa boucle de message de thread. TranslateMessage transmet un message WM_KEYDOWN ou WM_SYSKEYDOWN à la disposition du clavier. La disposition examine le code de touche virtuelle du message et, s’il correspond à une touche de caractère, fournit le code de caractère équivalent (en tenant compte de l’état des touches MAJ et VERR MAJ). Il génère ensuite un message de caractères qui inclut le code du caractère et place le message en haut de la file d’attente des messages. L’itération suivante de la boucle de message supprime le message caractère de la file d’attente et distribue le message à la procédure de fenêtre appropriée.
Cette section couvre les sujets suivants :
Messages de caractères non système
Une procédure de fenêtre peut recevoir les messages caractères suivants : WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR et WM_UNICHAR. La fonction TranslateMessage génère un message WM_CHAR ou WM_DEADCHAR lorsqu’elle traite un message WM_KEYDOWN. De même, elle génère un message WM_SYSCHAR ou WM_SYSDEADCHAR lorsqu’elle traite un message WM_SYSKEYDOWN.
Une application qui traite l’entrée du clavier ignore généralement tous les messages à l’exception des WM_CHAR et WM_UNICHAR, en passant tous les autres messages à la fonction DefWindowProc. Notez que WM_CHAR utilise UTF-16 (format de transformation Unicode 16 bits) ou un jeu de caractères ANSI, tandis que WM_UNICHAR utilise toujours UTF-32 (format de transformation Unicode 32 bits). Le système utilise les messages WM_SYSCHAR et WM_SYSDEADCHAR pour implémenter les mnémoniques de menu.
Le paramètre wParam de tous les messages de caractères contient le code de caractère de la touche de caractère qui a été enfoncée. La valeur du code de caractère dépend de la classe window de la fenêtre qui reçoit le message. Si la version Unicode de la fonction RegisterClass a été utilisée pour inscrire la classe window, le système fournit des caractères Unicode à toutes les fenêtres de cette classe. Sinon, le système fournit des codes de caractères ANSI. Pour plus d’informations, consultez Inscription de classes Window et Utiliser des pages de code UTF-8 dans les applications Windows.
Le contenu du paramètre lParam d’un message de caractère est identique au contenu du paramètre lParam du message d’activation de touche qui a été traduit pour produire le message de caractère. Pour plus d’informations, consultez Indicateurs de message de frappe.
Messages de caractères morts
Certains claviers non anglais contiennent des touches de caractères qui ne sont pas censées produire des caractères par elles-mêmes. Au lieu de cela, ils sont utilisés pour ajouter un diacritique au caractère produit par la frappe suivante. Ces touches sont appelées touches mortes. La touche circonflexe d’un clavier allemand est un exemple de touche morte. Pour entrer le caractère composé d’un « o » et d’un accent circonflexe, un utilisateur allemand taperait la touche circonflexe suivie de la touche « o ». La fenêtre avec le focus clavier reçoit la séquence de messages suivante :
TranslateMessage génère le message WM_DEADCHAR lorsqu’il traite le message WM_KEYDOWN à partir d’une touche morte. Bien que le paramètre wParam du message WM_DEADCHAR contienne le code de caractère du diacritique de la touche morte, une application ignore généralement le message. Au lieu de cela, il traite le message WM_CHAR généré par la frappe suivante. Le paramètre wParam du message WM_CHAR contient le code de caractère de la lettre avec le diacritique. Si la frappe suivante génère un caractère qui ne peut pas être combiné avec un diacritique, le système génère deux messages WM_CHAR. Le paramètre wParam du premier contient le code de caractère du diacritique ; le paramètre wParam du second contient le code de caractère de la touche de caractère suivante.
La fonction TranslateMessage génère le message WM_SYSDEADCHAR lorsqu’elle traite le message WM_SYSKEYDOWN à partir d’une touche morte système (une touche morte enfoncée en combinaison avec la touche ALT). Une application ignore généralement le message WM_SYSDEADCHAR.
État de la touche
Lors du traitement d’un message clavier, une application peut avoir besoin de déterminer l’état d’une autre touche que celle qui a généré le message actuel. Par exemple, une application de traitement de texte qui permet à l’utilisateur d’appuyer sur MAJ+FIN pour sélectionner un bloc de texte doit vérifier l’état de la touche MAJ chaque fois qu’il reçoit un message de frappe de la touche FIN. L’application peut utiliser la fonction GetKeyState pour déterminer l’état d’une touche virtuelle au moment de la génération du message actuel; elle peut utiliser la fonction GetAsyncKeyState pour récupérer l’état actuel d’une touche virtuelle.
La disposition du clavier conserve une liste de noms. Le nom d’une touche qui produit un caractère unique est le même que le caractère produit par la touche. Le nom d’une touche non caractéristique, telle que TAB et ENTRÉE, est stocké sous la forme d’une chaîne de caractères. Une application peut récupérer le nom d’une touche à partir du pilote de périphérique en appelant la fonction GetKeyNameText.
Traductions de touches et de frappes
Le système comprend plusieurs fonctions spéciales qui traduisent les codes d’analyse, les codes de caractères et les codes de touche virtuelle fournis par différents messages de frappe. Ces fonctions incluent MapVirtualKey, ToAscii, ToUnicode et VkKeyScan.
En outre, Microsoft Rich Edit 3.0 prend en charge l’IME HexToUnicode, qui permet à un utilisateur de convertir les caractères hexadécimaux et les caractères Unicode à l’aide de touches de raccourci. Cela signifie que lorsque Microsoft Rich Edit 3.0 est incorporé dans une application, celle-ci hérite des fonctionnalités de l’IME HexToUnicode.
Prise en charge des raccourcis clavier
Un raccourci clavier est une combinaison de touches qui génère un message WM_HOTKEY, un message que le système place en haut de la file d’attente de messages d’un thread, contournant tous les messages existants dans la file d’attente. Les applications utilisent des raccourcis clavier pour obtenir une entrée de clavier à priorité élevée de la part de l’utilisateur. Par exemple, en définissant un raccourci clavier composé de la combinaison de touches CTRL+C, une application peut permettre à l’utilisateur d’annuler une opération de longue durée.
Pour définir un raccourci clavier, une application appelle la fonction RegisterHotKey, en spécifiant la combinaison de touches qui génère le message WM_HOTKEY, le handle de la fenêtre pour recevoir le message et l’identificateur du raccourci clavier. Lorsque l’utilisateur appuie sur le raccourci clavier, un message WM_HOTKEY est placé dans la file d’attente de messages du thread qui a créé la fenêtre. Le paramètre wParam du message contient l’identificateur du raccourci clavier. L’application peut définir plusieurs raccourcis clavier pour un thread, mais chaque raccourci clavier du thread doit avoir un identificateur unique. Avant de se terminer, l’application doit utiliser la fonction UnregisterHotKey pour détruire le raccourci clavier.
Les applications peuvent utiliser un contrôle de raccourci clavier pour faciliter le choix d’un raccourci clavier par l’utilisateur. Les contrôles de raccourci clavier sont généralement utilisés pour définir un raccourci clavier qui active une fenêtre ; ils n’utilisent pas les fonctions RegisterHotKey et UnregisterHotKey. Au lieu de cela, une application qui utilise un contrôle de raccourci clavier envoie généralement le message WM_SETHOTKEY pour définir le raccourci clavier. Chaque fois que l’utilisateur appuie sur le raccourci clavier, le système envoie un message WM_SYSCOMMAND spécifiant SC_HOTKEY. Pour plus d’informations sur les contrôles de raccourci clavier, consultez « Utilisation des contrôles de raccourci clavier » dans Contrôles de raccourci clavier.
Touches de clavier pour la navigation et d’autres fonctions
Windows prend en charge les claviers dotés de touches spéciales pour les fonctions de navigateur, les fonctions multimédias, le lancement d’applications et la gestion de l’alimentation. Le WM_APPCOMMAND prend en charge les touches de clavier supplémentaires. En outre, la fonction ShellProc est modifiée pour prendre en charge les touches de clavier supplémentaires.
Il est peu probable qu’une fenêtre enfant d’une application de composant puisse implémenter directement des commandes pour ces touches de clavier supplémentaires. Par conséquent, lorsque l’une de ces touches est enfoncée, DefWindowProc envoie un message WM_APPCOMMAND à une fenêtre. DefWindowProc envoie également le message WM_APPCOMMAND dans sa fenêtre parent. Cela est similaire à la façon dont les menus contextuels sont appelés avec le bouton droit de la souris, c’est-à-dire que DefWindowProc envoie un message WM_CONTEXTMENU lors d’un clic droit, et l’envoie à son parent. En outre, si DefWindowProc reçoit un message WM_APPCOMMAND pour une fenêtre de niveau supérieur, il appelle un crochet d’interpréteur de commandes avec du code HSHELL_APPCOMMAND.
Windows prend également en charge l’Explorateur Microsoft IntelliMouse, qui est une souris avec cinq boutons. Les deux boutons supplémentaires permettent de naviguer vers l’avant et vers l’arrière. Pour plus d’informations, consultez XBUTTONs.
Simulation d’entrée
Pour simuler une série ininterrompue d’événements d’entrée utilisateur, utilisez la fonction SendInput. La fonction accepte trois paramètres. Le premier paramètre, cInputs, indique le nombre d’événements d’entrée qui seront simulés. Le deuxième paramètre, rgInputs, est un tableau de structures INPUT, chacune décrivant un type d’événement d’entrée et des informations supplémentaires sur cet événement. Le dernier paramètre, cbSize, accepte la taille de la structure INPUT, en octets.
La fonction SendInput fonctionne en injectant une série d’événements d’entrée simulés dans le flux d’entrée d’un appareil. L’effet est similaire à l’appel répété de la fonction keybd_event ou mouse_event, sauf que le système garantit qu’aucun autre événement d’entrée ne s’entremêle avec les événements simulés. Une fois l’appel terminé, la valeur de retour indique le nombre d’événements d’entrée correctement lus. Si cette valeur est égale à zéro, l’entrée a été bloquée.
La fonction SendInput ne réinitialise pas l’état actuel du clavier. Par conséquent, si l’utilisateur a des touches enfoncées lorsque vous appelez cette fonction, elles peuvent interférer avec les événements générés par cette fonction. Si vous êtes préoccupé par les interférences possibles, vérifiez l’état du clavier avec la fonction GetAsyncKeyState et corrigez si nécessaire.
Langues, paramètres régionaux et dispositions du clavier
Une langue est une langue naturelle, comme l’anglais, le français et le japonais. Une sous-langue est une variante d’une langue naturelle parlée dans une région géographique spécifique, comme les sous-langues anglaises parlées au Royaume-Uni et les États-Unis. Les applications utilisent des valeurs, appelées identificateurs de langue, pour identifier de manière unique les langues et les sous-langues.
Les applications utilisent généralement des paramètres régionaux pour définir la langue dans laquelle l’entrée et la sortie sont traitées. La définition des paramètres régionaux pour le clavier, par exemple, affecte les valeurs de caractères générées par le clavier. La définition des paramètres régionaux pour l’affichage ou l’imprimante affecte les glyphes affichés ou imprimés. Les applications définissent les paramètres régionaux d’un clavier en chargeant et en utilisant des dispositions de clavier. Ils définissent les paramètres régionaux d’un affichage ou d’une imprimante en sélectionnant une police qui prend en charge les paramètres régionaux spécifiés.
Une disposition de clavier spécifie non seulement la position physique des touches sur le clavier, mais détermine également les valeurs de caractères générées en appuyant sur ces touches. Chaque disposition identifie la langue d’entrée actuelle et détermine quelles valeurs de caractère sont générées par quelles touches et combinaisons de touches.
Chaque disposition de clavier a un handle correspondant qui identifie la disposition et la langue. Le mot faible du handle est un identificateur de langue. Le mot fort est un handle d’appareil, spécifiant la disposition physique, ou est égal à zéro, indiquant une disposition physique par défaut. L’utilisateur peut associer n’importe quelle langue d’entrée à une disposition physique. Par exemple, un utilisateur anglophone qui travaille très occasionnellement en français peut définir la langue d’entrée du clavier sur le français sans modifier la disposition physique du clavier. Cela signifie que l’utilisateur peut entrer du texte en français en utilisant la disposition anglaise familière.
Les applications ne sont généralement pas censées manipuler directement les langages d’entrée. Au lieu de cela, l’utilisateur configure des combinaisons de langue et de disposition, puis passe de l’une à l’autre. Lorsque l’utilisateur clique sur du texte marqué d’une langue différente, l’application appelle la fonction ActivateKeyboardLayout pour activer la disposition par défaut de l’utilisateur pour cette langue. Si l’utilisateur modifie du texte dans une langue qui ne figure pas dans la liste active, l’application peut appeler la fonction LoadKeyboardLayout avec la langue pour obtenir une disposition basée sur cette langue.
La fonction ActivateKeyboardLayout définit la langue d’entrée de la tâche actuelle. Le paramètre hkl peut être le handle de la disposition du clavier ou un identificateur de langue étendu zéro. Les handles de disposition du clavier peuvent être obtenues à partir de la fonction LoadKeyboardLayout ou GetKeyboardLayoutList. Les valeurs HKL_NEXT et HKL_PREV peuvent également être utilisées pour sélectionner le clavier suivant ou précédent.
La fonction GetKeyboardLayoutName récupère le nom de la disposition de clavier active pour le thread appelant. Si une application crée la disposition active à l’aide de la fonction LoadKeyboardLayout, GetKeyboardLayoutName récupère la même chaîne que celle utilisée pour créer la disposition. Sinon, la chaîne est l’identificateur de langue principal correspondant aux paramètres régionaux de la disposition active. Cela signifie que la fonction ne peut pas nécessairement faire la différence entre les différentes dispositions ayant la même langue primaire. Elle ne peut donc pas retourner d’informations spécifiques sur la langue d’entrée. Toutefois, la fonction GetKeyboardLayout peut être utilisée pour déterminer la langue d’entrée.
La fonction LoadKeyboardLayout charge une disposition de clavier et la met à disposition de l’utilisateur. Les applications peuvent rendre la disposition immédiatement active pour le thread actif à l’aide de la valeur KLF_ACTIVATE. Une application peut utiliser la valeur KLF_REORDER pour réorganiser les dispositions sans spécifier la valeur KLF_ACTIVATE. Les applications doivent toujours utiliser la valeur KLF_SUBSTITUTE_OK lors du chargement des dispositions du clavier pour s’assurer que la préférence de l’utilisateur, le cas échéant, est sélectionnée.
Pour la prise en charge multilingue, la fonction LoadKeyboardLayout fournit les indicateurs KLF_REPLACELANG et KLF_NOTELLSHELL. L’indicateur KLF_REPLACELANG indique à la fonction de remplacer une disposition de clavier existante sans modifier la langue. La tentative de remplacement d’une disposition existante à l’aide du même identificateur de langue, mais sans spécifier KLF_REPLACELANG est une erreur. L’indicateur KLF_NOTELLSHELL empêche la fonction d’avertir l’interpréteur de commandes lorsqu’une disposition de clavier est ajoutée ou remplacée. Cela est utile pour les applications qui ajoutent plusieurs dispositions dans une série consécutive d’appels. Cet indicateur doit être utilisé dans tout les cas, sauf lors du dernier appel.
La fonction UnloadKeyboardLayout est limitée en ce qu’elle ne peut pas décharger la langue d’entrée par défaut du système. Cela garantit que l’utilisateur dispose toujours d’une disposition pour entrer du texte en utilisant le même jeu de caractères que celui utilisé par l’interpréteur de commandes et le système de fichiers.