Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os Windows Forms podem consumir e modificar a entrada do teclado. Consumir uma chave significa lidar com essa chave dentro de um método ou manipulador de eventos, para que outros métodos e eventos mais adiante na fila de mensagens não recebam o valor da chave. Além disso, modificar uma chave refere-se à modificação do valor de uma chave para que métodos e manipuladores de eventos mais abaixo na fila de mensagens recebam um valor de chave diferente. Este artigo mostra como realizar essas tarefas.
Consumir uma chave
Em um manipulador de eventos KeyPress, defina a propriedade Handled da classe KeyPressEventArgs como true
.
- ou -
Em um manipulador de eventos KeyDown, defina a propriedade Handled da classe KeyEventArgs como true
.
Observação
Definir a propriedade Handled no manipulador de eventos KeyDown não impede que os eventos KeyPress e KeyUp sejam gerados para a tecla pressionada atual. Use a propriedade SuppressKeyPress para essa finalidade.
O exemplo a seguir manipula o evento KeyPress para consumir as teclas de caractere A
e a
. Essas chaves não podem ser digitadas na caixa de texto.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
e.Handled = true;
}
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.Handled = True
End If
End Sub
Modificar uma chave de caractere padrão
Em um manipulador de eventos KeyPress, defina a propriedade KeyChar da classe KeyPressEventArgs como o valor da nova chave de caractere.
O exemplo a seguir manipula o evento KeyPress para alterar qualquer tecla de caractere de A
e a
para !
:
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
{
e.KeyChar = '!';
e.Handled = false;
}
}
Private Sub TextBox2_KeyPress(sender As Object, e As KeyPressEventArgs)
If e.KeyChar = "a"c Or e.KeyChar = "A"c Then
e.KeyChar = "!"c
e.Handled = False
End If
End Sub
Modificar uma chave sem caracteres
Você só pode modificar pressionamentos de teclas que não são de caractere herdando do controle e substituindo o PreProcessMessage método. À medida que a entrada Message é enviada para o controle, ela é processada antes que o controle acione eventos. Você pode interceptar essas mensagens para modificá-las ou bloqueá-las.
O exemplo de código a seguir demonstra como usar a Message.WParam propriedade do m
parâmetro para alterar a tecla pressionada. Esse código detecta uma chave de F1 a F10 e converte a chave em uma chave numérica que varia de 0 a 9 (onde F10 mapeia para 0).
public override bool PreProcessMessage(ref Message m)
{
const int WM_KEYDOWN = 0x100;
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)m.WParam & Keys.KeyCode;
// Detect F1 through F9.
m.WParam = keyCode switch
{
Keys.F1 => (IntPtr)Keys.D1,
Keys.F2 => (IntPtr)Keys.D2,
Keys.F3 => (IntPtr)Keys.D3,
Keys.F4 => (IntPtr)Keys.D4,
Keys.F5 => (IntPtr)Keys.D5,
Keys.F6 => (IntPtr)Keys.D6,
Keys.F7 => (IntPtr)Keys.D7,
Keys.F8 => (IntPtr)Keys.D8,
Keys.F9 => (IntPtr)Keys.D9,
Keys.F10 => (IntPtr)Keys.D0,
_ => m.WParam
};
}
// Send all other messages to the base method.
return base.PreProcessMessage(ref m);
}
Public Overrides Function PreProcessMessage(ByRef m As Message) As Boolean
Const WM_KEYDOWN = &H100
If m.Msg = WM_KEYDOWN Then
Dim keyCode As Keys = CType(m.WParam, Keys) And Keys.KeyCode
Select Case keyCode
Case Keys.F1 : m.WParam = CType(Keys.D1, IntPtr)
Case Keys.F2 : m.WParam = CType(Keys.D2, IntPtr)
Case Keys.F3 : m.WParam = CType(Keys.D3, IntPtr)
Case Keys.F4 : m.WParam = CType(Keys.D4, IntPtr)
Case Keys.F5 : m.WParam = CType(Keys.D5, IntPtr)
Case Keys.F6 : m.WParam = CType(Keys.D6, IntPtr)
Case Keys.F7 : m.WParam = CType(Keys.D7, IntPtr)
Case Keys.F8 : m.WParam = CType(Keys.D8, IntPtr)
Case Keys.F9 : m.WParam = CType(Keys.D9, IntPtr)
Case Keys.F10 : m.WParam = CType(Keys.D0, IntPtr)
End Select
End If
Return MyBase.PreProcessMessage(m)
End Function
Consulte também
.NET Desktop feedback