Funzionamento dell'input da tastiera

Windows Forms elabora gli input della tastiera generando eventi di tastiera in risposta ai messaggi di Windows. La maggioranza delle applicazioni Windows Forms elabora gli input della tastiera tramite la gestione dei relativi eventi. Tuttavia è necessario conoscere il funzionano dei messaggi della tastiera per poter implementare scenari più avanzati di input dalla tastiera, ad esempio l'intercettazione dei tasti prima che raggiungano un controllo. Questo argomento descrive i tipi di dati di tasti che Windows Forms riconosce e fornisce una panoramica del modo in cui vengono instradati i messaggi della tastiera. Per informazioni sugli eventi della tastiera, vedere Utilizzo degli eventi di tastiera.

Tipi di tasti

Windows Form identifica l'input da tastiera come codici di tasto virtuale rappresentati dall'enumerazione bit per Keys bit. 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 Windows WM_KEYDOWN e WM_SYSKEYDOWN. È possibile rilevare la maggior parte dei tasti fisici gestendo gli KeyDown eventi o KeyUp . Le chiavi carattere sono un subset dell'enumerazione Keys e corrispondono ai valori che accompagnano i messaggi di WM_CHAR e WM_SYSCHAR Windows. Se la combinazione di tasti premuti genera 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 i tasti premuti e inviare i tasti. Per altre informazioni, vedere Accesso alla tastiera.

Ordine degli eventi di tastiera

Come indicato in precedenza, ci sono 3 eventi correlati alla tastiera che possono verificarsi in un controllo. La sequenza seguente illustra 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 tiene premuto un tasto.

  3. L'utente rilascia la chiave "a", la chiave viene pre-elaborata, inviata e si verifica un KeyUp evento.

Pre-elaborazione dei tasti

Analogamente ad altri messaggi, i messaggi da tastiera vengono elaborati nel WndProc metodo di una maschera o di un controllo. Tuttavia, prima dell'elaborazione dei messaggi da tastiera, il PreProcessMessage metodo 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 alcuni tasti prima che i messaggi vengano elaborati dal controllo. La tabella seguente mostra l'azione che viene eseguita e il relativo metodo correlato che si verifica, nell'ordine in cui il metodo si verifica.

Pre-elaborazione per un evento KeyDown

Azione Metodo correlato Note
Cercare un tasto di comando, ad esempio un tasto acceleratore o un tasto di menu di scelta rapida. ProcessCmdKey Questo metodo elabora un tasto di comando, che ha la precedenza sui tasti normali. Se questo metodo restituisce true, il messaggio del tasto non viene inviato e non si verifica alcun evento del tasto. Se restituisce false, IsInputKey viene chiamato.
Verificare la presenza di una chiave speciale che richiede la pre-elaborazione o una chiave di carattere normale che deve generare un KeyDown evento e essere inviata a un controllo. IsInputKey Se il metodo restituisce true, significa che il controllo è un carattere normale e viene generato un KeyDown evento. Se false, ProcessDialogKey viene chiamato . Nota: per assicurarsi che un controllo ottenga una chiave o una combinazione di tasti, è possibile gestire l'evento PreviewKeyDown e il PreviewKeyDownEventArgs set IsInputKey di su true per la chiave o le chiavi desiderate.
Cercare un tasto di spostamento (ESC, TAB, INVIO o tasti di direzione). ProcessDialogKey Questo metodo elabora un tasto fisico che impiega funzionalità speciali all'interno del controllo, ad esempio spostando lo 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 alcun evento di tasto. Se restituisce false, si verifica un KeyDown evento.

Pre-elaborazione per un evento KeyPress

Azione Metodo correlato Note
Verificare se il tasto è un carattere normale che deve 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 ProcessDialogChar , verrà chiamato .
Verificare se il carattere è un tasto di scelta (ad esempio &OK su un pulsante) ProcessDialogChar Questo metodo, simile a ProcessDialogKey, verrà chiamato nella gerarchia dei controlli. Se il controllo è un controllo contenitore, verifica la presenza di mnemonic chiamando ProcessMnemonic se stesso e i 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 di un controllo, vengono elaborati da un set di metodi che possono essere sottoposti a override. Ognuno di questi metodi restituisce un Boolean valore 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 della tastiera.

metodo Note
ProcessKeyMessage Questo metodo elabora tutti i messaggi della tastiera ricevuti dal WndProc metodo 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. In caso contrario ProcessKeyEventArgs , viene chiamato .
ProcessKeyEventArgs Questo metodo genera gli KeyDowneventi , KeyPresse KeyUp , in base alle esigenze.

Override dei metodi della tastiera

Sono disponibili molti metodi di cui eseguire l'override quando un messaggio della tastiera viene pre-elaborato ed elaborato, tuttavia alcuni metodi sono preferibili ad altri. La tabella seguente mostra le attività che è possibile eseguire e il modo migliore per eseguire l'override dei metodi della tastiera. Per altre informazioni sull'override dei metodi, vedere Override di proprietà e metodi nelle classi derivate.

Attività metodo
Intercettare un tasto di spostamento e generare un KeyDown evento. Ad esempio si desidera che TAB e INVIO siano gestiti in una casella di testo. Eseguire l'override di IsInputKey. Nota: in alternativa, è possibile gestire l'evento PreviewKeyDown e il set IsInputKey di su PreviewKeyDownEventArgs true per la chiave o le chiavi desiderate.
Eseguire la gestione di input speciali o dello spostamento su un controllo. Ad esempio si desidera che l'uso dei tasti di direzione nel controllo elenco cambi la voce selezionata. Eseguire l'override di ProcessDialogKey.
Intercettare un tasto di spostamento e generare un KeyPress evento. Ad esempio in un controllo casella di selezione si desidera che più pressioni di un tasto di direzione accelerino lo spostamento tra le voci. Eseguire l'override di IsInputChar.
Eseguire una gestione speciale di input o navigazione durante un KeyPress evento. Ad esempio, in un controllo elenco, tenendo premuto il tasto "r" si passa fra le voci che iniziano con la lettera r. Eseguire l'override di ProcessDialogChar.
Eseguire una gestione personalizzata dei tasti di scelta; ad esempio, si desidera gestire i tasti di scelta sui pulsanti disegnati dal proprietario contenuti in una barra degli strumenti. Eseguire l'override di ProcessMnemonic.

Vedi anche