Como modificar eventos de tecla do teclado (Windows Forms .NET)
O Windows Forms fornece a capacidade de consumir e modificar as entradas do teclado. Consumir uma chave refere-se à manipulação de uma chave dentro de um método ou manipulador de eventos para que outros métodos e eventos mais abaixo na fila de mensagens não recebam o valor da chave. E modificar uma chave refere-se à modificação do valor de uma chave para que os 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 KeyPress manipulador de eventos, defina a Handled KeyPressEventArgs propriedade da classe como true
.
-ou-
Em um KeyDown manipulador de eventos, defina a Handled KeyEventArgs propriedade da classe como true
.
Observação
Definir a Handled propriedade no KeyDown manipulador de eventos não impede que os KeyPress eventos and KeyUp sejam gerados para o pressionamento de tecla atual. Use a SuppressKeyPress propriedade para essa finalidade.
O exemplo a seguir manipula o KeyPress evento para consumir as A
chaves de caractere e a
. Essas teclas 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 KeyPress manipulador de eventos, defina a KeyChar KeyPressEventArgs propriedade da classe como o valor da nova chave de caractere.
O exemplo a seguir manipula o KeyPress evento para alterar qualquer A
chave de caractere para a
!
:
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 que não seja de caractere
Você só pode modificar pressionamentos de tecla que não sejam de caractere herdando do controle e substituindo o PreProcessMessage método. À medida que a entrada Message é enviada para o controle, ela é processada antes dos eventos de geração de controle. Você pode interceptar essas mensagens para modificá-las ou bloqueá-las.
O exemplo de código a seguir demonstra como usar a WParam propriedade do Message 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 (em que F10 é mapeado 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
Confira também
.NET Desktop feedback