Partager via


À propos des accélérateurs de clavier

Les accélérateurs sont étroitement liés aux menus. Tous deux fournissent à l’utilisateur l’accès au jeu de commandes d’une application. En règle générale, les utilisateurs s’appuient sur les menus d’une application pour apprendre l’ensemble de commandes, puis passer à l’utilisation d’accélérateurs à mesure qu’ils deviennent plus compétents avec l’application. Les accélérateurs offrent un accès plus rapide et plus direct aux commandes que les menus. Au minimum, une application doit fournir des accélérateurs pour les commandes les plus couramment utilisées. Bien que les accélérateurs génèrent généralement des commandes qui existent en tant qu’éléments de menu, ils peuvent également générer des commandes qui n’ont pas d’éléments de menu équivalents.

Cette section couvre les rubriques suivantes :

Tables accélérateurs

Une table d’accélérateurs se compose d’un tableau de structures ACCEL , chacune définissant un accélérateur individuel. Chaque structure ACCEL comprend les informations suivantes :

  • Combinaison de touches de l’accélérateur.
  • Identificateur de l’accélérateur.
  • Différents indicateurs. Cela inclut un qui spécifie si le système doit fournir des commentaires visuels en mettant en surbrillance l’élément de menu correspondant, le cas échéant, lorsque l’accélérateur est utilisé

Pour traiter les frappes d’accélérateur pour un thread spécifié, le développeur doit appeler la fonction TranslateAccelerator dans la boucle de message associée à la file d’attente de messages du thread. La fonction TranslateAccelerator surveille l’entrée du clavier dans la file d’attente des messages, en vérifiant les combinaisons de touches qui correspondent à une entrée dans la table accélérateur. Lorsque TranslateAccelerator trouve une correspondance, il convertit l’entrée du clavier (c’est-à-dire les messages WM_KEYUP et WM_KEYDOWN ) en message WM_COMMAND ou WM_SYSCOMMAND , puis envoie le message à la procédure de fenêtre de la fenêtre spécifiée. L’illustration suivante montre comment les accélérateurs sont traités.

modèle de traitement de l’accélérateur clavier

Le message WM_COMMAND inclut l’identificateur de l’accélérateur qui a provoqué la génération du message par TranslateAccelerator . La procédure de fenêtre examine l’identificateur pour déterminer la source du message, puis traite le message en conséquence.

Les tables d’accélérateur existent à deux niveaux différents. Le système gère une table d’accélérateur unique à l’échelle du système qui s’applique à toutes les applications. Une application ne peut pas modifier la table d’accélérateur système. Pour obtenir une description des accélérateurs fournis par la table d’accélérateurs système, consultez Affectations de touches d’accélérateur.

Le système gère également les tables d’accélérateur pour chaque application. Une application peut définir n’importe quel nombre de tables accélérateurs à utiliser avec ses propres fenêtres. Un handle 32 bits unique (HACCEL) identifie chaque table. Toutefois, une seule table d’accélérateur peut être active à la fois pour un thread spécifié. Le handle de la table d’accélérateur passé à la fonction TranslateAccelerator détermine la table d’accélérateur active pour un thread. La table d’accélérateur active peut être modifiée à tout moment en passant un autre handle accelerator-table à TranslateAccelerator.

création de Accelerator-Table

Plusieurs étapes sont nécessaires pour créer une table d’accélérateur pour une application. Tout d’abord, un compilateur de ressources est utilisé pour créer des ressources de table accélérateur et les ajouter au fichier exécutable de l’application. Au moment de l’exécution, la fonction LoadAccelerators est utilisée pour charger la table d’accélérateur en mémoire et récupérer le handle dans la table accélérateur. Ce handle est passé à la fonction TranslateAccelerator pour activer la table d’accélérateur.

Une table accélérateur peut également être créée pour une application au moment de l’exécution en passant un tableau de structures ACCEL à la fonction CreateAcceleratorTable . Cette méthode prend en charge les accélérateurs définis par l’utilisateur dans l’application. Comme la fonction LoadAccelerators , CreateAcceleratorTable retourne un handle de table d’accélérateur qui peut être passé à TranslateAccelerator pour activer la table accélérateur.

Le système détruit automatiquement les tables accélérateurs chargées par LoadAccelerators ou créées par CreateAcceleratorTable. Toutefois, une application peut libérer des ressources pendant son exécution en détruisant les tables accélérateurs qui ne sont plus nécessaires en appelant la fonction DestroyAcceleratorTable .

Une table d’accélérateur existante peut être copiée et modifiée. La table accélérateur existante est copiée à l’aide de la fonction CopyAcceleratorTable . Une fois la copie modifiée, un handle de la nouvelle table d’accélérateur est récupéré en appelant CreateAcceleratorTable. Enfin, le handle est passé à TranslateAccelerator pour activer la nouvelle table.

Attributions de touches d’accélérateur

Un code de caractère ASCII ou un code de clé virtuelle peut être utilisé pour définir l’accélérateur. Un code de caractère ASCII rend l’accélérateur sensible à la casse. Ainsi, l’utilisation du caractère ASCII « C » définit l’accélérateur comme ALT+C plutôt que ALT+c. Toutefois, l’utilisation d’accélérateurs respectant la casse peut prêter à confusion. Par exemple, l’accélérateur ALT+C est généré si la touche DE VERROUILLAGE CAPS est enfoncée ou si la touche MAJ est enfoncée, mais pas si les deux sont en panne.

En règle générale, les accélérateurs n’ont pas besoin de respecter la casse, de sorte que la plupart des applications utilisent des codes de clé virtuelle pour les accélérateurs plutôt que des codes caractères ASCII.

Évitez les accélérateurs qui entrent en conflit avec les mnémoniques du menu d’une application, car l’accélérateur remplace le mnémonique, ce qui peut perturber l’utilisateur. Pour plus d’informations sur les mnémoniques de menu, consultez Menus.

Si une application définit un accélérateur qui est également défini dans la table d’accélérateur système, l’accélérateur défini par l’application remplace l’accélérateur système, mais uniquement dans le contexte de l’application. Toutefois, évitez cette pratique, car elle empêche l’accélérateur système d’effectuer son rôle standard dans l’interface utilisateur. Les accélérateurs à l’échelle du système sont décrits dans la liste suivante :

Accélérateur Description
ALT+ÉCHAP Bascule vers l’application suivante.
ALT+F4 Ferme une application ou une fenêtre.
Alt+Trait d'union Ouvre le menu Fenêtre d’une fenêtre de document.
ALT+IMPRIMER L’ÉCRAN Copie une image dans la fenêtre active dans le Presse-papiers.
ALT + BARRE D’ESPACE Ouvre le menu Fenêtre de la fenêtre main de l’application.
ALT+TAB Bascule vers l’application suivante.
CTRL+ECHAP Bascule vers le menu Démarrer .
Ctrl+F4 Ferme la fenêtre de groupe ou de document active.
F1 Démarre le fichier d’aide de l’application, le cas échéant.
IMPR. ÉCRAN Copie une image à l’écran dans le Presse-papiers.
MAJ+ALT+TAB Bascule vers l’application précédente. L’utilisateur doit appuyer longuement sur Alt+Maj tout en appuyant sur TAB.

 

Accélérateurs et menus

L’utilisation d’un accélérateur équivaut à choisir un élément de menu : les deux actions amènent le système à envoyer un WM_COMMAND ou WM_SYSCOMMAND message à la procédure de fenêtre correspondante. Le message WM_COMMAND inclut un identificateur que la procédure de fenêtre examine pour déterminer la source du message. Si un accélérateur a généré le message WM_COMMAND , l’identificateur est celui de l’accélérateur. De même, si un élément de menu a généré le message WM_COMMAND , l’identificateur est celui de l’élément de menu. Étant donné qu’un accélérateur fournit un raccourci pour choisir une commande dans un menu, une application affecte généralement le même identificateur à l’accélérateur et à l’élément de menu correspondant.

Une application traite un accélérateur WM_COMMAND message exactement de la même manière que l’élément de menu correspondant WM_COMMAND message. Toutefois, le message WM_COMMAND contient un indicateur qui spécifie si le message provient d’un accélérateur ou d’un élément de menu, au cas où les accélérateurs doivent être traités différemment de leurs éléments de menu correspondants. Le message WM_SYSCOMMAND ne contient pas cet indicateur.

L’identificateur détermine si un accélérateur génère un message WM_COMMAND ou WM_SYSCOMMAND . Si l’identificateur a la même valeur qu’un élément de menu dans le menu Système, l’accélérateur génère un message WM_SYSCOMMAND . Sinon, l’accélérateur génère un message WM_COMMAND .

Si un accélérateur a le même identificateur qu’un élément de menu et que l’élément de menu est grisé ou désactivé, l’accélérateur est désactivé et ne génère pas de message WM_COMMAND ou WM_SYSCOMMAND . En outre, un accélérateur ne génère pas de message de commande si la fenêtre correspondante est réduite.

Lorsque l’utilisateur utilise un accélérateur qui correspond à un élément de menu, la procédure de fenêtre reçoit les WM_INITMENU et WM_INITMENUPOPUP messages comme si l’utilisateur avait sélectionné l’élément de menu. Pour plus d’informations sur le traitement de ces messages, consultez Menus.

Un accélérateur qui correspond à un élément de menu doit être inclus dans le texte de l’élément de menu.

État de l’interface utilisateur

Windows permet aux applications de masquer ou d’afficher diverses fonctionnalités dans son interface utilisateur. Ces paramètres sont appelés état de l’interface utilisateur. L’état de l’interface utilisateur inclut les paramètres suivants :

  • indicateurs de focus (tels que les rectangles de focus sur les boutons)
  • accélérateurs clavier (indiqués par des soulignements dans les étiquettes de contrôle)

Une fenêtre peut envoyer des messages pour demander une modification de l’état de l’interface utilisateur, interroger l’état de l’interface utilisateur ou appliquer un certain état pour ses fenêtres enfants. Ces messages sont les suivants.

Message Description
WM_CHANGEUISTATE Indique que l’état de l’interface utilisateur doit changer.
WM_QUERYUISTATE Récupère l’état de l’interface utilisateur d’une fenêtre.
WM_UPDATEUISTATE Modifie l’état de l’interface utilisateur.

 

Par défaut, toutes les fenêtres enfants d’une fenêtre de niveau supérieur sont créées avec le même état d’interface utilisateur que leur parent.

Le système gère l’état de l’interface utilisateur pour les contrôles dans les boîtes de dialogue. Lors de la création de la boîte de dialogue, le système initialise l’état de l’interface utilisateur en conséquence. Tous les contrôles enfants héritent de cet état. Une fois la boîte de dialogue créée, le système surveille les frappes de l’utilisateur. Si les paramètres d’état de l’interface utilisateur sont masqués et que l’utilisateur navigue à l’aide du clavier, le système met à jour l’état de l’interface utilisateur. Par exemple, si l’utilisateur appuie sur la touche Tab pour déplacer le focus vers le contrôle suivant, le système appelle WM_CHANGEUISTATE pour rendre les indicateurs de focus visibles. Si l’utilisateur appuie sur la touche Alt, le système appelle WM_CHANGEUISTATE pour rendre les accélérateurs du clavier visibles.

Si un contrôle prend en charge la navigation entre les éléments d’interface utilisateur qu’il contient, il peut mettre à jour son propre état d’interface utilisateur. Le contrôle peut appeler WM_QUERYUISTATE pour récupérer et mettre en cache l’état initial de l’interface utilisateur. Chaque fois que le contrôle reçoit un message WM_UPDATEUISTATE , il peut mettre à jour son état d’interface utilisateur et envoyer un message WM_CHANGEUISTATE à son parent. Chaque fenêtre continue d’envoyer le message à son parent jusqu’à ce qu’elle atteigne la fenêtre de niveau supérieur. La fenêtre de niveau supérieur envoie le message WM_UPDATEUISTATE aux fenêtres de l’arborescence de la fenêtre. Si une fenêtre ne transmet pas le message WM_CHANGEUISTATE , elle n’atteint pas la fenêtre de niveau supérieur et l’état de l’interface utilisateur n’est pas mis à jour.