Il y a apparemment beaucoup de malentendus à ce sujet!
La seule différence pratique entre KeyDown
et KeyPress
est que KeyPress
relaie le caractère résultant d'une pression sur une touche et n'est appelé que s'il y en a une.
En d'autres termes, si vous appuyez Asur votre clavier, vous obtiendrez cette séquence d'événements:
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifiers = Keys.None
- KeyPress: KeyChar = 'a'
- KeyUp: KeyCode = Keys.A
Mais si vous appuyez sur Shift+ A, vous obtiendrez:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Si vous maintenez les touches enfoncées pendant un moment, vous obtiendrez quelque chose comme:
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
- KeyPress: KeyChar = 'A'
- KeyUp: KeyCode = Keys.A
- KeyUp: KeyCode = Keys.ShiftKey
Remarquez qui KeyPress
se produit entre KeyDown
et KeyUp
, pas après KeyUp
, comme beaucoup d'autres réponses l'ont indiqué, qui KeyPress
n'est pas appelé lorsqu'un personnage n'est pas généré, et qui KeyDown
est répété pendant que la touche est maintenue enfoncée, également contrairement à de nombreuses autres réponses .
Exemples de clés qui ne donnent pas directement lieu à des appels à KeyPress
:
- Shift, Ctrl,Alt
- F1 à travers F12
- Touches directionnelles
Des exemples de touches qui font suite à des appels à KeyPress
:
- Aà travers Z, à 0travers 9, etc.
- Spacebar
- Tab (KeyChar = '\ t', ASCII 9)
- Enter (KeyChar = '\ r', ASCII 13)
- Esc (KeyChar = '\ x1b', ASCII 27)
- Backspace (KeyChar = '\ b', ASCII 8)
Pour les curieux, KeyDown
correspond à peu près à WM_KEYDOWN
, KeyPress
à WM_CHAR
et KeyUp
à WM_KEYUP
. WM_KEYDOWN
peut être appelé moins que le nombre de répétitions de touches, mais il envoie un nombre de répétitions, qui, IIRC, WinForms utilise pour générer exactement un KeyDown par répétition.
ProcessDialogKey
et renvoyez false lorsquekeyData
estKeys.Tab
ouKeys.Shift | Keys.Tab
, vous verrez la touche Tab dans la touche (Marche) (Bas | Appuyez sur | Haut).L'événement KeyPress n'est pas déclenché par des clés sans caractère; cependant, les clés sans caractère déclenchent les événements KeyDown et KeyUp.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
la source
KeyPress n'est déclenché que par des caractères imprimables et est déclenché après l'événement KeyDown. En fonction des paramètres de délai de saisie, il peut y avoir plusieurs événements KeyDown et KeyPress, mais un seul événement KeyUp.
KeyDown
KeyPress
KeyUp
la source
KeyPress est un niveau d'abstraction plus élevé que KeyDown (et KeyUp). KeyDown et KeyUp sont liés au matériel: l'action réelle d'une touche sur le clavier. KeyPress est plus "j'ai reçu un caractère du clavier".
la source
Depuis MSDN:
De plus, KeyPress vous donne une chance de déclarer l'action comme " gérée " pour l'empêcher de faire quoi que ce soit.
la source
Handled
propriété est inopérante pour KeyUp (SuppressKeyPress
est également inopérante).J'ai toujours pensé que le keydown se produisait dès que vous appuyez sur la touche vers le bas, la pression sur une touche est l'action d'appuyer sur la touche et de la relâcher.
j'ai trouvé ceci qui donne une explication un peu différente: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
la source
Keydown appuie sur la touche sans la relâcher, Keypress est un cycle complet de pression et de relâchement.
En d'autres termes, KeyDown + KeyUp = Keypress
la source
Du développeur de blogs :
Afin de comprendre la différence entre la touche enfoncée et la pression d'une touche, il est utile de comprendre la différence entre un «caractère» et une «touche» . Une «touche» est un bouton physique sur le clavier de l'ordinateur tandis qu'un «caractère» est un symbole tapé en appuyant sur un bouton. En théorie, les événements keydown et keyup représentent des touches pressées ou relâchées, tandis que l'événement keypress représente un caractère tapé. La mise en œuvre de la théorie n'est pas la même dans tous les navigateurs.
Remarque: vous pouvez également essayer le Key Event Tester (disponible sur le site mentionné ci-dessus) pour comprendre ce concept.
la source
KEYUP ne sera capturé qu'une seule fois, lors du relâchement de la touche enfoncée, quelle que soit la durée pendant laquelle la touche sera maintenue enfoncée, donc si vous souhaitez capturer cette pression une seule fois, KEYUP est l'événement approprié à capturer.
la source
KeyPress
événement est déclenché pour chaque caractère généré à partir de l'entrée, à la fois en réponse à des pressions de touches physiques et lorsque le caractère est le résultat de la fonction de répétition automatique. Le fonctionnement de la saisie au clavier documente ce comportement.Explication la plus simple:
J'ai maintenu la touche «d» enfoncée pendant une seconde puis relâchée.
dddddd
l'événement keydown s'est produit une fois avant que le premier d n'apparaisse à l'écran, l'événement keypress s'est produit 6 fois et l'événement keyup s'est produit après que le dernier d est apparu à l'écran.
la source