Språk

Hantera tangentbordsindatameddelanden i formuläret

Windows Forms ger möjlighet att hantera tangentbordsmeddelanden på formulärnivå innan meddelandena når en kontroll. Den här artikeln visar hur du utför den här uppgiften.

Hantera ett tangentbordsmeddelande

Hantera KeyPress- eller KeyDown händelsen i det aktiva formuläret och ange KeyPreview-egenskapen för formuläret till true. Den här egenskapen gör att tangentbordsindata når formuläret innan det når några kontroller i formuläret. Följande kodexempel hanterar händelsen KeyPress genom att identifiera alla nummernycklar och använda 1, 4och 7.

// 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

När KeyPreview räcker inte

Inställningen Form.KeyPreview = true garanterar inte att varje nyckel når händelsehanterare på formulärnivå. Vissa tangenter förbehandlas innan vanliga formulärhändelser körs. Att förstå dessa undantag är viktigt för att hantera kommandonycklar, dialognycklar och kontrollspecifika indata korrekt.

Förbearbetning av kommando- och dialognyckel

Innan tangentbordshändelser på formulärnivå utlöses förbearbetar Windows vissa nycklar via dessa metoder (i ordning):

  1. ProcessCmdKey: Fångar upp kommandotangenter som menygenvägar och acceleratorer. Om den här metoden returnerar trueförbrukas nyckeln och ingen händelse utlöses.
  2. IsInputKey: Avgör om en nyckel ska generera en KeyDown händelse eller gå till ProcessDialogKey.
  3. ProcessDialogKey: Hanterar navigeringsnycklar (Escape, Tab, Return och piltangenter). Om den bearbetas utlöses ingen händelse.

Om ett fokuserat kontrollelement fångar upp en tangent vid förbearbetningen, når den aldrig formuläret, oavsett KeyPreview.

Specialfall som kringgår formulärnivåhanterare

  • Ange och Escape: Dessa nycklar kan hanteras av AcceptButton och CancelButton innan de når formulärhändelser.
  • Tab: Fångas ofta upp av fokushanteringen för kontroller och når inte formulärhanterare.
  • Menygenvägar: Alternativnyckelkombinationer hanteras av förbearbetning av menyn.

Hantera kommandotangenter på formulärnivå

Om du vill hantera kommandotangenter (inklusive menygenvägar och dialogtangenter) på formulärnivå åsidosätter du ProcessCmdKey i formuläret. Detta körs vid förbearbetningen, före standardhändelser för formulär.

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

För tangenter som ska utlösa standardhändelser i en specifik kontroll, använd PreviewKeyDown med IsInputKey inställt på true för den kontrollen.

Se även