Dela via


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:

  1. Användaren trycker på "a"-tangenten, tangenten förbereds, skickas och en KeyDown-händelse inträffar.

  2. 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.

  3. 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 trueskickas 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 falseanropas 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 trueslutförs förbearbetningen och en nyckelhändelse genereras inte. Om den returnerar falseinträ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 trueinträ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 trueanses 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 truegenereras 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