Hur tangentbordsinmatning fungerar
Windows Forms bearbetar tangentbordsindata genom att höja tangentbordshändelser som svar på Windows-meddelanden. De flesta Windows Forms-program bearbetar tangentbordsinmatning uteslutande genom att hantera tangentbordshändelserna. Du måste dock förstå hur tangentbordsmeddelanden fungerar så att du kan implementera mer avancerade tangentbordsindatascenarier, till exempel att fånga upp nycklar innan de når en kontroll. Det här avsnittet beskriver de typer av nyckeldata som Windows Forms känner igen och ger en översikt över hur tangentbordsmeddelanden dirigeras. Information om tangentbordshändelser finns i Använda tangentbordshändelser.
Typer av nycklar
Windows Forms identifierar tangentbordsindata som virtuella nyckelkoder som representeras av bitvis Keys uppräkning. Med Keys uppräkning kan du kombinera en serie tangenter som trycks in för att resultera i ett enda värde. Dessa värden motsvarar de värden som medföljer WM_KEYDOWN- och WM_SYSKEYDOWN Windows-meddelanden. Du kan identifiera de flesta fysiska tangenttryckningar genom att hantera KeyDown eller KeyUp händelser. Teckennycklar är en delmängd av Keys uppräkning och motsvarar de värden som medföljer WM_CHAR- och WM_SYSCHAR Windows-meddelanden. Om kombinationen av pressade nycklar resulterar i ett tecken kan du identifiera tecknet genom att hantera KeyPress händelsen. Du kan också använda Keyboard, som exponeras av Visual Basic-programmeringsgränssnittet, för att identifiera vilka nycklar som trycktes på och skicka nycklar. Mer information finns i Åtkomst till tangentbordet.
Ordning på tangentbordshändelser
Som vi nämnde tidigare finns det tre tangentbordsrelaterade händelser som kan inträffa på en kontroll. Följande sekvens visar den allmänna ordningen för händelserna:
Användaren trycker på "a"-tangenten, tangenten förbereds, skickas och en KeyDown-händelse inträffar.
Användaren håller ned 'a'-tangenten, tangenten preprocessas, skickas och en KeyPress-händelse inträffar.
Den här händelsen inträffar flera gånger när användaren har en nyckel.
Användaren släpper "a"-nyckeln, nyckeln förbearbetas, skickas och en KeyUp händelse inträffar.
Förbearbeta nycklar
Precis som andra meddelanden bearbetas tangentbordsmeddelanden i WndProc-metoden i ett formulär eller en kontroll. Innan tangentbordsmeddelanden bearbetas anropar PreProcessMessage-metoden dock en eller flera metoder som kan åsidosättas för att hantera specialteckennycklar och fysiska nycklar. Du kan åsidosätta dessa metoder för att identifiera och filtrera vissa nycklar innan meddelandena bearbetas av kontrollen. I följande tabell visas den åtgärd som utförs och den relaterade metod som inträffar i den ordning metoden inträffar.
Förbehandling av en tangenttryckshändelse
Åtgärd | Relaterad metod | Anteckningar |
---|---|---|
Sök efter en kommandonyckel, till exempel en accelerator eller en snabbmeny. | ProcessCmdKey | Den här metoden bearbetar en kommandonyckel som har företräde framför vanliga nycklar. Om den här metoden returnerar true skickas inte nyckelmeddelandet och ingen nyckelhändelse inträffar. Om den returnerar false , kommer IsInputKey att anropas som. |
Sök efter en särskild nyckel som kräver förbearbetning eller en normal teckennyckel som ska generera en KeyDown händelse och skickas till en kontroll. | IsInputKey | Om metoden returnerar true , betyder det att kontrollen är ett vanligt tecken, och att en KeyDown-händelse utlöses. Om false anropas ProcessDialogKey.
Obs! För att säkerställa att en kontroll tar emot en tangent eller en tangentkombination kan du hantera händelsen PreviewKeyDown och ange IsInputKey för PreviewKeyDownEventArgs som true för den tangent eller de tangenter du vill använda. |
Sök efter en navigeringsnyckel (ESC, TAB, Return eller piltangenterna). | ProcessDialogKey | Den här metoden bearbetar en fysisk nyckel som använder särskilda funktioner i kontrollen, till exempel att växla fokus mellan kontrollen och dess överordnade. Om den omedelbara kontrollen inte hanterar nyckeln anropas ProcessDialogKey på den överordnade kontrollen och så vidare till den översta kontrollen i hierarkin. Om den här metoden returnerar true slutförs förbearbetningen och en nyckelhändelse genereras inte. Om den returnerar false inträffar en KeyDown händelse. |
Förbearbeta för en KeyPress-händelse
Åtgärd | Relaterad metod | Anteckningar |
---|---|---|
Kontrollera att nyckeln är ett normalt tecken som ska bearbetas av kontrollen | IsInputChar | Om tecknet är ett normalt tecken returnerar den här metoden true , KeyPress händelsen utlöses och ingen ytterligare förbearbetning sker. Annars anropas ProcessDialogChar. |
Kontrollera om tecknet är en minneshjälp (till exempel &OK på en knapp) | ProcessDialogChar | Den här metoden, som liknar ProcessDialogKey, anropas i kontrollhierarkin. Om kontrollen är en behållarkontroll söker den efter mnemonics genom att anropa ProcessMnemonic på sig själv och sina underordnade kontroller. Om ProcessDialogChar returnerar true inträffar ingen KeyPress händelse. |
Bearbeta tangentbordsmeddelanden
När tangentbordsmeddelanden når WndProc-metoden för ett formulär eller en kontroll bearbetas de med en uppsättning metoder som kan åsidosättas. Var och en av dessa metoder returnerar ett Boolean värde som anger om tangentbordsmeddelandet har bearbetats och förbrukats av kontrollen. Om någon av metoderna returnerar true
anses meddelandet hanteras och skickas inte till kontrollens bas eller överordnade för vidare bearbetning. Annars stannar meddelandet kvar i meddelandekön och kan bearbetas i en annan metod i kontrollens bas eller överordnad. I följande tabell visas de metoder som bearbetar tangentbordsmeddelanden.
Metod | Anteckningar |
---|---|
ProcessKeyMessage | Den här metoden bearbetar alla tangentbordsmeddelanden som tas emot av kontrollens WndProc-metod. |
ProcessKeyPreview | Den här metoden skickar tangentbordsmeddelandet till kontrollens överordnade. Om ProcessKeyPreview returnerar true genereras ingen nyckelhändelse, annars anropas ProcessKeyEventArgs. |
ProcessKeyEventArgs | Den här metoden genererar KeyDown, KeyPressoch KeyUp händelser efter behov. |
Övergripande tangentbordsmetoder
Det finns många tillgängliga metoder för att åsidosätta när ett tangentbordsmeddelande förbearbetas och bearbetas. Vissa metoder är dock mycket bättre val än andra. I följande tabell visas uppgifter som du kanske vill utföra och det bästa sättet att åsidosätta tangentbordsmetoderna. Mer information om övergripande metoder finns i Åsidosättande egenskaper och metoder i härledda klasser.
Uppgift | Metod |
---|---|
Fånga upp en navigationstangent och utlösa en KeyDown-händelse. Du vill till exempel att TAB och Return ska hanteras i en textruta. | Åsidosätt IsInputKey.
Obs! Du kan också hantera händelsen PreviewKeyDown och ange IsInputKey för PreviewKeyDownEventArgs till true för den nyckel eller de nycklar du vill använda. |
Utför särskild indata- eller navigeringshantering på en kontroll. Du vill till exempel att piltangenterna i listkontrollen ska ändra det markerade objektet. | Åsidosätt ProcessDialogKey |
Fånga upp en navigeringstangent och utlösa en KeyPress-händelse. I en spin-box-kontroll vill du till exempel ha flera piltangenttryck för att påskynda förloppet genom objekten. | Åsidosätt IsInputChar. |
Utför särskild indata- eller navigeringshantering under en KeyPress händelse. I en listkontroll som till exempel håller ned "r"-nyckeln hoppar över mellan objekt som börjar med bokstaven r. | Åsidosätt ProcessDialogChar |
Utför anpassad mnemonic-hantering; Du vill till exempel hantera mnemonics på ägarritade knappar som finns i ett verktygsfält. | Åsidosätt ProcessMnemonic. |
Se även
.NET Desktop feedback