Ändern von Tastaturtastenereignissen (Windows Forms .NET)
Windows Forms bietet die Möglichkeit, Tastatureingaben zu nutzen und zu ä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. Das Ändern einer Taste bezieht sich auf das Ändern des Werts einer Taste, sodass Methoden und Ereignishandler weiter unten in der Meldungswarteschlange einen anderen Tastenwert empfangen. In diesem Artikel wird erläutert, 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
Ein Festlegen der Handled-Eigenschaft im KeyDown-Ereignishandler verhindert nicht, dass das KeyPress- und das KeyUp-Ereignis für die aktuelle Tastatureingabe ausgelöst werden. Verwenden Sie die SuppressKeyPress-Eigenschaft für diesen Zweck.
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 die PreProcessMessage-Methode vom Steuerelement geerbt und ü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 Sie mit der WParam-Eigenschaft des Message-Parameters die gedrückte Taste ändern. Dieser Code erkennt eine Taste von F1 bis F10 und übersetzt die Taste in eine numerische Taste von 0 bis 9 (wobei F100 ist).
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
.NET Desktop feedback