Compartilhar via


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