Compartilhar via


Como modificar eventos de tecla de teclado

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