Språk
Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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):
-
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. - IsInputKey: Avgör om en nyckel ska generera en KeyDown händelse eller gå till ProcessDialogKey.
- 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
.NET Desktop feedback