Taal
Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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):
-
ProcessCmdKey: Onderschept commandotoetsen, zoals menusneltoetsen en sneltoetsen. Als deze methode
trueretourneert, wordt de toets verwerkt en wordt er geen gebeurtenis geactiveerd. - IsInputKey: bepaalt of een sleutel een KeyDown gebeurtenis moet genereren of naartoe ProcessDialogKeymoet gaan.
- 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
.NET Desktop feedback