Partilhar via


Como modificar eventos de teclas de teclado

O Windows Forms pode consumir e modificar a entrada 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 a modificar o 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.

Utilize 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 Handled propriedade no KeyDown manipulador de eventos não impede que KeyPress e KeyUp eventos sejam gerados para a tecla 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 carácter 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 sem caracteres herdando do controle e substituindo o método PreProcessMessage. À medida que a entrada Message é enviada para o controle, ela é processada antes que o controle gere eventos. Você pode intercetar essas mensagens para modificá-las ou bloqueá-las.

O exemplo de código a seguir demonstra como usar a propriedade Message.WParam do parâmetro m para alterar a tecla pressionada. Este código deteta uma chave de F1 até F10 e traduz a chave em uma chave numérica que varia de 0 até 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

Ver também