131 votes

Comment détecter la touche actuellement enfoncée ?

Dans WinForms, vous pouvez connaître, à tout moment, la position actuelle du curseur grâce à la classe Cursor.

La même chose ne semble pas être disponible pour le clavier. Est-il possible de savoir si, par exemple, la touche Shift est enfoncée ?

Est-il absolument nécessaire de suivre chaque notification du clavier (événements KeyDown et KeyUp) ?

8voto

Jason Williams Points 31901

Vous pouvez P/Invoke jusqu'à la fonction Win32 GetAsyncKeyState pour tester n'importe quelle touche du clavier. Vous pouvez transmettre des valeurs de l'enum Keys (par exemple Keys.Shift) à cette fonction, ce qui ne nécessite que quelques lignes de code pour l'ajouter.

5voto

Mahdi Points 41
if ((ModifierKeys == Keys.Control) && ((e.KeyChar & (char)Keys.F) != 0))
{
     // CTRL+F pressed !
}

3voto

Rob Elliott Points 1500
if (Control.ModifierKeys == Keys.Shift)
    //Shift is pressed

La position x/y du curseur est une propriété, une pression sur une touche (comme un clic/mouvement de souris) est un événement. La meilleure pratique consiste généralement à laisser l'interface être pilotée par les événements. La seule fois où vous aurez besoin de ce qui précède est si vous essayez de faire un shift+mouseclick.

3voto

Hardryv Points 520

La meilleure façon que j'ai trouvée pour gérer les entrées clavier sur un Winform est de les traiter après la frappe et avant que le contrôle ciblé ne reçoive l'événement. Microsoft maintient une propriété intégrée au niveau du formulaire appelée .KeyPreview pour faciliter cette chose précise :

public frmForm()
{
    // ...
    frmForm.KeyPreview = true;
    // ...
}

Les événements _KeyDown, _KeyPress et/ou _KeyUp du formulaire peuvent alors être rassemblés pour accéder aux événements d'entrée avant que le contrôle de formulaire ciblé ne les voie, et vous pouvez appliquer une logique de gestion pour capturer l'événement à cet endroit ou l'autoriser à passer au contrôle de formulaire ciblé.

Bien qu'elle ne soit pas aussi structurellement gracieuse que l'architecture de routage d'événements de XAML, elle simplifie considérablement la gestion des fonctions de niveau formulaire dans Winforms. Voir le Notes MSDN sur KeyPreview pour les mises en garde.

Meilleurs vœux...

2voto

g.g Points 21
if (Form.ModifierKeys == Keys.Shift)

fonctionne pour la zone de texte si le code ci-dessus est dans l'événement keydown du formulaire et qu'aucun autre contrôle ne capture l'événement keydown pour la touche enfoncée.

On peut également souhaiter arrêter le traitement des clés avec : e.Handled = true;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X