Differenza tra l’evento KeyDown, l’evento KeyPress e l’evento KeyUp in Visual Studio

Qualcuno può dirmi la differenza tra l’evento KeyDown , l’evento KeyPress e l’evento KeyUp ? Ho controllato il sito msdn e non lo spiega molto.

Qualcuno può dirmi in senso logico quando si verifica l’evento? Sento che tutto quanto sopra si verifica quando viene premuto un tasto. Quindi qual è la differenza esatta tra loro.

  • KeyDown: accade quando la persona preme un tasto (quando la tastiera rileva per la prima volta un dito su un tasto, questo accade quando si preme il tasto).

  • KeyPress: succede quando un tasto viene premuto e poi rilasciato.

  • KeyUp: succede quando la chiave viene rilasciata

Hai ragione che tutti questi eventi si verificano quando un tasto viene premuto e poi rilasciato, nell’ordine che ho descritto sopra.

Hmm, non sono sicuro di quanto attentamente hai controllato la documentazione MSDN. Indica l’ordine in cui i tre eventi si verificano in modo abbastanza chiaro:

Gli eventi chiave si verificano nel seguente ordine:

  1. KeyDown
  2. KeyPress
  3. KeyUp

KeyDown viene generato non appena l’utente preme un tasto sulla tastiera, mentre continua a tenerlo premuto.

KeyPress viene generato per i tasti dei caratteri (a differenza di KeyDown e KeyUp, che vengono anche sollevati per i tasti non di caratteri) mentre il tasto viene premuto. Questo è un evento di “livello superiore” rispetto a KeyDown o KeyUp e, in quanto tale, sono disponibili dati diversi in EventArgs .

KeyUp viene generato dopo che l’utente ha rilasciato un tasto sulla tastiera.

In generale, dovresti gestire l’evento KeyUp nella tua applicazione. Le azioni non devono essere avviate nell’interfaccia utente fino a quando l’utente non rilascia la chiave. E poiché KeyUp è un evento di livello inferiore rispetto a KeyPress , avrai sempre a portata di mano un’infinità di informazioni sul tasto premuto e funzionerà anche per la gestione di chiavi non di caratteri.


La cosa da notare su tutti questi eventi, tuttavia, è che vengono sollevati solo dal controllo che ha il focus. Ciò significa che se al momento è attivo un controllo pulsante sul modulo, nessuno degli eventi chiave del modulo verrà mai generato. Questo è spesso fonte di confusione per i programmatori nuovi a .NET. Il modo migliore per gestirlo è sovrascrivere il metodo ProcessCmdKey del modulo:

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.A)) { MessageBox.Show("You pressed Ctrl+A!"); } } 

Ecco un caso in cui NON vuoi utilizzare KeyUp:

Si dispone di una casella di riepilogo e premendo il tasto Invio su una riga viene richiamata una finestra di dialogo dell’editor. Problema: se l’utente preme il tasto Invio sul pulsante OK dell’editor, un evento KeyUp (e.KeyCode = Invio) risulterà nuovamente nella casella di riepilogo, provocando la riapertura dell’editor. Questo non succede se l’utente preme la barra spaziatrice sul pulsante OK dell’editor; in tal caso l’evento KeyUp (e.KeyCode = Space) viene gestito dall’editor prima che si chiuda.

Ecco una selezione euristica che uso:

 If I'm handling the Enter key and I need to guard against a case like the one above then I use KeyDown Else if I'm handling key combinations (eg CTRL+C) then I favor* KeyDown (KeyUp can make these awkward) Else if I am allowing press & hold autorepeat then I use KeyDown Else I use KeyUp 

* Se l’azione è quella che può essere eseguita in un prodotto comunemente utilizzato, ad esempio Microsoft Office, ad esempio CTRL + A (per ‘Seleziona tutto’), quindi imito il comportamento di Microsoft, poiché è ciò a cui gli utenti sono abituati.

KeyDown quindi KeyPress quindi KeyUp è l’ordine che trovo.

Solitamente si desidera agganciare KeyDown quando si tratta di un’applicazione in cui un utente tiene premuto un tasto per l’immissione multi-modalità con la modifica della modalità tasto di controllo, come in un’operazione con il tasto MAIUSC. KeyPress è per la logica del tipo di inserimento di chiave semplice – solo ottenendo i tratti di chiave. KeyUp è agganciato per mettere in logica che viene eseguito dopo che qualcun altro elabora KeyPress , come per modificare il contenuto di una casella di testo dopo che la logica KeyPress principale ha avuto effetto. Francamente, non uso molto KeyUp , ma a volte è l’unico modo per ottenere un messaggio dopo che qualcos’altro ha elaborato KeyPress e devi controllare / correggere ciò che è successo.