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

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

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’un appui sur une touche et n’est appelé que s’il en existe un.

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

  1. KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modifiers = Keys.None
  2. KeyPress: KeyChar = ‘a’
  3. KeyUp: KeyCode = Keys.A

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

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  2. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  3. KeyPress: KeyChar = ‘A’
  4. KeyUp: KeyCode = Keys.A
  5. KeyUp: KeyCode = Keys.ShiftKey

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

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  2. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  3. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  4. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  5. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modifiers = Keys.Shift
  6. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  7. KeyPress: KeyChar = ‘A’
  8. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  9. KeyPress: KeyChar = ‘A’
  10. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  11. KeyPress: KeyChar = ‘A’
  12. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  13. KeyPress: KeyChar = ‘A’
  14. KeyDown: KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = Keys.Shift
  15. KeyPress: KeyChar = ‘A’
  16. KeyUp: KeyCode = Keys.A
  17. KeyUp: KeyCode = Keys.ShiftKey

Notez que KeyPress se produit entre KeyDown et KeyUp , pas après KeyUp , comme beaucoup d’autres réponses l’ont déclaré, que KeyPress n’est pas appelée lorsqu’un caractère n’est pas généré et que KeyDown est répété tant que la clé est maintenue enfoncée. à beaucoup d’autres réponses.

Des exemples de clés n’entraînant pas directement d’appels à KeyPress :

  • Maj , Ctrl , Alt
  • F1 à F12
  • Touches directionnelles

Exemples de touches qui entraînent des appels à KeyPress :

  • A à Z , 0 à 9 , etc.
  • Barre d'espace
  • Tab (KeyChar = ‘\ t’, ASCII 9)
  • Entrez (KeyChar = ‘\ r’, ASCII 13)
  • Esc (KeyChar = ‘\ x1b’, ASCII 27)
  • Retour arrière (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 clé, mais il envoie un nombre de répétitions, qui, IIRC, WinForms utilise pour générer exactement un KeyDown par répétition.

L’événement KeyPress n’est pas déclenché par des touches non caractéristiques. Cependant, les clés non caractéristiques déclenchent les événements KeyDown et KeyUp.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx

KeyPress est uniquement déclenché par des caractères imprimables et est déclenché après l’événement KeyDown. Selon les parameters de délai de saisie, il peut y avoir plusieurs événements KeyDown et KeyPress, mais un seul événement KeyUp.

Touche Bas
Appuyez sur la touche
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 du clavier. KeyPress est plus “J’ai reçu un personnage du clavier”.

De MSDN:

Les événements clés se produisent dans l’ordre suivant:

  1. Touche Bas

  2. Appuyez sur la touche

  3. KeyUp

De plus, KeyPress vous donne la possibilité de déclarer l’action ” traitée ” pour l’empêcher de faire quoi que ce soit.

J’ai toujours pensé que Keydown se produisait dès que vous appuieriez sur la touche, la pression sur la touche était 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 :

Pour comprendre la différence entre keydown et keypress, il est utile de comprendre la différence entre un “caractère” et une “clé” . Une “clé” est un bouton physique sur le clavier de l’ordinateur, tandis qu’un “caractère” est un symbole saisi 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 saisi. La mise en œuvre de la théorie n’est pas la même dans tous les navigateurs.

Note: Vous pouvez également essayer le Key Event Tester (disponible sur le site susmentionné) pour comprendre ce concept.

KEYUP sera capturé une seule fois, lors de la libération de la touche pressée, quelle que soit la durée de maintien de la touche, donc si vous souhaitez capturer une telle pression une seule fois, KEYUP est l’événement approprié à capturer.

Explication la plus simple:

J’ai appuyé sur la touche ‘d’ pendant une seconde puis j’ai relâché.

dddddd

l’événement keydown s’est produit une fois avant que le premier apparaisse à l’écran, l’événement de frappe s’est produit 6 fois et l’événement de saisie s’est produit après que le dernier d soit apparu à l’écran.