Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les applications doivent accepter l’entrée utilisateur à partir du clavier, ainsi que de la souris. Une application reçoit une entrée clavier sous la forme de messages publiés dans ses fenêtres.
Modèle d’entrée clavier
Le système fournit une prise en charge du clavier indépendante de l'appareil pour les applications en installant un pilote de périphérique de clavier approprié pour le clavier actuel. Le système offre un support clavier indépendant de la langue en utilisant la configuration de clavier spécifique actuellement sélectionnée par l’utilisateur ou l’application. Le pilote de périphérique de clavier reçoit les 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 dans votre application.
Chaque touche d’un clavier est associée à une valeur unique appelée code de scan qui identifie la touche du clavier en fonction de l’appareil. Un clavier génère deux codes d’analyse lorsque l’utilisateur tape une touche, une lorsque l’utilisateur appuie sur la touche et une autre lorsque l’utilisateur relâche la touche.
Le pilote de périphérique clavier interprète un code d’analyse et le traduit (mappe) à un code de clé virtuelle , 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 touches, 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 de messages du thread approprié. Finalement, 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 envoie les messages de clavier à la file d’attente de 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’affichage en déplaçant le focus clavier, dans la direction 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éé) tous les messages clavier jusqu’à ce que le focus passe à une autre fenêtre.
Un thread peut appeler la fonction GetFocus pour déterminer quelles fenêtres (le cas échéant) possède actuellement le focus clavier. Un thread peut donner le focus clavier à l'une de ses fenêtres en appelant la fonction SetFocus. Lorsque le focus clavier passe d’une fenêtre à une 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 le place en haut de l’ordre Z et met en surbrillance sa barre de titre (si elle en a un) et sa bordure.
L’utilisateur peut activer une fenêtre de niveau supérieur en cliquant dessus, en la sélectionnant à l’aide de l'Alt+Tab ou Combinaison de touches 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’elle 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 de bas ordre du paramètre wParam est égal à zéro si la fenêtre est désactivée et non nulle 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 de clavier et de souris d’atteindre les applications, utilisez BlockInput. Notez que la fonction BlockInput n’interfère pas avec la table asynchrone d’état d’entrée 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 du clavier asynchrone.
Messages de séquences de touches
En appuyant sur une touche, un message WM_KEYDOWN ou WM_SYSKEYDOWN doit être placé dans la file d’attente de messages de thread attachée à la fenêtre avec le focus clavier. Lorsque l'on relâche une touche, un message WM_KEYUP ou WM_SYSKEYUP est inséré dans la file d’attente.
Les messages de relâchement de touche et d'appui de touche se produisent généralement par paires, mais si l'utilisateur maintient une touche 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 message WM_KEYUP ou WM_SYSKEYUP unique lorsque l’utilisateur libère la clé.
Cette section traite des rubriques suivantes :
- Séquences de touches système et non système
- Description des codes de touche virtuels
- Indicateurs de messages de séquences de touches
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 séquences de touches système WM_SYSKEYDOWN et WM_SYSKEYUP. Les séquences de touches non système produisent des messages de séquences de touches 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 le traitement du message, la procédure la transmet à la fonction DefWindowProc. Dans le cas contraire, toutes les opérations système impliquant l'touche Alt seront désactivées chaque fois que la fenêtre a le focus clavier. Autrement dit, l’utilisateur ne pourra pas accéder aux menus ou au menu Système de la fenêtre, ou utiliser l'Alt+Échap ou Alt+Tab séquence de touches pour activer une autre fenêtre.
Les messages de frappe système sont principalement utilisés par le système plutôt que par une application. Le système les utilise pour fournir son interface clavier intégrée aux menus et 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 du 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ées à la fenêtre active.
Les messages de frappe hors système sont utilisés par les fenêtres d'application ; la fonction DefWindowProc n'a aucune action sur eux. Une procédure de fenêtre peut ignorer les messages de touches non système dont elle n’a pas besoin.
Description des codes Virtual-Key
Le paramètre wParam d’un message de frappe contient le code clé virtuelle de la touche qui a été enfoncée ou libérée. Une procédure de fenêtre traite ou ignore un message de séquence de touches, en fonction de la valeur du code de clé virtuelle.
Une procédure de fenêtre classique traite uniquement un petit sous-ensemble des messages de frappe qu’il reçoit et ignore le reste. Par exemple, une procédure de fenêtre peut traiter uniquement WM_KEYDOWN messages de séquence de touches, et uniquement ceux qui contiennent des codes de touche virtuelle pour les touches de déplacement du curseur, les touches de décalage (également appelées touches de contrôle) et les touches de fonction. Une procédure de fenêtre typique ne traite pas les messages des 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 messages de séquences de touches
Le paramètre lParam d’un message de séquence de touches 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 clé étendue, le code de contexte , l’indicateur d’état de clé précédentet 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 du mot de poids fort de lParam.
Valeur | Description |
---|---|
KF_EXTENDED 0x0100 |
Manipule l’indicateur de clé é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 clé précédent. |
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 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 peut les traiter. Cela se produit souvent lorsque l’utilisateur conserve une touche suffisamment longue 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 d'appui de touche résultants, le système combine les messages en un seul message d'appui de touche et incrémente le compteur de répétitions. La libération d’une clé ne peut pas démarrer la fonctionnalité de répétition automatique. Par conséquent, le nombre de répétitions pour WM_KEYUP et les messages WM_SYSKEYUP sont toujours définis sur 1.
Codes de scan
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 de clavier active , par opposition au caractère représenté par la touche. Une application ignore généralement les codes d’analyse. Au lieu de cela, il utilise les codes de touche virtuelle pour interpréter les messages de séquence de touches.
Les claviers modernes utilisent la spécification HID (Human Interface Devices) pour communiquer avec un ordinateur. Le pilote clavier convertit les valeurs d'utilisation HID signalées envoyées à partir du clavier en codes de balayage et les transmet aux applications.
Note
Bien que les codes de touches virtuelles soient généralement plus utiles pour les applications de bureau, 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, la combinaison de touches WASD (W est en haut, A est à gauche, S est en bas et D est à droite) pour les jeux, qui garantit une formation cohérente des touches sur les claviers QWERTY américains ou les claviers AZERTY français.
Le tableau suivant répertorie les codes de balayage tels qu'ils sont actuellement reconnus par Windows. Les valeurs Page d’utilisation IHM/ID d’utilisation IHM/Nom d’utilisation IHM font référence au document Tableaux d’utilisation IHM. Les valeurs Emplacement de la clé référencent l’image de clavier précédente.
Le code Scan 1 Make est remis dans les messages WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP et WM_INPUT.
Nom de la page d’utilisation HID | Nom d’utilisation IHM | Page d’utilisation HID | ID d’utilisation HID | Scan 1 Make | Emplacement de la clé |
---|---|---|---|---|---|
Bureau générique | Mise hors-tension du système | 0x0001 | 0x0081 | 0xE05E | |
Bureau générique | Veille du système | 0x0001 | 0x0082 | 0xE05F | |
Bureau générique | Mise en éveil du système | 0x0001 | 0x0083 | 0xE063 | |
Clavier/clavier numérique | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Clavier/pavé numérique | Clavier A | 0x0007 | 0x0004 | 0x001E | 31 |
Clavier/clavier numérique | Clavier B | 0x0007 | 0x0005 | 0x0030 | 50 |
Clavier/clavier numérique | Clavier C | 0x0007 | 0x0006 | 0x002E | 48 |
Clavier/clavier numérique | Clavier D | 0x0007 | 0x0007 | 0x0020 | 33 |
Clavier/clavier numérique | Clavier E | 0x0007 | 0x0008 | 0x0012 | 19 |
Clavier/pavé numérique | Clavier F | 0x0007 | 0x0009 | 0x0021 | 34 |
Clavier/pavé numérique | Clavier G | 0x0007 | 0x000A | 0x0022 | 35 |
Clavier/clavier numérique | Clavier H | 0x0007 | 0x000B | 0x0023 | 36 |
Clavier/pavé numérique | Clavier I | 0x0007 | 0x000C | 0x0017 | 24 |
Clavier/pavé numérique | Clavier J | 0x0007 | 0x000D | 0x0024 | 37 |
Clavier/pavé numérique | Clavier K | 0x0007 | 0x000E | 0x0025 | 38 |
Clavier/clavier numérique | Clavier L | 0x0007 | 0x000F | 0x0026 | 39 |
Clavier/clavier numérique | Clavier M | 0x0007 | 0x0010 | 0x0032 | 52 |
Clavier/pavé numérique | Clavier N | 0x0007 | 0x0011 | 0x0031 | 51 |
Clavier/clavier numérique | Clavier O | 0x0007 | 0x0012 | 0x0018 | 25 |
Clavier/pavé numérique | Clavier P | 0x0007 | 0x0013 | 0x0019 | 26 |
Clavier/pavé numérique | Clavier Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Clavier/pavé numérique | Clavier R | 0x0007 | 0x0015 | 0x0013 | 20 |
Clavier/clavier numérique | Clavier S | 0x0007 | 0x0016 | 0x001F | 32 |
Clavier/pavé numérique | Clavier T | 0x0007 | 0x0017 | 0x0014 | 21 |
Clavier/pavé numérique | Clavier U | 0x0007 | 0x0018 | 0x0016 | 23 |
Clavier/pavé numérique | Clavier V | 0x0007 | 0x0019 | 0x002F | 49 |
Clavier/clavier numérique | Touche W | 0x0007 | 0x001A | 0x0011 | 18 |
Clavier/pavé numérique | Touche X | 0x0007 | 0x001B | 0x002D | 47 |
Clavier/pavé numérique | Clavier Y | 0x0007 | 0x001C | 0x0015 | 22 |
Clavier/clavier numérique | Touche Z | 0x0007 | 0x001D | 0x002C | 46 |
Clavier/clavier numérique | Clavier 1 et Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Clavier/clavier numérique | Touche 2 et arobase | 0x0007 | 0x001F | 0x0003 | 3 |
Clavier/pavé numérique | Touche 3 et dièse | 0x0007 | 0x0020 | 0x0004 | 4 |
Clavier/pavé numérique | Clavier 4 et Dollar | 0x0007 | 0x0021 | 0x0005 | 5 |
Clavier/pavé numérique | Touche 5 et pourcentage | 0x0007 | 0x0022 | 0x0006 | 6 |
Clavier/clavier numérique | Touche 6 et accent circonflexe | 0x0007 | 0x0023 | 0x0007 | 7 |
Clavier/pavé numérique | Clavier 7 et Ampersand | 0x0007 | 0x0024 | 0x0008 | 8 |
Clavier/pavé numérique | Clavier 8 et Étoile | 0x0007 | 0x0025 | 0x0009 | 9 |
Clavier/pavé numérique | Clavier 9 et crochet gauche | 0x0007 | 0x0026 | 0x000A | 10 |
Clavier/pavé numérique | Clavier 0 et crochet droit | 0x0007 | 0x0027 | 0x000B | 11 |
Clavier/pavé numérique | Touche Entrée (Retour) | 0x0007 | 0x0028 | 0x001C | 43 |
Clavier/pavé numérique | Touche Échap | 0x0007 | 0x0029 | 0x0001 | 110 |
Clavier/pavé numérique | Touche Effacer | 0x0007 | 0x002A | 0x000E | 15 |
Clavier/clavier numérique | Touche Tabulation | 0x0007 | 0x002B | 0x000F | 16 |
Clavier/pavé numérique | Barre d’espace clavier | 0x0007 | 0x002C | 0x0039 | 61 |
Clavier/pavé numérique | Touche tiret et soulignement | 0x0007 | 0x002D | 0x000C | 12 |
Clavier/pavé numérique | Touche égal et plus | 0x0007 | 0x002E | 0x000D | 13 |
Clavier/pavé numérique | Accolade gauche du clavier | 0x0007 | 0x002F | 0x001A | 27 |
Clavier/pavé numérique | Accolade droite du clavier | 0x0007 | 0x0030 | 0x001B | 28 |
Clavier/pavé numérique | Keyboard Pipe et Slash | 0x0007 | 0x0031 | 0x002B | 29 |
Clavier/pavé numérique | Clavier non américain | 0x0007 | 0x0032 | 0x002B | 42 |
Clavier/clavier numérique | Touche point-virgule et deux-points | 0x0007 | 0x0033 | 0x0027 | 40 |
Clavier/pavé numérique | Apostrophe clavier et guillemets doubles | 0x0007 | 0x0034 | 0x0028 | 41 |
Clavier/pavé numérique | Touche accent grave et tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
Clavier/pavé numérique | Touche virgule | 0x0007 | 0x0036 | 0x0033 | 53 |
Clavier/pavé numérique | Touche point | 0x0007 | 0x0037 | 0x0034 | 54 |
Clavier/clavier numérique | Touche point d’interrogation | 0x0007 | 0x0038 | 0x0035 | 55 |
Clavier/pavé numérique | Touche Verr. maj. | 0x0007 | 0x0039 | 0x003A | 30 |
Clavier/clavier numérique | Clavier F1 | 0x0007 | 0x003A | 0x003B | 112 |
Clavier/pavé numérique | Clavier F2 | 0x0007 | 0x003B | 0x003C | 113 |
Clavier/pavé numérique | Clavier F3 | 0x0007 | 0x003C | 0x003D | 114 |
Clavier/pavé numérique | Clavier F4 | 0x0007 | 0x003D | 0x003E | 115 |
Clavier/pavé numérique | Clavier F5 | 0x0007 | 0x003E | 0x003F | 116 |
Clavier/pavé numérique | Clavier F6 | 0x0007 | 0x003F | 0x0040 | 117 |
Clavier/pavé numérique | Clavier F7 | 0x0007 | 0x0040 | 0x0041 | 1:18 |
Clavier/pavé numérique | Clavier F8 | 0x0007 | 0x0041 | 0x0042 | 01:19:48 AM |
Clavier/pavé numérique | Clavier F9 | 0x0007 | 0x0042 | 0x0043 | 01:20:21 |
Clavier/pavé numérique | Clavier F10 | 0x0007 | 0x0043 | 0x0044 | 121 |
Clavier/clavier numérique | Clavier F11 | 0x0007 | 0x0044 | 0x0057 | 122 |
Clavier/pavé numérique | Clavier F12 | 0x0007 | 0x0045 | 0x0058 | 123 |
Clavier/pavé numérique | Touche Imp. écr. | 0x0007 | 0x0046 | 0xE037 0x0054 *Remarque 1 |
124 |
Clavier/pavé numérique | Verrouillage de défilement du clavier | 0x0007 | 0x0047 | 0x0046 | 125 |
Clavier/pavé numérique | Touche Pause | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Remarque 2 0x0045 *Remarque 3 |
126 |
Clavier/clavier numérique | Insertion du clavier | 0x0007 | 0x0049 | 0xE052 | 75 |
Clavier/pavé numérique | Accueil du clavier | 0x0007 | 0x004A | 0xE047 | 80 |
Clavier/clavier numérique | Touche Pg. préc. | 0x0007 | 0x004B | 0xE049 | 85 |
Clavier/pavé numérique | Touche Supprimer | 0x0007 | 0x004C | 0xE053 | 76 |
Clavier/pavé numérique | Touche Fin | 0x0007 | 0x004D | 0xE04F | 81 |
Clavier/pavé numérique | Touche Pg. suiv. | 0x0007 | 0x004E | 0xE051 | 86 |
Clavier/pavé numérique | Touche Flèche droite | 0x0007 | 0x004F | 0xE04D | 89 |
Clavier/pavé numérique | Touche Flèche gauche | 0x0007 | 0x0050 | 0xE04B | 79 |
Clavier/pavé numérique | Touche Flèche bas | 0x0007 | 0x0051 | 0xE050 | 84 |
Clavier/pavé numérique | Touche Flèche haut | 0x0007 | 0x0052 | 0xE048 | 83 |
Clavier/pavé numérique | Touche Verr. num. et Effacer du pavé numérique | 0x0007 | 0x0053 | 0x0045 0xE045 *Remarque 3 |
90 |
Clavier/clavier numérique | Touche Barre oblique du pavé numérique | 0x0007 | 0x0054 | 0xE035 | 95 |
Clavier/pavé numérique | Touche Étoile du pavé numérique | 0x0007 | 0x0055 | 0x0037 | 100 |
Clavier/pavé numérique | Touche Tiret du pavé numérique | 0x0007 | 0x0056 | 0x004A | 105 |
Clavier/pavé numérique | Touche Plus du pavé numérique | 0x0007 | 0x0057 | 0x004E | 01:23:06 AM |
Clavier/pavé numérique | Touche ENTRÉE du pavé numérique | 0x0007 | 0x0058 | 0xE01C | 1:08 |
Clavier/pavé numérique | Clavier numérique 1 et Fin | 0x0007 | 0x0059 | 0x004F | 93 |
Clavier/clavier numérique | Clavier numérique 2 et flèche vers le bas | 0x0007 | 0x005A | 0x0050 | 98 |
Clavier/pavé numérique | Touche 3 et Pg. suiv. du pavé numérique | 0x0007 | 0x005B | 0x0051 | 1:03 |
Clavier/pavé numérique | Touche 4 et Flèche gauche du pavé numérique | 0x0007 | 0x005C | 0x004B | 92 |
Clavier/clavier numérique | Touche 5 | 0x0007 | 0x005D | 0x004C | 97 |
Clavier/pavé numérique | Pavé tactile 6 et flèche droite | 0x0007 | 0x005E | 0x004D | 102 |
Clavier/clavier numérique | Clavier 7 et Accueil | 0x0007 | 0x005F | 0x0047 | 91 |
Clavier/pavé numérique | Touche 8 et Flèche haut du pavé numérique | 0x0007 | 0x0060 | 0x0048 | 96 |
Clavier/pavé numérique | Touche 9 et Pg. préc. du pavé numérique | 0x0007 | 0x0061 | 0x0049 | 101 |
Clavier/clavier numérique | Touche 0 et Inser. du pavé numérique | 0x0007 | 0x0062 | 0x0052 | 99 |
Clavier/pavé numérique | Touche Point du pavé numérique | 0x0007 | 0x0063 | 0x0053 | 104 |
Clavier/pavé numérique | Touche Barre oblique du clavier non américain | 0x0007 | 0x0064 | 0x0056 | 45 |
Clavier/pavé numérique | Application clavier | 0x0007 | 0x0065 | 0xE05D | 129 |
Clavier/pavé numérique | Alimentation du clavier | 0x0007 | 0x0066 | 0xE05E | |
Clavier/pavé numérique | Touche Égal du pavé numérique | 0x0007 | 0x0067 | 0x0059 | |
Clavier/pavé numérique | Clavier F13 | 0x0007 | 0x0068 | 0x0064 | |
Clavier/pavé numérique | Clavier F14 | 0x0007 | 0x0069 | 0x0065 | |
Clavier/pavé numérique | Clavier F15 | 0x0007 | 0x006A | 0x0066 | |
Clavier/pavé numérique | Clavier F16 | 0x0007 | 0x006B | 0x0067 | |
Clavier/pavé numérique | Clavier F17 | 0x0007 | 0x006C | 0x0068 | |
Clavier/clavier numérique | Clavier F18 | 0x0007 | 0x006D | 0x0069 | |
Clavier/clavier numérique | Clavier F19 | 0x0007 | 0x006E | 0x006A | |
Clavier/clavier numérique | Clavier F20 | 0x0007 | 0x006F | 0x006B | |
Clavier/pavé numérique | Clavier F21 | 0x0007 | 0x0070 | 0x006C | |
Clavier/pavé numérique | Clavier F22 | 0x0007 | 0x0071 | 0x006D | |
Clavier/pavé numérique | Clavier F23 | 0x0007 | 0x0072 | 0x006E | |
Clavier/pavé numérique | Clavier F24 | 0x0007 | 0x0073 | 0x0076 | |
Clavier/pavé numérique | Touche Virgule du pavé numérique | 0x0007 | 0x0085 | 0x007E | 107 *Remarque 4 |
Clavier/clavier numérique | Clavier International1 | 0x0007 | 0x0087 | 0x0073 | 56 *Remarque 4, 5 |
Clavier/pavé numérique | Clavier International2 | 0x0007 | 0x0088 | 0x0070 | 133 *Remarque 5 |
Clavier/clavier numérique | Clavier International3 | 0x0007 | 0x0089 | 0x007D | 14 *Remarque 5 |
Clavier/clavier numérique | Clavier International4 | 0x0007 | 0x008A | 0x0079 | 132 *Remarque 5 |
Clavier/pavé numérique | Clavier International5 | 0x0007 | 0x008B | 0x007B | 131 *Remarque 5 |
Clavier/pavé numérique | Clavier International6 | 0x0007 | 0x008C | 0x005C | |
Clavier/pavé numérique | Touche LANG1 | 0x0007 | 0x0090 | 0x0072 *Remarque 6 0x00F2 *Remarque 3, 6 |
|
Clavier/pavé numérique | Touche LANG2 | 0x0007 | 0x0091 | 0x0071 *Remarque 6 0x00F1 *Remarque 3, 6 |
|
Clavier/pavé numérique | Touche LANG3 | 0x0007 | 0x0092 | 0x0078 | |
Clavier/pavé numérique | Touche LANG4 | 0x0007 | 0x0093 | 0x0077 | |
Clavier/pavé numérique | Touche LANG5 | 0x0007 | 0x0094 | 0x0076 | |
Clavier/pavé numérique | Touche Ctrl gauche | 0x0007 | 0x00E0 | 0x001D | 58 |
Clavier/clavier numérique | Touche Maj. gauche | 0x0007 | 0x00E1 | 0x002A | 44 |
Clavier/pavé numérique | Touche Alt droite | 0x0007 | 0x00E2 | 0x0038 | 60 |
Clavier/pavé numérique | Touche GUI gauche | 0x0007 | 0x00E3 | 0xE05B | 1:27 |
Clavier/clavier numérique | Touche Ctrl droite | 0x0007 | 0x00E4 | 0xE01D | 64 |
Clavier/pavé numérique | Touche Maj. droite | 0x0007 | 0x00E5 | 0x0036 | 57 |
Clavier/pavé numérique | Touche Alt. droite | 0x0007 | 0x00E6 | 0xE038 | 62 |
Clavier/pavé numérique | Touche GUI droite | 0x0007 | 0x00E7 | 0xE05C | 128 |
Consommateur | Piste suivante | 0x000C | 0x00B5 | 0xE019 | |
Consommateur | Piste précédente | 0x000C | 0x00B6 | 0xE010 | |
Consommateur | Arrêter | 0x000C | 0x00B7 | 0xE024 | |
Consommateur | Jouer/Pause | 0x000C | 0x00CD | 0xE022 | |
Consommateur | Silencieux | 0x000C | 0x00E2 | 0xE020 | |
Consommateur | Incrément de volume | 0x000C | 0x00E9 | 0xE030 | |
Consommateur | Réduction du volume | 0x000C | 0x00EA | 0xE02E | |
Consommateur | Configuration du contrôle consommateur AL | 0x000C | 0x0183 | 0xE06D | |
Consommateur | Lecteur d’e-mail AL | 0x000C | 0x018A | 0xE06C | |
Consommateur | Calculatrice AL | 0x000C | 0x0192 | 0xE021 | |
Consommateur | Navigateur de Machine Locale AL | 0x000C | 0x0194 | 0xE06B | |
Consommateur | Recherche | 0x000C | 0x0221 | 0xE065 | |
Consommateur | Accueil | 0x000C | 0x0223 | 0xE032 | |
Consommateur | Précédent | 0x000C | 0x0224 | 0xE06A | |
Consommateur | Suivant | 0x000C | 0x0225 | 0xE069 | |
Consommateur | Arrêt | 0x000C | 0x0226 | 0xE068 | |
Consommateur | Rafraîchissement de la climatisation | 0x000C | 0x0227 | 0xE067 | |
Consommateur | Favoris | 0x000C | 0x022A | 0xE066 |
Remarques :
- Le code de scan SysRq est émis lors de la séquence de touches Alt+Impr. écran
- Le code d'analyse de la touche Break est émis lors de la frappe de Ctrl+Pause.
- Comme indiqué dans les messages de 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 scan est émis uniquement dans l’événement de relâchement de 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 101/102 touches amélioré. Les touches étendues comprennent les touches Alt et Ctrl sur le côté droit du clavier ; les touches Insérer*, Supprimer*, Accueil, Fin, Page précédente, Page suivante et Flèche dans les clusters à gauche du pavé numérique ; la touche Verrouillage numérique ; la touche Pause (Ctrl+Pause) ; la touche Imprimer l'écran ; et les touches Diviser (/) et Entrer sur le pavé numérique. La touche Maj. de droite n’est pas considérée comme une touche étendue ; elle possède un code de scan 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 l'Alt touche était en panne 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 était relâchée.
Indicateur d'état de touche précédent
L’indicateur d’état de clé précédent indique si la clé qui a généré le message de frappe a été précédemment haut ou bas. C'est 1 si la touche était précédemment enfoncée et 0 si la touche était précédemment relâchée. 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 frappe de WM_KEYDOWN et de WM_SYSKEYDOWN générés par la fonctionnalité de répétition automatique. Il est toujours défini sur 1 pour les messages WM_KEYUP et WM_SYSKEYUP.
Indicateur d'état de transition
L’indicateur d’état de transition indique si l’appui sur une touche ou la libération d’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 des personnages
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ère qui inclut le code de caractère et place le message en haut de la file d’attente de messages. L’itération suivante de la boucle de message supprime le message de caractères de la file d’attente et distribue le message à la procédure de fenêtre appropriée.
Cette section traite des rubriques suivantes :
Messages de caractères non système
Une procédure de fenêtre peut recevoir les messages de caractères suivants : WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARet WM_UNICHAR. La fonction TranslateMessage génère un message WM_CHAR ou WM_DEADCHAR lorsqu’il traite un message WM_KEYDOWN. De même, il génère un message WM_SYSCHAR ou WM_SYSDEADCHAR lorsqu’il traite un message WM_SYSKEYDOWN.
Une application qui traite les entrées de clavier ignore généralement tous les messages sauf WM_CHAR et WM_UNICHAR, et transmet tous les autres messages à la fonction DefWindowProc. Notez que WM_CHAR utilise le jeu de caractères UTF-16 (format de transformation Unicode 16 bits) ou 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 des mnémoniques de menu.
Le paramètre wParam de tous les messages de caractères contient le code de caractère correspondant à la touche de caractère qui a été enfoncée. La valeur du code caractère dépend de la classe de fenêtre de la fenêtre qui reçoit le message. Si la version Unicode de la fonctionRegisterClassa été utilisée pour inscrire la classe de fenêtre, 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, voir Enregistrer des classes de fenêtres 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’appui sur une touche qui a été traduit pour produire le message de caractère. Pour plus d’informations, consultez Indicateurs de messages de séquences de touches.
Messages de touches mortes
Certains claviers non anglais contiennent des touches de caractères qui ne sont pas censées produire eux-mêmes des caractères. Au lieu de cela, ils sont utilisés pour ajouter un diacritique au caractère produit par la séquence de touches suivante. Ces touches sont appelées touches mortes. La touche circonflexe sur un clavier allemand est un exemple de touche morte. Pour entrer le caractère composé d’un « o » avec une 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 clé morte. Bien que le paramètre wParam du message WM_DEADCHAR contienne le code de caractère de la touche morte, les applications ignorent généralement ce message. Au lieu de cela, il traite le message WM_CHAR généré par la séquence de touches suivante. Le paramètre wParam du message WM_CHAR contient le code de caractère de la lettre avec le diacritique. Si la séquence de touches suivante génère un caractère qui ne peut pas être combiné à un signe diacritique, le système génère deux messages WM_CHAR. Le paramètre wParam du premier contient le code de caractère de la diacritique ; le paramètre wParam du second contient le code de caractère de la clé de caractère suivante.
La fonction TranslateMessage génère le message WM_SYSDEADCHAR lorsqu’il 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 en plus de 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 clé virtuelle au moment où le message actuel a été généré ; il peut utiliser la fonction GetAsyncKeyState pour récupérer l’état actuel d’une clé virtuelle.
Certaines touches sont considérées comme des touches de bascule qui modifient l’état de la disposition du clavier. Les touches bascules comprennent généralement les touches Verr. maj. (VK_CAPITAL), Verr. num. (VK_NUMLOCK) et Arrêt défil. (VK_SCROLL). La plupart des claviers ont des indicateurs LED correspondants pour ces touches.
La disposition du clavier conserve une liste de noms. Le nom d’une clé qui produit un caractère unique est le même que celui produit par la clé. Le nom d'une touche non codée telle que Tab et Entrée est stocké sous forme de chaîne de caractères. Une application peut récupérer le nom de n’importe quelle touche de la disposition du clavier en appelant la fonction GetKeyNameText.
Touches de frappe et traductions de caractères
Le système comprend plusieurs fonctions spéciales qui traduisent des codes d’analyse, des codes de caractères et des codes de touche virtuelle fournis par différents messages de frappe. Ces fonctions incluent MapVirtualKey, ToAscii, ToUnicodeet VkKeyScan.
En outre, Microsoft Rich Edit 3.0 prend en charge l'hexToUnicode IME, ce qui permet à un utilisateur de convertir des caractères hexadécimaux et Unicode à l’aide de touches chaudes. Cela signifie que lorsque Microsoft Rich Edit 3.0 est incorporé dans une application, l’application héritera des fonctionnalités de l’IME HexToUnicode.
Prise en charge des touches d’accès rapide
Une touche d’accès rapide est une combinaison de touches qui génère un message WM_HOTKEY, un message que le système place en tête de la file d’attente des messages d’un thread, en contournant tous les messages existants dans la file d’attente. Les applications utilisent les touches d’accès rapide pour obtenir de l’utilisateur une entrée de clavier prioritaire. Par exemple, en définissant une touche à chaud composée de la combinaison de touches ctrl+C , une application peut permettre à l’utilisateur d’annuler une longue opération.
Pour définir une clé chaude, une application appelle la fonctionRegisterHotKey, en spécifiant la combinaison de clés qui génère le message WM_HOTKEY, le handle vers la fenêtre pour recevoir le message et l’identificateur de la clé chaude. Lorsque l’utilisateur appuie sur la touche chaude, 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 de la clé chaude. L’application peut définir plusieurs clés chaudes pour un thread, mais chaque clé chaude du thread doit avoir un identificateur unique. Avant la fin de l’application, elle doit utiliser la fonction UnregisterHotKey pour détruire la clé chaude.
Les applications peuvent utiliser un contrôle de touche chaude pour faciliter le choix d’une clé chaude par l’utilisateur. Les contrôles de raccourci clavier sont généralement utilisés pour définir une touche de raccourci 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 touche chaude envoie généralement le message WM_SETHOTKEY pour définir la clé chaude. Chaque fois que l’utilisateur appuie sur la touche chaude, le système envoie un message WM_SYSCOMMAND spécifiant SC_HOTKEY. Pour plus d’informations sur les contrôles à clé chaude, consultez « Utilisation de contrôles à clé chaude » dans contrôles de touches chaudes.
Touches clavier pour la navigation et d’autres fonctions
Windows prend en charge les claviers avec des 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 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 dans 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 enverra également le message WM_APPCOMMAND à sa fenêtre parente. 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 sur un clic droit et le bulle à son parent. En outre, si DefWindowProc reçoit un message WM_APPCOMMAND pour une fenêtre de niveau supérieur, il appelle un hook shell 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 prennent en charge la navigation vers l’avant et l’arrière du navigateur. Pour plus d’informations, consultez Boutons XBUTTON.
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 se mêle aux é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, il peut 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, telle que 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 aux États-Unis. Les applications utilisent des valeurs, appelées identificateurs de langue , pour identifier de manière unique les langues et les sous-anguages.
Les applications utilisent généralement des paramètres régionaux pour définir la langue dans laquelle les entrées et les sorties sont traitées. La définition des paramètres régionaux du 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 le langage d’entrée actuel et détermine les valeurs de caractères générées par les touches et combinaisons de touches.
Chaque disposition de clavier est associée à un handle qui identifie la disposition et la langue. Le mot de poids faible du handle est un identificateur de langue. Le mot de poids 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 à l’aide de 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 bascule entre eux. Lorsque l’utilisateur clique sur du texte marqué avec une autre langue, 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 n’est 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 soit l'identifiant de la disposition du clavier, soit un identifiant de langue à extension nulle. Les poignées de disposition du clavier peuvent être obtenues à l'aide des fonctions 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 du clavier actif pour le thread appelant. Si une application crée la disposition active à l’aide de la fonctionLoadKeyboardLayout, GetKeyboardLayoutName récupère la même chaîne utilisée pour créer la disposition. Sinon, la chaîne est l’identificateur de langue primaire correspondant aux paramètres régionaux de la disposition active. Cela signifie que la fonction ne peut pas nécessairement différencier les différentes dispositions avec la même langue primaire, de sorte qu’elle ne peut pas retourner des 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 rend la disposition accessible à l’utilisateur. Les applications peuvent rendre la disposition immédiatement active pour le thread actuel à l’aide de la valeur KLF_ACTIVATE. Une application peut utiliser la valeur KLF_REORDER pour réorganiser les dispositions sans également spécifier la valeur KLF_ACTIVATE. Les applications doivent toujours utiliser la valeur KLF_SUBSTITUTE_OK lors du chargement des dispositions du clavier pour vous 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 de KLF_REPLACELANG et de KLF_NOTELLSHELL. L’indicateur KLF_REPLACELANG dirige la fonction pour 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 de notifier l’interpréteur de commandes lorsqu’une disposition du clavier est ajoutée ou remplacée. Cette option est utile pour les applications qui ajoutent plusieurs dispositions dans une série d’appels consécutifs. Cet indicateur doit être utilisé dans tous les appels sauf le dernier.
La fonction UnloadKeyboardLayout est limitée car 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 disponible pour entrer du texte à l’aide du même jeu de caractères que celui utilisé par l’interpréteur de commandes et le système de fichiers.