Différence entre l’événement KeyDown, l’événement KeyPress et l’événement KeyUp dans Visual Studio

Quelqu’un peut-il me dire la différence entre l’événement KeyDown , l’événement KeyPress et l’événement KeyUp ? J’ai vérifié le site msdn et il ne l’explique pas beaucoup.

Quelqu’un peut-il me dire dans un sens logique simple quand chacun des événements se produit? Je pense que tout l’événement ci-dessus se produit lorsqu’une touche est enfoncée. Alors, quelle est la différence exacte entre eux?

  • KeyDown: se produit lorsque la personne appuie sur une touche (lorsque le clavier détecte d’abord un doigt sur une touche, cela se produit lorsque la touche est enfoncée).

  • KeyPress: se produit lorsqu’une touche est pressée puis relâchée.

  • KeyUp: se produit lorsque la clé est relâchée

Vous avez raison de dire que tous ces événements se produisent lorsqu’une touche est pressée puis relâchée, dans l’ordre indiqué ci-dessus.

Hmm, je ne suis pas sûr de votre attention sur la documentation MSDN. Il indique l’ordre dans lequel les trois événements se produisent assez clairement:

Les événements clés se produisent dans l’ordre suivant:

  1. Touche Bas
  2. Appuyez sur la touche
  3. KeyUp

KeyDown est KeyDown dès que l’utilisateur appuie sur une touche du clavier pendant qu’il le maintient enfoncé.

KeyPress est KeyPress pour les touches de caractères (contrairement à KeyDown et KeyUp, qui sont également activés pour les touches non caractéristiques) lorsque vous appuyez sur la touche. C’est un événement de “niveau supérieur” que KeyDown ou KeyUp, et en tant que tel, des données différentes sont disponibles dans EventArgs .

KeyUp est KeyUp lorsque l’utilisateur relâche une touche du clavier.

En règle générale, vous devez gérer l’événement KeyUp dans votre application. Les actions ne doivent pas être lancées dans l’interface utilisateur tant que l’utilisateur n’a pas relâché la clé. Et comme KeyUp est un événement de niveau inférieur à celui de KeyPress , vous aurez toujours à scope de main de nombreuses informations sur la touche qui a été pressée, et il fonctionnera même pour manipuler des clés sans caractère.


La chose à noter à propos de tous ces événements, cependant, est qu’ils ne sont soulevés que par le contrôle qui a le focus. Cela signifie que si un contrôle de bouton sur votre formulaire a actuellement le focus, aucun des événements clés de votre formulaire ne sera jamais déclenché. Ceci est souvent déroutant pour les programmeurs nouveaux sur .NET. La meilleure façon de gérer cela est de ProcessCmdKey méthode ProcessCmdKey du ProcessCmdKey :

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.A)) { MessageBox.Show("You pressed Ctrl+A!"); } } 

Voici un cas où vous ne voulez pas utiliser KeyUp:

Vous avez une zone de liste et appuyez sur la touche Entrée sur une ligne pour appeler une boîte de dialog d’édition. Problème: Si l’utilisateur appuie sur la touche Entrée du bouton OK de l’éditeur, un événement KeyUp (e.KeyCode = Enter) sera renvoyé dans votre zone de liste, entraînant la réouverture de l’éditeur. Cela ne se produit pas si l’utilisateur appuie sur la barre d’espace du bouton OK de l’éditeur; Dans ce cas, l’événement KeyUp (e.KeyCode = Space) est géré par l’éditeur avant sa fermeture.

Voici une heuristique de sélection que j’utilise:

 If I'm handling the Enter key and I need to guard against a case like the one above then I use KeyDown Else if I'm handling key combinations (eg CTRL+C) then I favor* KeyDown (KeyUp can make these awkward) Else if I am allowing press & hold autorepeat then I use KeyDown Else I use KeyUp 

* Si l’action peut être effectuée sur un produit couramment utilisé, par exemple Microsoft Office, tel que CTRL + A (pour «Sélectionner tout»), je reproduis le comportement de Microsoft, car c’est ce à quoi les utilisateurs sont habitués.

KeyDown puis KeyPress puis KeyUp est l’ordre que je trouve.

Habituellement, vous voulez accrocher KeyDown pour une application où un utilisateur maintient une touche pour une entrée multimode avec une modification du mode de la clé de contrôle, comme dans une opération de clic. KeyPress est destiné à une logique de type entrée de clé simple – il suffit d’obtenir les touches. KeyUp est accroché pour mettre en place une logique qui s’exécute après d’autres processus de KeyPress , comme pour modifier le contenu d’une boîte d’édition de texte une fois que la logique principale de KeyPress a pris effet. Franchement, je n’utilise pas beaucoup KeyUp , mais parfois c’est la seule façon d’obtenir un message après que quelque chose ait traité KeyPress et que vous devez vérifier / corriger ce qui s’est passé.