Freigeben über


So ändern Sie Tastendruckereignisse

Windows Forms kann Tastatureingaben nutzen und ändern. Die Nutzung einer Taste bezieht sich auf die Behandlung einer Taste innerhalb einer Methode oder eines Ereignishandlers, sodass andere Methoden und Ereignisse weiter unten in der Meldungswarteschlange den Tastenwert nicht empfangen. Und das Ändern eines Schlüssels bezieht sich auf das Ändern des Werts eines Schlüssels, sodass Methoden und Ereignishandler weiter unten in der Nachrichtenwarteschlange einen anderen Schlüsselwert erhalten. In diesem Artikel wird gezeigt, wie Sie diese Aufgaben ausführen.

Nutzen einer Taste

Legen Sie in einem KeyPress-Ereignishandler die Handled-Eigenschaft der KeyPressEventArgs-Klasse auf true fest.

-oder-

Legen Sie in einem KeyDown-Ereignishandler die Handled-Eigenschaft der KeyEventArgs-Klasse auf true fest.

Hinweis

Das Festlegen der Handled Eigenschaft im KeyDown Ereignishandler verhindert nicht, dass die KeyPressKeyUp Ereignisse für den aktuellen Tastenanschlag ausgelöst werden. Verwenden Sie hierzu die eigenschaft SuppressKeyPress.

Im folgenden Beispiel wird das KeyPress-Ereignis verarbeitet, um die Tasten für die Zeichen A und a zu verwenden. Diese Tasten können nicht in das Textfeld eingegeben werden:

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

Ändern einer Standardzeichentaste

Legen Sie in einem KeyPress-Ereignishandler die KeyChar-Eigenschaft der KeyPressEventArgs-Klasse auf den Wert der neuen Zeichentaste fest.

Im folgenden Beispiel wird das KeyPress-Ereignis verarbeitet, um die Tasten für die Zeichen A und a in ! zu ändern:

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

Ändern einer Nichtzeichentaste

Sie können Tastendruckaktionen für Nichtzeichentasten nur ändern, indem vom Steuerelement geerbt und die PreProcessMessage-Methode überschrieben wird. Wenn die Eingabe Message an das Steuerelement gesendet wird, wird sie verarbeitet, bevor das Steuerelement Ereignisse auslöst. Sie können diese Nachrichten abfangen, um sie zu ändern oder zu blockieren.

Im folgenden Codebeispiel wird veranschaulicht, wie die Message.WParam-Eigenschaft des m-Parameters verwendet wird, um die gedrückte Taste zu ändern. Dieser Code erkennt einen Schlüssel von F1 bis F10 und übersetzt den Schlüssel in einen numerischen Schlüssel, der von 0 bis 9 reicht (bei dem F10 auf 0abgebildet wird).

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

Siehe auch