Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Windows Forms bietet die Möglichkeit, Tastaturnachrichten auf Formularebene zu verarbeiten, bevor die Nachrichten ein Steuerelement erreichen. In diesem Artikel wird gezeigt, wie Sie diese Aufgabe ausführen.
Eine Tastaturmeldung verarbeiten
Verarbeiten Sie das Ereignis KeyPress oder KeyDown des aktiven Formulars, und legen Sie die KeyPreview-Eigenschaft des Formulars auf true fest. Diese Eigenschaft bewirkt, dass Tastatureingaben das Formular erreichen, bevor sie Steuerelemente im Formular erreicht. Im folgenden Codebeispiel wird das KeyPress-Ereignis verarbeitet, indem alle Zahlentasten erkannt und 1, 4 und 7 verarbeitet werden.
// Detect all numeric characters at the form level and consume 1, 4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar))
{
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");
switch (e.KeyChar)
{
case '1':
case '4':
case '7':
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
e.Handled = true;
break;
}
}
}
' Detect all numeric characters at the form level and consume 1, 4, and 7.
' Form.KeyPreview must be set to true for this event handler to be called.
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsDigit(e.KeyChar) Then
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.")
Select Case e.KeyChar
Case "1"c, "4"c, "7"c
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.")
e.Handled = True
End Select
End If
End Sub
Wenn KeyPreview nicht genug ist
Die Einstellung Form.KeyPreview = true garantiert nicht, dass jeder Schlüssel Ereignishandler auf Formularebene erreicht. Bestimmte Schlüssel durchlaufen die Vorverarbeitung, bevor Standardformularereignisse ausgeführt werden. Das Verständnis dieser Ausnahmen ist wichtig für die ordnungsgemäße Behandlung von Befehlstasten, Dialogfelder und steuerelementspezifischen Eingaben.
Vorverarbeitung von Befehls- und Dialogtasten
Bevor Tastaturereignisse auf Formularebene ausgelöst werden, verarbeitet Windows bestimmte Tasten über diese Methoden (in der Reihenfolge):
-
ProcessCmdKey: Fängt Befehlstasten wie Menütastenkombinationen und Tastenkürzel ab. Wenn diese Methode
truezurückgibt, wird die Taste verarbeitet und kein Ereignis ausgelöst. - IsInputKey: Bestimmt, ob ein Schlüssel ein KeyDown Ereignis auslösen oder zu ProcessDialogKeywechseln soll.
- ProcessDialogKey: Behandelt Navigationstasten (Escape-, TAB-, EINGABETASTE- und Pfeiltasten). Wenn die Verarbeitung erfolgt, wird kein Ereignis ausgelöst.
Wenn ein fokussiertes Steuerelement während der Vorverarbeitung einen Schlüssel verwendet, empfängt das Formular ihn niemals, unabhängig von KeyPreview.
Sonderfälle, die Handler auf Formularebene umgehen
- Eingabetaste und Escape: Diese Tasten werden möglicherweise von AcceptButton und CancelButton verarbeitet, bevor sie Formulareignisse erreichen.
- Registerkarte: Wird häufig von der Fokusverwaltung des Steuerelements abgefangen und erreicht die Formular-Handler nicht.
- Menütastenkombinationen: Alt-Tastenkombinationen werden bei der Menüvorverarbeitung verarbeitet.
Abfangen von Befehlstasten auf Formularebene
Um Befehlstasten (einschließlich Menüverknüpfungen und Dialogfeldtasten) auf der Formularebene zu behandeln, überschreiben Sie ProcessCmdKey in Ihrem Formular. Dies wird bei der Vorverarbeitung vor Standard-Formularereignissen ausgeführt.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Intercept Ctrl+A for custom handling
if (keyData == (Keys.Control | Keys.A))
{
MessageBox.Show("Ctrl+A intercepted at form level");
return true; // Mark as handled
}
// Pass other keys to the base handler
return base.ProcessCmdKey(ref msg, keyData);
}
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
' Intercept Ctrl+A for custom handling
If keyData = (Keys.Control Or Keys.A) Then
MessageBox.Show("Ctrl+A intercepted at form level")
Return True ' Mark as handled
End If
' Pass other keys to the base handler
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
Verwenden Sie für Tasten, die in einem bestimmten Steuerelement Standardereignisse auslösen sollen, PreviewKeyDown, wobei IsInputKey für dieses Steuerelement auf true festgelegt ist.
Siehe auch
.NET Desktop feedback