Taal

Toetsenbordinvoerberichten in het formulier verwerken

Windows Forms biedt de mogelijkheid om toetsenbordberichten op formulierniveau te verwerken voordat de berichten een besturingselement bereiken. In dit artikel wordt beschreven hoe u deze taak kunt uitvoeren.

Een toetsenbordbericht verwerken

De gebeurtenis KeyPress of KeyDown van het actieve formulier afhandelen en de eigenschap KeyPreview van het formulier instellen op true. Deze eigenschap zorgt ervoor dat toetsenbordinvoer het formulier bereikt voordat deze invoer een besturingselement op het formulier bereikt. In het volgende codevoorbeeld wordt de KeyPress gebeurtenis verwerkt door alle nummersleutels te detecteren en 1, 4en 7te gebruiken.

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

Wanneer KeyPreview niet voldoende is

De instelling Form.KeyPreview = true garandeert niet dat elke toets terechtkomt bij eventhandlers op formulierniveau. Bepaalde sleutels worden vooraf verwerkt voordat standaardformuliergebeurtenissen worden uitgevoerd. Het is belangrijk om deze uitzonderingen te begrijpen voor het verwerken van opdrachtsleutels, dialoogvenstertoetsen en controlespecifieke invoer.

Voorverwerking van commando- en dialoogvenstertoetsen

Voordat toetsenbordgebeurtenissen op formuliarniveau optreden, verwerkt Windows bepaalde toetsen vooraf via deze methoden (in volgorde):

  1. ProcessCmdKey: Onderschept commandotoetsen, zoals menusneltoetsen en sneltoetsen. Als deze methode true retourneert, wordt de toets verwerkt en wordt er geen gebeurtenis geactiveerd.
  2. IsInputKey: bepaalt of een sleutel een KeyDown gebeurtenis moet genereren of naartoe ProcessDialogKeymoet gaan.
  3. ProcessDialogKey: Verwerkt navigatietoetsen (Escape, Tab, Return en de pijltoetsen). Als dit is verwerkt, wordt geen event geactiveerd.

Als een gericht besturingselement een sleutel verbruikt tijdens het vooraf verwerken, ontvangt het formulier deze nooit, ongeacht KeyPreview.

Speciale gevallen die handlers op formulierniveau omzeilen

  • Enter en Escape: Deze toetsen worden mogelijk verwerkt door AcceptButton en CancelButton voordat ze formuliergebeurtenissen bereiken.
  • Tab: Wordt vaak onderschept door focusbeheer van besturingselementen en bereikt formulierhandlers niet.
  • Menusneltoetsen: Alt-toetscombinaties worden verwerkt door voorverwerking van menu's.

Opdrachttoetsen onderscheppen op formulierniveau

Als u opdrachttoetsen (inclusief menusneltoetsen en dialoogvenstertoetsen) op formulierniveau wilt afhandelen, overschrijft u ProcessCmdKey in uw formulier. Dit wordt uitgevoerd tijdens de voorverwerking, vóór standaard formuliergebeurtenissen.

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

Voor toetsen die in een specifiek besturingselement standaardgebeurtenissen moeten activeren, gebruikt u PreviewKeyDown waarbij IsInputKey op true is ingesteld voor dat besturingselement.

Zie ook