Quelle est la différence entre les événements KeyDownet KeyPressdans .net?
Quelle est la différence entre les événements KeyDownet KeyPressdans .net?
Réponses:
Il y a apparemment beaucoup de malentendus à ce sujet!
La seule différence pratique entre KeyDownet KeyPressest que KeyPressrelaie 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:
Mais si vous appuyez sur Shift+ A, vous obtiendrez:
Si vous maintenez les touches enfoncées pendant un moment, vous obtiendrez quelque chose comme:
Remarquez qui KeyPressse produit entre KeyDown et KeyUp, pas après KeyUp, comme beaucoup d'autres réponses l'ont indiqué, qui KeyPressn'est pas appelé lorsqu'un personnage n'est pas généré, et qui KeyDownest 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:
Des exemples de touches qui font suite à des appels à KeyPress:
Pour les curieux, KeyDowncorrespond à peu près à WM_KEYDOWN, KeyPressà WM_CHARet 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.
ProcessDialogKeyet renvoyez false lorsque keyDataest Keys.Tabou Keys.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
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
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".
Depuis MSDN:
Les événements clés se produisent dans l'ordre suivant:
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.
Handledpropriété est inopérante pour KeyUp ( SuppressKeyPressest é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
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
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.
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.
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.