202 votes

Ce qui ' la différence entre KeyDown et KeyPress dans .NET ?

Quelle est la différence entre les événements KeyDown et KeyPress dans .NET ?

340voto

P Daddy Points 14228

Apparemment, il y a beaucoup de malentendus à propos de ce!

La seule différence pratique entre KeyDown et KeyPress que KeyPress relais le caractère résultant de l'activation d'une touche, et n'est appelée que si il y en a un.

En d'autres termes, si vous appuyez sur la touche A de votre clavier, vous obtiendrez de cette séquence d'événements:

  1. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un, Modificateur=Touches.Aucun
  2. KeyPress: KeyChar='a'
  3. KeyUp: KeyCode=Touches.Un

Mais si vous appuyez sur Maj+A, vous obtiendrez:

  1. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  2. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  3. KeyPress: KeyChar='A'
  4. KeyUp: KeyCode=Touches.Un
  5. KeyUp: KeyCode=Touches.ShiftKey

Si vous maintenez les touches enfoncées pendant un certain temps, vous obtiendrez quelque chose comme:

  1. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  2. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  3. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  4. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  5. KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
  6. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  7. KeyPress: KeyChar='A'
  8. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  9. KeyPress: KeyChar='A'
  10. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  11. KeyPress: KeyChar='A'
  12. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  13. KeyPress: KeyChar='A'
  14. KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
  15. KeyPress: KeyChar='A'
  16. KeyUp: KeyCode=Touches.Un
  17. KeyUp: KeyCode=Touches.ShiftKey

Notez que KeyPress se produit dans l'entre - KeyDown et KeyUp, pas après KeyUp, comme beaucoup d'autres réponses ont déclaré, KeyPress n'est pas appelée lorsqu'un personnage n'est pas généré, et qu' KeyDown est répétée tant que la touche est maintenue enfoncée, de plus, contrairement à de nombreux autres réponses.

Exemples de touches qui ne sont pas directement le résultat dans des appels d' KeyPress:

  • Maj, Ctrl, Alt
  • F1 par le biais de la touche F12
  • Les touches fléchées

Exemples de touches qui font suite à des appels d' KeyPress:

  • Un par Z, 0 par 9, etc.
  • La barre d'espace
  • Onglet (KeyChar='\t', ASCII 9)
  • Entrée (KeyChar='\r', ASCII 13)
  • Esc (KeyChar='\x1b', ASCII 27)
  • Retour arrière (KeyChar='\b', ASCII 8)

Pour les curieux, KeyDown correspond à peu près à l' WM_KEYDOWN, KeyPress de WM_CHAR, et KeyUp de WM_KEYUP. WM_KEYDOWN peut être appelée à moins que le nombre de répétitions, mais il envoie un nombre de répétitions, qui, autant que je me souvienne, WinForms utilise pour générer exactement un KeyDown par répétition.

77voto

Jon Spokes Points 1273

L’événement KeyPress n’est pas déclenché par les touches ; Toutefois, les touches de type non-caractère déclenchent les événements KeyDown et KeyUp.

http://msdn.Microsoft.com/en-US/Library/System.Windows.Forms.Control.KeyPress.aspx

9voto

Stevo3000 Points 12725

KeyPress est déclenché uniquement par des caractères imprimables et est déclenché après l’événement KeyDown. Selon le retard typage paramètres il peuvent être plusieurs événements KeyDown et KeyPress mais qu’un seul événement KeyUp.

KeyDown
KeyPress
KeyUp

5voto

Jeff Hornby Points 4134

KeyPress est un niveau plus élevé d’abstraction que KeyDown (et KeyUp). KeyDown et KeyUp sont matériel connexe : l’action réelle d’une touche sur le clavier. KeyPress est plus « J’ai reçu un caractère depuis le clavier ».

4voto

Jon B Points 26872

À partir de MSDN:

Les principaux événements se produisent dans l'ordre suivant:

  1. KeyDown

  2. KeyPress

  3. KeyUp

En outre, la pression de Touche vous donne une chance de déclarer l'action comme "manipulé" pour l'empêcher de faire quoi que ce soit.

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