Qual è la differenza tra KeyDown e KeyPress in .NET?


185

Qual'è la differenza tra the KeyDowne KeyPressevents in .net?

Risposte:


308

Apparentemente ci sono molti malintesi su questo!

L'unica differenza pratica tra KeyDowne KeyPressè che KeyPressinoltra il carattere risultante dalla pressione di un tasto e viene chiamata solo se ce n'è una.

In altre parole, se premi Asulla tastiera, otterrai questa sequenza di eventi:

  1. KeyDown: KeyCode = Keys.A, KeyData = Keys.A, Modificatori = Keys.None
  2. KeyPress: KeyChar = 'a'
  3. KeyUp: KeyCode = Keys.A

Ma se premi Shift+ A, otterrai:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = 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

Se tieni premuti i tasti per un po ', otterrai qualcosa del tipo:

  1. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = Keys.Shift
  2. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = Keys.Shift
  3. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = Keys.Shift
  4. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = Keys.Shift
  5. KeyDown: KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, Modificatori = 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

Si noti che si KeyPressverifica tra KeyDown e KeyUp, non dopo KeyUp, come hanno affermato molte altre risposte, che KeyPressnon viene chiamato quando un carattere non viene generato e che KeyDownsi ripete mentre si tiene premuto il tasto, anche in contrasto con molte altre risposte .

Esempi di chiavi che non provocano direttamente chiamate a KeyPress:

  • Shift, Ctrl,Alt
  • F1 attraverso F12
  • Tasti freccia

Esempi di chiavi che fanno seguito a chiamate a KeyPress:

  • Aattraverso Z, 0attraverso 9, ecc.
  • Spacebar
  • Tab (KeyChar = '\ t', ASCII 9)
  • Enter (KeyChar = '\ r', ASCII 13)
  • Esc (KeyChar = '\ x1b', ASCII 27)
  • Backspace (KeyChar = '\ b', ASCII 8)

Per i curiosi, KeyDownapprossimativamente è correlato a WM_KEYDOWN, KeyPressa WM_CHARe KeyUpa WM_KEYUP. WM_KEYDOWN può essere chiamato meno del numero di ripetizioni dei tasti, ma invia un conteggio delle ripetizioni che, IIRC, WinForms utilizza per generare esattamente un KeyDown per ripetizione.


2
Ottima spiegazione, grazie, un avvertimento, Escape non attiva KeyPress su Chrome (non sono sicuro degli altri).
Barney,

3
@BarnabasSzabolcs: Chrome esegue .NET?
P Daddy,

@PDaddy ups, ho trascurato, ho pensato che fosse javascript: D ma con uno stile leggermente strano: P tuttavia, sembra che le regole siano abbastanza simili: DD ... stranamente questa risposta mi ha aiutato molto comunque .. Saluti :)
Barney,

@PDaddy So ​​che almeno Tab non attiva KeyDown o KeyUp per impostazione predefinita
PsychoData

@PsychoData: Questo perché il tasto Tab cambia lo stato attivo, quindi non viene elaborato come input. Se si esegue l'override ProcessDialogKeye si restituisce false quando keyDataè Keys.Tabo Keys.Shift | Keys.Tab, verrà visualizzato il tasto Tab nel tasto (Attivo) (Giù | Premere | Su).
P Daddy,

73

L'evento KeyPress non viene generato da tasti non di carattere; tuttavia, i tasti non di carattere generano gli eventi KeyDown e KeyUp.

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


17
La maggior parte delle altre risposte sono sbagliate in un modo o nell'altro, ma questa si avvicina alla realtà. KeyPress viene generato solo per i tasti carattere e rispetta l'impostazione dei ritardi / ripetizioni di digitazione della tastiera. La sequenza effettiva degli eventi è: 1) KeyDown 2) per il tasto caratteri KeyPress una o più volte (a seconda delle impostazioni di sistema e per quanto tempo si tiene premuto il tasto) 3) KeyUp
Filip Navara

Non ho il rappresentante per farlo, ma qualcuno potrebbe rompere un wiki e combinare il contenuto del commento sopra e la risposta accettata?
Josh Kodroff,

11
Il commento di Filip Navara non è del tutto corretto. Se si tiene premuto un tasto, si ottiene KeyDown, KeyPress, KeyDown, KeyPress, KeyDown, KeyPress KeyUp. KeyDown viene chiamato per ogni ripetizione.
P Daddy,

9

KeyPress viene generato solo da caratteri stampabili e viene generato dopo l'evento KeyDown. A seconda delle impostazioni del ritardo di digitazione, possono esserci più eventi KeyDown e KeyPress ma solo un evento KeyUp.

KeyDown
KeyPress
KeyUp


Sei vicino, ma fuori per la sequenza.
P Daddy,

@P Papà - L'ho corretto, avrei dovuto ricontrollare prima di passare dalla memoria.
stevehipwell,

@ Stevo3000, a proposito: anche i caratteri Unicode non stampabili genereranno eventi KeyPress. Ho un'app che legge i dati inseriti da un lettore di codici a barre in una casella di testo e il lettore include caratteri unicode non stampabili.
Jeff LaFay,

@jlafay - Non secondo MSDN L'evento KeyPress non viene generato da tasti non caratteristici; tuttavia, i tasti non di carattere generano gli eventi KeyDown e KeyUp.
stevehipwell,

@ Stevo3000, non sono sicuro di come lo scanner di codici a barre inserisca il testo in una casella di testo, ma KeyPress si attiva per i caratteri speciali che invia. Il valore inizia con un carattere non stampabile e termina con un carattere non stampabile. Quindi non sono sicuro di come spari se è vero. Forse darò un'occhiata all'assembly .Net che contiene gli eventi con IL Spy per vedere meglio cosa viene effettivamente rilevato.
Jeff LaFay,

5

KeyPress ha un livello di astrazione più elevato rispetto a KeyDown (e KeyUp). KeyDown e KeyUp sono correlati all'hardware: l'azione effettiva di un tasto sulla tastiera. KeyPress è più "Ho ricevuto un personaggio dalla tastiera".


4

Da MSDN:

Gli eventi chiave si verificano nel seguente ordine:

  1. KeyDown

  2. KeyPress

  3. KeyUp

Inoltre, KeyPress ti dà la possibilità di dichiarare l'azione " gestita " per impedirle di fare qualsiasi cosa.


FYI, KeyDown e KeyUp hanno anche una proprietà Gestita che puoi impostare in modo che non sia tra KeyPress e gli altri eventi chiave.
Jeff LaFay,

FWIW sebbene KeyUp, come KeyDown, ottenga un parametro KeyEventArgs la sua Handledproprietà non è operativa per KeyUp ( SuppressKeyPressè anche non operativa).
JonP,


3

Keydown sta premendo il tasto senza rilasciarlo, Keypress è un ciclo completo di press-and-release.

In altre parole, KeyDown + KeyUp = Keypress


3
secondo MSDN, la sequenza di eventi è KeyDown, KeyPress, KeyUp ( msdn.microsoft.com/en-us/library/… )
Nathan Koop

@RobCowell Inoltre, come ha sottolineato jlafay, KeyPress non dipende affatto da KeyDown o KeyUp.
PsychoData

1

Dallo sviluppatore di blog :

Per capire la differenza tra keydown e keypress, è utile capire la differenza tra un "carattere" e una "chiave" . Un "tasto" è un pulsante fisico sulla tastiera del computer mentre un "carattere" è un simbolo digitato premendo un pulsante. In teoria, gli eventi keydown e keyup rappresentano i tasti premuti o rilasciati, mentre l'evento keypress rappresenta un carattere che viene digitato. L'implementazione della teoria non è la stessa in tutti i browser.

Nota: è anche possibile provare Key Event Tester (disponibile sul sito sopra menzionato) per comprendere questo concetto.


1

KEYUP verrà acquisito una sola volta, al rilascio del tasto premuto, indipendentemente dalla durata della pressione del tasto, quindi se si desidera acquisire tale pressione una sola volta, KEYUP è l'evento adatto da acquisire.


L' KeyPressevento viene generato per ogni carattere generato dall'input, sia in risposta alla pressione dei tasti fisici sia quando il carattere è il risultato della funzione di autorepeat. Come funziona l'input da tastiera documenta questo comportamento.
Indispensabile dal

Hai ragione. Aggiornerò la mia risposta. La risposta corretta è usare KEYUP che verrà attivato una volta, al rilascio di uno o più tasti premuti.
Michael Haephrati,

Pur non avendo più torto, continua a non rispondere alla domanda che è stata posta. Questo non è utile
Probabile il

0

Spiegazione più semplice:

Ho tenuto premuto il tasto 'd' per un secondo e poi ho rilasciato.

dddddd

l'evento keydown si è verificato una volta prima che il primo d apparisse sullo schermo, l'evento keypress si è verificato 6 volte e l'evento keyup si è verificato dopo che l'ultimo d è apparso sullo schermo.


accidenti, ho letto male la domanda e me l'ho messa in testa intendeva javascript
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.