web-dev-qa-db-fra.com

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 ça 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. Quelle est donc la différence exacte entre eux.

57
reggie
  • 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 enfoncé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 enfoncée puis relâchée, dans l'ordre que j'ai décrit ci-dessus.

60
Roy T.

La documentation MSDN 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 levé dès que l'utilisateur appuie sur une touche du clavier, alors qu'ils le maintiennent toujours.

KeyPress est augmenté pour caractère touches (contrairement à KeyDown et KeyUp, qui sont également relevés pour les touches autres que les caractères) lorsque la touche est enfoncée. Il s'agit d'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 levé après que l'utilisateur a relâché 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 jusqu'à ce que après l'utilisateur relâche la clé. Et puisque KeyUp est un événement de niveau inférieur à KeyPress, vous aurez toujours beaucoup d'informations à portée de main sur la touche qui a été enfoncée, et cela fonctionnera même pour la gestion des non-caractères clés.


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

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

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

Vous disposez d'une zone de liste et appuyez sur la touche Entrée sur une ligne pour appeler une boîte de dialogue de l'éditeur. Problème: si l'utilisateur appuie sur la touche Entrée du bouton OK de l'éditeur, un événement KeyUp (e.KeyCode = Enter) retournera dans votre zone de liste, provoquant 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 (e.g. 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 est une action qui peut être effectuée dans un produit couramment utilisé, par exemple Microsoft Office, tel que CTRL + A (pour `` Sélectionner tout ''), alors j'imite le comportement de Microsoft, car c'est à cela que les utilisateurs sont habitués.

7
Jim C

KeyDown puis KeyPress puis KeyUp est la commande que je trouve.

Habituellement, vous voulez accrocher KeyDown lorsqu'il s'agit d'une application où un utilisateur maintient une touche pour une entrée multimode avec modification du mode de la touche de contrôle, comme dans une opération Maj-clic. KeyPress est pour une logique de type d'entrée de clé simple - juste pour obtenir les touches. KeyUp est accroché pour mettre en logique qui s'exécute après que quelque chose d'autre traite KeyPress, comme pour modifier le contenu d'une zone d'édition de texte après que sa logique KeyPress principale soit entrée en vigueur. Franchement, je n'utilise pas beaucoup KeyUp, mais parfois c'est le seul moyen d'obtenir un message après que quelque chose d'autre a traité KeyPress et vous devez vérifier/corriger ce qui s'est passé.

2
Christo

En plus des autres réponses:

Lorsque vous essayez de déterminer auquel de ces événements vous devez connecter votre action, gardez à l'esprit que l'événement KeyDown sera déclenché plusieurs fois pendant que la touche est maintenue enfoncée. Parfois, vous voulez ce comportement, parfois non. Sur cette base, je suggère l'utilisation suivante (en fonction de mon expérience):

(Ordre dans lequel les événements sont déclenchés)

Touche Bas

se produit: lorsque la touche est enfoncée et maintenue enfoncée
tilisation: Effectuer une action immédiatement en appuyant sur le bouton ou même plusieurs fois en le maintenant enfoncé
Exemple: Déplacement du curseur avec les touches fléchées

.

Appuyez sur la touche

se produit: La touche de caractère est enfoncée (événement de niveau supérieur)
tilisation: Tout ce qui concerne la saisie
Exemple: Gérer la saisie de la zone de texte

.

KeyUp

Occurs: La clé est libérée
sage: Effectuer une action critique qui ne doit se produire qu'une seule fois par frappe
Exemple: Écrire des données dans un fichier

1
marsze