Quelle est la différence entre les événements KeyDown et KeyPress dans .NET ?
Réponses
Trop de publicités?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:
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un, Modificateur=Touches.Aucun
- KeyPress: KeyChar='a'
- KeyUp: KeyCode=Touches.Un
Mais si vous appuyez sur Maj+A, vous obtiendrez:
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyUp: KeyCode=Touches.Un
- KeyUp: KeyCode=Touches.ShiftKey
Si vous maintenez les touches enfoncées pendant un certain temps, vous obtiendrez quelque chose comme:
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.ShiftKey, KeyData=Touches.ShiftKey, Maj, Modificateurs=Touches.Maj
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyDown: KeyCode=Touches.Une, KeyData=Touches.Un | Des Clés.Maj, Modificateurs=Touches.Maj
- KeyPress: KeyChar='A'
- KeyUp: KeyCode=Touches.Un
- 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.
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