Condividi tramite


Panoramica dell'uso della tastiera

Nei Windows Forms, l'input dell'utente viene inviato alle applicazioni sotto forma di messaggi di Windows . Una serie di metodi sottoponibili a override elabora questi messaggi a livello di applicazione, modulo e controllo. Quando questi metodi ricevono messaggi da tastiera, generano eventi che possono essere gestiti per ottenere informazioni sull'input da tastiera. In molti casi, le applicazioni Windows Form sono in grado di elaborare tutti gli input dell'utente semplicemente gestendo questi eventi. In altri casi, un'applicazione potrebbe dover eseguire l'override di uno dei metodi che elaborano i messaggi per intercettare un determinato messaggio prima che venga ricevuto dall'applicazione, dal modulo o dal controllo.

Eventi della tastiera

Tutti i controlli Windows Form ereditano un set di eventi correlati all'input del mouse e della tastiera. Ad esempio, un controllo può gestire l'evento KeyPress per determinare il codice carattere di un tasto premuto. Per altre informazioni, vedere Uso degli eventi della tastiera.

Metodi che elaborano i messaggi di input dell'utente

I moduli e i controlli hanno accesso all'interfaccia IMessageFilter e a un set di metodi sostituibili che elaborano i messaggi di Windows in punti diversi nella coda dei messaggi. Questi metodi hanno tutti un parametro Message, che incapsula i dettagli di basso livello dei messaggi di Windows. È possibile implementare o eseguire l'override di questi metodi per esaminare il messaggio e quindi consumare il messaggio o passarlo al consumatore successivo nella coda dei messaggi. Nella tabella seguente vengono illustrati i metodi che elaborano tutti i messaggi di Windows in Windows Form.

Metodo Note
PreFilterMessage Questo metodo intercetta i messaggi Windows in coda (noti anche come pubblicati) a livello dell'applicazione.
PreProcessMessage Questo metodo intercetta i messaggi di Windows a livello di modulo e di controllo prima dell'elaborazione.
WndProc Questo metodo elabora i messaggi di Windows sia a livello di modulo che di controllo.
DefWndProc Questo metodo esegue l'elaborazione predefinita dei messaggi di Windows a livello di modulo e controllo. In questo modo viene fornita la funzionalità minima di una finestra.
OnNotifyMessage Questo metodo intercetta i messaggi a livello di modulo e controllo, dopo l'elaborazione. Per chiamare questo metodo, è necessario impostare il bit di stile EnableNotifyMessage.

I messaggi tramite tastiera e mouse vengono elaborati da un set aggiuntivo di metodi sostituibili specifici di tali tipi di messaggi. Per altre informazioni, vedere la sezione chiavi di pre-elaborazione.

Tipi di chiavi

Windows Form identifica l'input da tastiera come codici di tasti virtuali rappresentati dall'enumerazione bit per bit Keys. Con l'enumerazione Keys, è possibile combinare una serie di tasti premuti per ottenere un singolo valore. Questi valori corrispondono ai valori che accompagnano i messaggi di WM_KEYDOWN e WM_SYSKEYDOWN Windows. È possibile rilevare la pressione della maggior parte dei tasti fisici gestendo gli eventi KeyDown o KeyUp. I tasti carattere sono un insieme parziale dell'enumerazione Keys e corrispondono ai valori che accompagnano i messaggi Windows WM_CHAR e WM_SYSCHAR. Se la combinazione di tasti premuti restituisce un carattere, è possibile rilevare il carattere gestendo l'evento KeyPress. In alternativa, è possibile usare Keyboard, esposto dall'interfaccia di programmazione di Visual Basic, per individuare quali tasti sono stati premuti e inviare i tasti. Per altre informazioni, vedere Accesso alla tastiera (Visual Basic).

Ordine degli eventi della tastiera

Come elencato in precedenza, esistono tre eventi correlati alla tastiera che possono verificarsi in un controllo. La sequenza seguente mostra l'ordine generale degli eventi:

  1. L'utente esegue il push della chiave A , la chiave viene pre-elaborata, inviata e si verifica un KeyDown evento.
  2. L'utente contiene la chiave A , la chiave viene pre-elaborata, inviata e si verifica un KeyPress evento. Questo evento si verifica più volte quando l'utente contiene una chiave.
  3. L'utente rilascia la chiave A , la chiave viene pre-elaborata, inviata e si verifica un KeyUp evento.

Chiavi di pre-elaborazione

Come avviene per altri messaggi, i messaggi da tastiera vengono elaborati nel metodo WndProc di un form o di un controllo. Tuttavia, prima dell'elaborazione dei messaggi da tastiera, il metodo PreProcessMessage chiama uno o più metodi che possono essere sottoposti a override per gestire tasti di carattere speciali e tasti fisici. È possibile eseguire l'override di questi metodi per rilevare e filtrare determinate chiavi prima che il controllo elabori i messaggi. Nella tabella seguente viene mostrata l'azione che viene eseguita e il metodo correlato che viene applicato, nell'ordine di esecuzione del metodo.

Pre-elaborazione di un evento KeyDown

Azione Metodo correlato Note
Verificare la presenza di un tasto di comando, come un acceleratore o un tasto di scelta rapida del menu. ProcessCmdKey Questo metodo elabora una chiave di comando, che ha la precedenza sulle chiavi normali. Se questo metodo restituisce true, il messaggio della chiave non viene inviato e non si verifica un evento di chiave. Se restituisce false, IsInputKey viene chiamato.
Verificare se c'è una chiave speciale che richiede preprocessazione o se un tasto carattere normale deve generare un evento KeyDown e essere inviato a un controllo. IsInputKey Se il metodo restituisce true, significa che il controllo è un carattere standard e viene generato un evento KeyDown. Se false, allora si chiama ProcessDialogKey. Nota: Per assicurarsi che un controllo ottenga una chiave o una combinazione di tasti, è possibile gestire l'evento PreviewKeyDown e impostare IsInputKey del PreviewKeyDownEventArgs su true per la chiave o i tasti desiderati.
Verificare la presenza di un tasto di spostamento (ESC, TAB, Ritorno o tasti di direzione). ProcessDialogKey Questo metodo elabora una chiave fisica che impiega funzionalità particolari all'interno del controllo, come il cambio di stato attivo tra il controllo e il relativo elemento padre. Se il controllo immediato non gestisce la chiave, ProcessDialogKey viene chiamato sul controllo padre e così via, al controllo più in alto nella gerarchia. Se questo metodo restituisce true, la pre-elaborazione è completa e non viene generato un evento chiave. Se restituisce false, si verifica un evento KeyDown.

Elaborazione preliminare per un evento KeyPress

Azione Metodo correlato Note
Verificare che il tasto sia un carattere normale che dovrebbe essere elaborato dal controllo IsInputChar Se il carattere è un carattere normale, questo metodo restituisce true, viene generato l'evento KeyPress e non si verifica alcuna ulteriore pre-elaborazione. In caso contrario, viene chiamato ProcessDialogChar.
Controllare se il carattere è un mnemonico (ad esempio &OK su un pulsante) ProcessDialogChar Questo metodo, simile a ProcessDialogKey, viene richiamato nella gerarchia dei controlli. Se il controllo è un controllo contenitore, verifica la presenza di mnemonic chiamando ProcessMnemonic su se stesso e sui relativi controlli figlio. Se ProcessDialogChar restituisce true, non si verifica un KeyPress evento.

Elaborazione dei messaggi della tastiera

Dopo che i messaggi della tastiera raggiungono il WndProc metodo di una maschera o controllo, vengono elaborati da un set di metodi che possono essere sovrascritti. Ognuno di questi metodi restituisce un valore Boolean che specifica se il messaggio della tastiera è stato elaborato e utilizzato dal controllo . Se uno dei metodi restituisce true, il messaggio viene considerato gestito e non viene passato alla base o all'elemento padre del controllo per un'ulteriore elaborazione. In caso contrario, il messaggio rimane nella coda dei messaggi e potrebbe essere elaborato in un altro metodo nella base o nell'elemento padre del controllo. La tabella seguente presenta i metodi che elaborano i messaggi da tastiera.

Metodo Note
ProcessKeyMessage Questo metodo elabora tutti i messaggi della tastiera ricevuti dal metodo WndProc del controllo.
ProcessKeyPreview Questo metodo invia il messaggio della tastiera all'elemento padre del controllo. Se ProcessKeyPreview restituisce true, non viene generato alcun evento di chiave, altrimenti viene chiamato ProcessKeyEventArgs.
ProcessKeyEventArgs Questo metodo genera gli eventi KeyDown, KeyPresse KeyUp, in base alle esigenze.

Sovrascrittura dei metodi di input della tastiera

Esistono molti metodi disponibili per l'override quando un messaggio da tastiera viene pre-elaborato ed elaborato; tuttavia, alcuni metodi sono scelte migliori rispetto ad altre. La tabella seguente illustra le attività da eseguire e il modo migliore per eseguire l'override dei metodi della tastiera. Per ulteriori informazioni sull'override dei metodi, consultare Ereditarietà (Guida per programmatori C#) o Ereditarietà (Visual Basic)

Attività Metodo
Intercettare un tasto di navigazione e generare un evento KeyDown. Ad esempio, si vuole che Tab e INVIO vengano gestiti in una casella di testo. Eseguire l'override di IsInputKey. In alternativa, è possibile gestire l'evento PreviewKeyDown e impostare il IsInputKey di PreviewKeyDownEventArgs su true per la chiave o le chiavi desiderate.
Eseguire una speciale gestione di input o di navigazione su un controllo. Ad esempio, si vuole che l'uso dei tasti di direzione nel controllo elenco modifichi l'elemento selezionato. Sovrascrivere ProcessDialogKey
Intercettare un tasto di navigazione e generare un evento KeyPress. Ad esempio, in un controllo casella combinata si desidera che la pressione di più tasti freccia acceleri la progressione tra gli elementi. Eseguire l'override di IsInputChar.
Gestisci in modo speciale l'input o la navigazione durante un evento KeyPress. Ad esempio, in un controllo elenco tenendo premuto il tasto R si salta tra gli elementi che iniziano con la lettera r. Sovrascrivere ProcessDialogChar
Eseguire la gestione personalizzata dei mnemotici; ad esempio, si vogliono maneggiare mnemotici sui pulsanti a disegno personalizzato contenuti in una barra degli strumenti. Eseguire l'override di ProcessMnemonic.

Vedere anche