Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Windows Forms fornece a capacidade de manipular mensagens de teclado no nível do formulário, antes que as mensagens atinjam um controle. Este artigo mostra como realizar essa tarefa.
Manipular uma mensagem de teclado
Manipule o evento KeyPress ou KeyDown do formulário ativo e defina a propriedade KeyPreview do formulário como true. Esta propriedade faz com que a entrada de teclado chegue ao formulário antes de chegar a quaisquer controlos no formulário. O exemplo de código a seguir manipula o evento KeyPress detetando todas as chaves numéricas e consumindo 1, 4e 7.
// Detect all numeric characters at the form level and consume 1, 4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar))
{
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");
switch (e.KeyChar)
{
case '1':
case '4':
case '7':
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
e.Handled = true;
break;
}
}
}
' Detect all numeric characters at the form level and consume 1, 4, and 7.
' Form.KeyPreview must be set to true for this event handler to be called.
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsDigit(e.KeyChar) Then
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.")
Select Case e.KeyChar
Case "1"c, "4"c, "7"c
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.")
e.Handled = True
End Select
End If
End Sub
Quando KeyPreview não é suficiente
A definição Form.KeyPreview = true não garante que todas as chaves cheguem aos gestores de eventos ao nível do formulário. Determinadas teclas são pré-processadas antes de serem executados os eventos de formulário padrão. Compreender estas exceções é importante para lidar corretamente com as teclas de comando, teclas de diálogo e entradas específicas de controlo.
Pré-processamento de teclas de comando e diálogo
Antes de os eventos de teclado ao nível do formulário serem ativados, o Windows pré-processa certas teclas através destes métodos (por ordem):
-
ProcessCmdKey: Interceta teclas de comando como atalhos de menu e aceleradores. Se este método devolver
true, a tecla é consumida e nenhum evento é acionado. - IsInputKey: Determina se uma tecla deve desencadear um evento KeyDown ou ser encaminhada para ProcessDialogKey.
- ProcessDialogKey: Processa as teclas de navegação (Escape, Tab, Enter e teclas de direção). Se processado, nenhum evento é ativado.
Se um controlo focado consome uma chave durante o pré-processamento, o formulário nunca a recebe, independentemente de KeyPreview.
Casos especiais que contornam manipuladores ao nível do formulário
- Enter e Escape: Estas teclas poderão ser processadas por AcceptButton e CancelButton antes de chegarem aos eventos do formulário.
- Tab: Muitas vezes é consumida pela gestão do foco dos controlos e não chega aos processadores de formulários.
- Atalhos de menu: Combinações de teclas alt são tratadas pelo pré-processamento do menu.
Teclas de comando de interceção ao nível do formulário
Para processar as teclas de comando (incluindo atalhos de menu e teclas de diálogo) ao nível do formulário, redefina ProcessCmdKey no seu formulário. Isto ocorre durante o pré-processamento, antes dos eventos de formato padrão.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Intercept Ctrl+A for custom handling
if (keyData == (Keys.Control | Keys.A))
{
MessageBox.Show("Ctrl+A intercepted at form level");
return true; // Mark as handled
}
// Pass other keys to the base handler
return base.ProcessCmdKey(ref msg, keyData);
}
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
' Intercept Ctrl+A for custom handling
If keyData = (Keys.Control Or Keys.A) Then
MessageBox.Show("Ctrl+A intercepted at form level")
Return True ' Mark as handled
End If
' Pass other keys to the base handler
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
Para as teclas que devem gerar eventos padrão num controlo específico, use PreviewKeyDown com IsInputKey definido como true nesse controlo.
Ver também
.NET Desktop feedback