Como funciona a entrada pelo teclado
O Windows Forms processa a entrada do teclado gerando eventos do teclado em resposta a mensagens do Windows. A maioria dos aplicativos do Windows Forms processa a entrada do teclado exclusivamente manipulando os eventos do teclado. No entanto, você precisa entender como as mensagens do teclado funcionam para poder implementar cenários mais avançados de entrada de teclado, como intercetar teclas antes que elas atinjam um controle. Este tópico descreve os tipos de dados principais que o Windows Forms reconhece e fornece uma visão geral de como as mensagens do teclado são roteadas. Para obter informações sobre eventos de teclado, consulte Usando eventos de teclado.
Tipos de chaves
O Windows Forms identifica a entrada do teclado como códigos de teclas virtuais que são representados pela enumeração bit a bit Keys. Com a enumeração Keys, você pode combinar uma série de teclas pressionadas para resultar em um único valor. Esses valores correspondem aos valores que acompanham as mensagens WM_KEYDOWN e WM_SYSKEYDOWN Windows. Você pode detetar a maioria das teclas físicas pressionadas manipulando os eventos KeyDown ou KeyUp. As chaves de caracteres são um subconjunto da enumeração Keys e correspondem aos valores que acompanham as mensagens WM_CHAR e WM_SYSCHAR do Windows. Se a combinação de teclas pressionadas resultar em um caractere, você poderá detetá-lo manipulando o evento KeyPress. Como alternativa, você pode usar Keyboard, exposto pela interface de programação do Visual Basic, para descobrir quais teclas foram pressionadas e enviar teclas. Para obter mais informações, consulte Acessando o teclado.
Ordem dos Eventos do Teclado
Conforme listado anteriormente, há 3 eventos relacionados ao teclado que podem ocorrer em um controle. A sequência a seguir mostra a ordem geral dos eventos:
O usuário pressiona a tecla "a", a chave é pré-processada, despachada e ocorre um evento KeyDown.
O usuário segura a chave "a", a chave é pré-processada, despachada e ocorre um evento KeyPress.
Esse evento ocorre várias vezes quando o usuário segura uma chave.
O usuário libera a chave "a", a chave é pré-processada, despachada e ocorre um evento KeyUp.
Chaves de pré-processamento
Como outras mensagens, as mensagens do teclado são processadas no método WndProc de um formulário ou controle. No entanto, antes que as mensagens do teclado sejam processadas, o método PreProcessMessage chama um ou mais métodos que podem ser substituídos para manipular teclas de caracteres especiais e teclas físicas. Você pode substituir esses métodos para detetar e filtrar determinadas chaves antes que as mensagens sejam processadas pelo controle. A tabela a seguir mostra a ação que está sendo executada e o método relacionado que ocorre, na ordem em que o método ocorre.
Pré-processamento para um evento KeyDown
Ação | Método relacionado | Observações |
---|---|---|
Verifique se há uma tecla de comando, como um acelerador ou atalho de menu. | ProcessCmdKey | Este método processa uma chave de comando, que tem precedência sobre as teclas regulares. Se esse método retornar true , a mensagem de chave não é enviada e um evento de chave não ocorre. Se ele retornar false , IsInputKey é chamado. |
Verifique se há uma chave especial que requer pré-processamento ou uma chave de caractere normal que deve gerar um evento KeyDown e ser despachada para um controle. | IsInputKey | Se o método retornar true , isso significa que o controle é um caractere regular e um evento KeyDown é gerado. Se false , ProcessDialogKey é chamado.
Nota: Para garantir que um controle obtenha uma chave ou combinação de chaves, você pode manipular o evento PreviewKeyDown e definir IsInputKey do PreviewKeyDownEventArgs para true a chave ou chaves desejadas. |
Verifique se há uma tecla de navegação (ESC, TAB, Return ou teclas de seta). | ProcessDialogKey | Este método processa uma tecla física que emprega funcionalidades especiais dentro do controlo, como alternar o foco entre o controlo e o seu elemento-pai. Se o controlo imediato não manipular a chave, o ProcessDialogKey será chamado no controlo pai e assim sucessivamente até ao controlo no topo da hierarquia. Se esse método retornar true , o pré-processamento será concluído e um evento chave não será gerado. Se ele retornar false , ocorrerá um evento KeyDown. |
Pré-processamento para um evento KeyPress
Ação | Método relacionado | Observações |
---|---|---|
Verifique se a chave é um caractere normal que deve ser processado pelo controle | IsInputChar | Se o caractere for um caractere normal, esse método retornará true , o evento KeyPress é gerado e nenhum pré-processamento adicional ocorre. Caso contrário, ProcessDialogChar será chamado. |
Verifique se o carácter é uma mnemónica (como &OK num botão) | ProcessDialogChar | Este método, semelhante ao ProcessDialogKey, será chamado na hierarquia de controlo. Se o controlo for um controlo de contentor, verificará a presença de mnemónicos chamando ProcessMnemonic no próprio controlo e nos seus controlos criança. Se ProcessDialogChar retornar true , um evento KeyPress não ocorrerá. |
Processando mensagens do teclado
Depois que as mensagens do teclado atingem o método WndProc de um formulário ou controle, elas são processadas por um conjunto de métodos que podem ser substituídos. Cada um desses métodos retorna um valor Boolean especificando se a mensagem do teclado foi processada e consumida pelo controle. Se um dos métodos retornar true
, a mensagem será considerada manipulada e não será passada para a base ou pai do controle para processamento posterior. Caso contrário, a mensagem permanece na fila de mensagens e pode ser processada por outro método na base ou no controlador pai. A tabela a seguir apresenta os métodos que processam mensagens de teclado.
Método | Observações |
---|---|
ProcessKeyMessage | Esse método processa todas as mensagens de teclado que são recebidas pelo método WndProc do controle. |
ProcessKeyPreview | Esse método envia a mensagem do teclado para o pai do controle. Se ProcessKeyPreview retornar true , nenhum evento chave será gerado, caso contrário, ProcessKeyEventArgs será chamado. |
ProcessKeyEventArgs | Este método gera os eventos KeyDown, KeyPresse KeyUp, conforme apropriado. |
Substituindo métodos de teclado
Existem muitos métodos disponíveis para sobrescrever quando uma mensagem de teclado é pré-processada e processada; no entanto, alguns métodos são escolhas muito melhores do que outros. A tabela a seguir mostra as tarefas que você pode querer realizar e a melhor maneira de substituir os métodos do teclado. Para obter mais informações sobre métodos de substituição, consulte Substituindo propriedades e métodos em classes derivadas.
Tarefa | Método |
---|---|
Intercepte uma tecla de navegação e gere um evento KeyDown. Por exemplo, você deseja que TAB e Return sejam manipulados em uma caixa de texto. | Substitua IsInputKey.
Nota: Como alternativa, você pode manipular o evento PreviewKeyDown e definir IsInputKey do PreviewKeyDownEventArgs para true a chave ou chaves desejadas. |
Execute uma entrada especial ou manipulação de navegação em um controle. Por exemplo, pretende que o uso das teclas de seta no controlo da lista permita alterar o item selecionado. | Substituir ProcessDialogKey |
Intercepte uma tecla de navegação e gere um evento KeyPress. Por exemplo, em um controle de caixa giratória, você deseja pressionar várias teclas de seta para acelerar a progressão pelos itens. | Substitua IsInputChar. |
Executar um processamento especial de entrada ou navegação durante um evento KeyPress. Por exemplo, em um controle de lista mantendo pressionada a tecla "r" pula entre itens que começam com a letra r. | Substituir ProcessDialogChar |
Realizar manuseamento mnemónico personalizado; Por exemplo, você deseja manipular mnemônicos em botões desenhados pelo proprietário contidos em uma barra de ferramentas. | Substitua ProcessMnemonic. |
Ver também
.NET Desktop feedback