Come funziona l'input da tastiera
Windows Forms gestisce l'input della tastiera generando eventi di tastiera in risposta ai messaggi di Windows. La maggior parte delle applicazioni Windows Form elabora l'input da tastiera esclusivamente gestendo gli eventi della tastiera. Tuttavia, è necessario comprendere il funzionamento dei messaggi da tastiera in modo da poter implementare scenari di input da tastiera più avanzati, ad esempio l'intercettazione dei tasti prima di raggiungere un controllo. In questo argomento vengono descritti i tipi di dati chiave riconosciuti da Windows Forms e viene fornita una panoramica di come vengono instradati i messaggi da tastiera. Per informazioni sugli eventi della tastiera, vedere Utilizzo degli eventi della tastiera.
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 maggior parte dei tasti fisici gestendo gli eventi KeyDown o KeyUp. I tasti di carattere sono un subset dell'enumerazione Keys e corrispondono ai valori associati ai messaggi di 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.
Ordine degli eventi della tastiera
Come elencato in precedenza, esistono 3 eventi correlati alla tastiera che possono verificarsi in un controllo. La sequenza seguente mostra l'ordine generale degli eventi:
L'utente esegue il push della chiave "a", la chiave viene pre-elaborata, inviata e si verifica un evento KeyDown.
L'utente tiene premuto il tasto "a", il tasto viene pre-elaborato, inviato e si verifica un evento KeyPress.
Questo evento si verifica più volte quando l'utente contiene una chiave.
L'utente rilascia la chiave "a", la chiave viene pre-elaborata, inviata e si verifica un evento KeyUp.
Preprocessamento delle chiavi
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 i messaggi vengano elaborati dal controllo . Nella tabella seguente viene mostrata l'azione che è in corso e il metodo correlato che avviene, nell'ordine in cui si verifica.
Pre-elaborazione di un evento KeyDown
Azione | Metodo correlato | Note |
---|---|---|
Verificare la presenza di un tasto di comando, come un tasto di scelta rapida o una scorciatoia nel 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 , viene chiamato 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 utilizza funzionalità speciali all'interno del controllo, ad esempio il passaggio dello stato attivo tra il controllo e il relativo elemento padre. Se il controllo immediato non gestisce la chiave, il 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. |
Pre-elaborazione 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, verrà chiamato ProcessDialogChar. |
Controllare se il carattere è un mnemonico (ad esempio &OK su un pulsante) | ProcessDialogChar | Questo metodo, simile a ProcessDialogKey, sarà chiamato 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 evento KeyPress. |
Elaborazione dei messaggi da tastiera
Dopo che i messaggi della tastiera raggiungono il metodo WndProc di una form o di un controllo, vengono elaborati da un insieme 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 può 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. |
Sovrascrivere i metodi della tastiera
Esistono molti metodi disponibili per gestire l'override quando un messaggio da tastiera viene pre-elaborato ed elaborato; tuttavia, alcuni metodi sono scelte molto migliori rispetto ad altri. La tabella seguente illustra le attività da eseguire e il modo migliore per eseguire l'override dei metodi della tastiera. Per ulteriori informazioni sulla sovrascrittura dei metodi, vedere Sovrascrittura di proprietà e metodi nelle classi derivate.
Compito | Metodo |
---|---|
Intercettare un tasto di navigazione e generare un evento KeyDown. Ad esempio, si desidera che TAB e Return vengano gestiti in una casella di testo. | Eseguire l'override di IsInputKey.
Nota: In alternativa, è possibile gestire l'evento PreviewKeyDown e impostare IsInputKey del PreviewKeyDownEventArgs su true per la chiave o le chiavi desiderate. |
Effettuare una gestione speciale dell'input o della 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 premere più volte i tasti freccia per accelerare 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 passa tra gli elementi che iniziano con la lettera r. | Eseguire l'override di ProcessDialogChar |
Eseguire la gestione mnemonica personalizzata; ad esempio, si vogliono gestire le mnemoniche per i pulsanti personalizzati dal proprietario contenuti in una barra degli strumenti. | Eseguire l'override di ProcessMnemonic. |
Vedere anche
.NET Desktop feedback