Anteckning
Å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.
Program bör acceptera användarindata från tangentbordet och från musen. Ett program får tangentbordsindata i form av meddelanden som skickas till dess fönster.
Systemet tillhandahåller enhetsoberoende tangentbordsstöd för program genom att installera en drivrutin för tangentbordet som är lämplig för det aktuella tangentbordet. Systemet ger språkoberoende tangentbordsstöd med hjälp av den språkspecifika tangentbordslayout som användaren eller programmet för närvarande har valt. Drivrutinen för tangentbordet tar emot genomsökningskoder från tangentbordet, som skickas till tangentbordslayouten där de översätts till meddelanden och skickas till lämpliga fönster i programmet.
Varje tangent på ett tangentbord har ett unikt värde som kallas genomsökningskod, en enhetsberoende identifierare för tangenten på tangentbordet. Ett tangentbord genererar två genomsökningskoder när användaren skriver en nyckel – en när användaren trycker på tangenten och en annan när användaren släpper nyckeln.
Drivrutinen för tangentbordsenheter tolkar en scankod och översätter den till en virtuell tangentkod, ett värde oberoende av enheten, definierat av systemet som identifierar syftet med en tangent. När du har översatt en genomsökningskod skapar tangentbordslayouten ett meddelande som innehåller genomsökningskoden, den virtuella nyckelkoden och annan information om tangenttryckningen och placerar sedan meddelandet i systemmeddelandekön. Systemet tar bort meddelandet från systemmeddelandekön och skickar det till meddelandekön för lämplig tråd. Slutligen tar trådens meddelandeloop bort meddelandet och skickar det till lämplig fönsterprocedur för bearbetning. Följande bild illustrerar indatamodellen för tangentbordet.
Systemet publicerar tangentbordsmeddelanden i meddelandekön för förgrundstråden som skapade fönstret med tangentbordsfokus. tangentbordsfokus är en tillfällig egenskap för ett fönster. Systemet delar tangentbordet mellan alla fönster på skärmen genom att flytta tangentbordets fokus, i användarens riktning, från ett fönster till ett annat. Fönstret som har tangentbordsfokus tar emot (från meddelandekön i tråden som skapade den) alla tangentbordsmeddelanden tills fokus ändras till ett annat fönster.
En tråd kan anropa funktionen GetFocus för att avgöra vilka av dess fönster (om några) som för närvarande har tangentbordsfokus. En tråd kan ge tangentbordet fokus till ett av dess fönster genom att anropa funktionen SetFocus. När tangentbordets fokus ändras från ett fönster till ett annat skickar systemet ett WM_KILLFOCUS meddelande till fönstret som har förlorat fokus och skickar sedan ett WM_SETFOCUS meddelande till fönstret som har fått fokus.
Begreppet tangentbordsfokus är relaterat till det aktiva fönstrets. Det aktiva fönstret är det övre fönstret som användaren arbetar med för närvarande. Fönstret med tangentbordsfokus är antingen det aktiva fönstret eller ett underordnat fönster i det aktiva fönstret. För att hjälpa användaren att identifiera det aktiva fönstret placerar systemet det överst i Z-ordningen och markerar dess namnlist (om den har en) och kantlinje.
Användaren kan aktivera ett fönster på den översta nivån genom att klicka på det, välja det med hjälp av Alt+Tab eller Alt+Esc nyckelkombination eller välja den i aktivitetslistan. En tråd kan aktivera ett toppnivåfönster med hjälp av funktionen SetActiveWindow. Den kan avgöra om ett fönster på den översta nivån som skapas är aktivt med hjälp av funktionen GetActiveWindow.
När ett fönster inaktiveras och ett annat aktiveras skickar systemet WM_ACTIVATE meddelande. Lågordningsordet för parametern wParam är noll om fönstret inaktiveras och inte noll om det aktiveras. När standardfönsterproceduren tar emot WM_ACTIVATE meddelande, anger den tangentbordets fokus till det aktiva fönstret.
Om du vill blockera tangentbords- och musindatahändelser från att nå program använder du BlockInput. Observera att funktionen BlockInput inte påverkar den asynkrona indatatillståndstabellen för tangentbordet. Det innebär att om du anropar funktionen SendInput när indata blockeras ändras den asynkrona indatatillståndstabellen för tangentbordet.
Om du trycker på en tangent placeras ett WM_KEYDOWN - eller WM_SYSKEYDOWN -meddelande i trådmeddelandekön som är kopplad till det fönster som har tangentbordsfokus. Om du släpper en nyckel placeras ett WM_KEYUP- eller WM_SYSKEYUP meddelande i kön.
Upp- och nedtangentmeddelanden sker vanligtvis i par, men om användaren håller ned en nyckel tillräckligt länge för att starta tangentbordets automatiska upprepningsfunktion genererar systemet ett antal WM_KEYDOWN eller WM_SYSKEYDOWN meddelanden i rad. Sedan genereras ett enda WM_KEYUP eller WM_SYSKEYUP meddelande när användaren släpper nyckeln.
Det här avsnittet täcker följande ämnen:
- system- och icke-systemtangenttryckningar
- Beskrivna Virtual-Key Koder
- meddelandeflaggor för tangenttryckning
Systemet skiljer mellan systemtangenttryckningar och icke-systemtangenttryckningar. Systemtangenttryckningar skapar meddelanden om systemtangenttryckning, WM_SYSKEYDOWN och WM_SYSKEYUP. Icke-systemtangenttryckningar genererar icke-systemtangenttryckningsmeddelanden, WM_KEYDOWN och WM_KEYUP.
Om fönsterproceduren måste bearbeta ett meddelande om systemtangenttryckning kontrollerar du att när du har bearbetat meddelandet skickar proceduren det till funktionen DefWindowProc. Annars inaktiveras alla systemåtgärder som omfattar Alt-tangenten när fönstret har tangentbordsfokus. Användaren kan alltså inte komma åt fönstrets menyer eller systemmenyn, eller använda Alt+Esc- eller Alt+Tab tangenttryckning för att aktivera ett annat fönster.
Systemtangenttryckningsmeddelanden används främst av systemet i stället för av ett program. Systemet använder dem för att tillhandahålla sitt inbyggda tangentbordsgränssnitt till menyer och för att låta användaren styra vilket fönster som är aktivt. Meddelanden om systemtangenttryckning genereras när användaren skriver en nyckel i kombination med Alt-tangenten, eller när användaren skriver och inget fönster har tangentbordsfokus (till exempel när det aktiva programmet minimeras). I det här fallet skickas meddelandena till meddelandekön som är kopplad till det aktiva fönstret.
Icke-system-tangenttryckningsmeddelanden är till för användning av programfönster. funktionen DefWindowProc gör ingenting med dem. En fönsterprocedur kan ta bort alla icke-system-tangenttryckningsmeddelanden som den inte behöver.
Parametern wParam för ett tangenttryckningsmeddelande innehåller virtuell nyckelkod för nyckeln som trycktes ned eller släpptes. En fönsterprocedur bearbetar eller ignorerar ett tangenttryckningsmeddelande, beroende på värdet för den virtuella nyckelkoden.
En typisk fönsterprocedur bearbetar endast en liten delmängd av de tangenttryckningsmeddelanden som den tar emot och ignorerar resten. En fönsterprocedur kan till exempel endast bearbeta WM_KEYDOWN tangenttryckningsmeddelanden och endast de som innehåller virtuella nyckelkoder för markörflyttnycklarna, skiftnycklarna (kallas även kontrollnycklar) och funktionsnycklar. En typisk fönsterprocedur bearbetar inte tangenttryckningsmeddelanden från teckennycklar. I stället används funktionen TranslateMessage för att konvertera meddelandet till teckenmeddelanden. Mer information om TranslateMessage och teckenmeddelanden finns i Teckenmeddelanden.
Parametern lParam för ett tangenttryckningsmeddelande innehåller ytterligare information om tangenttryckningen som genererade meddelandet. Den här informationen omfattar antalet upprepningar , -genomsökningskoden, extended-key-flaggan , -kontextkoden, flaggan för föregående nyckeltillstånd och övergångstillståndsflaggan . Följande bild visar platserna för dessa flaggor och värden i parametern lParam.
Ett program kan använda följande värden för att hämta tangenttryckningsflaggor från högordningsordet i lParam-.
Värde | Beskrivning |
---|---|
KF_EXTENDED 0x0100 |
Ändrar förlängda nyckelflaggan. |
KF_DLGMODE 0x0800 |
Ändrar dialogrutans lägesflagga, vilket anger om en dialogruta är aktiv. |
KF_MENUMODE 0x1000 |
Ändrar menylägesflaggan, vilket anger om en meny är aktiv. |
KF_ALTDOWN 0x2000 |
Manipulerar kontextkodens flagga . |
KF_REPEAT 0x4000 |
Ändrar tidigare knapptillståndsflagga. |
KF_UP 0x8000 |
Manipulerar övergångstillståndsflaggan . |
Exempelkod:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
WORD vkCode = LOWORD(wParam); // virtual-key code
WORD keyFlags = HIWORD(lParam);
WORD scanCode = LOBYTE(keyFlags); // scan code
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
if (isExtendedKey)
scanCode = MAKEWORD(scanCode, 0xE0);
BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT; // previous key-state flag, 1 on autorepeat
WORD repeatCount = LOWORD(lParam); // repeat count, > 0 if several keydown messages was combined into one message
BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP; // transition-state flag, 1 on keyup
// if we want to distinguish these keys:
switch (vkCode)
{
case VK_SHIFT: // converts to VK_LSHIFT or VK_RSHIFT
case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
case VK_MENU: // converts to VK_LMENU or VK_RMENU
vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
break;
}
// ...
}
break;
Du kan kontrollera antalet upprepningar för att avgöra om ett tangenttryckningsmeddelande representerar mer än ett tangenttryckning. Systemet ökar antalet när tangentbordet genererar WM_KEYDOWN eller WM_SYSKEYDOWN meddelanden snabbare än ett program kan bearbeta dem. Detta inträffar ofta när användaren håller ned en nyckel tillräckligt länge för att starta tangentbordets automatiska upprepningsfunktion. I stället för att fylla systemets meddelandekö med de resulterande tangenttryckmeddelandena kombinerar systemet dessa meddelanden till ett enda tangenttrycksmeddelande och ökar repetitionräknaren. Att släppa en nyckel kan inte starta funktionen för automatisk upprepning, så upprepningsantalet för WM_KEYUP och WM_SYSKEYUP meddelanden är alltid inställt på 1.
Genomsökningskoden är det värde som systemet genererar när användaren trycker på en nyckel. Det är ett värde som identifierar tangenten som trycks in oavsett den aktiva tangentbordslayouten, i motsats till det tecken som representeras av nyckeln. Ett program ignorerar vanligtvis genomsökningskoder. I stället används de virtuella nyckelkoderna för att tolka tangenttryckningsmeddelanden.
Moderna tangentbord använder HID(Human Interface Devices) specifikation för att kommunicera med en dator. Tangentbordsdrivrutin konverterar rapporterade HID-användningsvärden som skickas från tangentbordet för att skanna koder och skickar dem vidare till program.
Anteckning
Även om virtuella nyckelkoder vanligtvis är mer användbara för skrivbordsprogram, kan genomsökningskoder krävas i specifika fall när du behöver veta vilken tangent som trycks in oavsett den aktuella tangentbordslayouten. Till exempel är WASD (W är uppåt, A är vänster, S är nedåt och D är höger) tangentbindningar för spel, vilket säkerställer en konsekvent tangentuppställning över amerikanska QWERTY- eller franska AZERTY- tangentbordslayouter.
I följande tabell visas uppsättningen med genomsökningskoder som för närvarande identifieras av Windows. HID-användningssida/HID-användnings-ID/HID-användningsnamn värden refererar till HID-användningstabeller dokumentet. Värdena för nyckelplats refererar till föregående tangentbordsbild.
Scan 1-kod levereras i WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP och WM_INPUT-meddelandena.
Namn på HID-användningssida | HID-användningsnamn | HID-användningssida | HID-användnings-ID | Skanna 1 gör | Nyckelplats |
---|---|---|---|---|---|
Allmänt skrivbord | Systemavstängning | 0x0001 | 0x0081 | 0xE05E | |
Allmänt skrivbord | Systemvila | 0x0001 | 0x0082 | 0xE05F | |
Allmänt skrivbord | Väcka systemet | 0x0001 | 0x0083 | 0xE063 | |
Tangentbord/knappsats | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Tangentbord/knappsats | Tangentbord A | 0x0007 | 0x0004 | 0x001E | 31 |
Tangentbord/knappsats | Tangentbord B | 0x0007 | 0x0005 | 0x0030 | 50 |
Tangentbord/knappsats | Tangentbord C | 0x0007 | 0x0006 | 0x002E | 48 |
Tangentbord/knappsats | Tangentbord D | 0x0007 | 0x0007 | 0x0020 | 33 |
Tangentbord/knappsats | Tangentbord E | 0x0007 | 0x0008 | 0x0012 | 19 |
Tangentbord/knappsats | Tangentbord F | 0x0007 | 0x0009 | 0x0021 | 34 |
Tangentbord/knappsats | Tangentbord G | 0x0007 | 0x000A | 0x0022 | 35 |
Tangentbord/knappsats | Tangentbord H | 0x0007 | 0x000B | 0x0023 | 36 |
Tangentbord/knappsats | Tangentbord I | 0x0007 | 0x000C | 0x0017 | 24 |
Tangentbord/knappsats | Tangentbord J | 0x0007 | 0x000D | 0x0024 | 37 |
Tangentbord/knappsats | Tangentbord K | 0x0007 | 0x000E | 0x0025 | 38 |
Tangentbord/knappsats | Tangentbord L | 0x0007 | 0x000F | 0x0026 | 39 |
Tangentbord/knappsats | Tangentbord M | 0x0007 | 0x0010 | 0x0032 | 52 |
Tangentbord/knappsats | Tangentbord N | 0x0007 | 0x0011 | 0x0031 | 51 |
Tangentbord/knappsats | Tangentbord O | 0x0007 | 0x0012 | 0x0018 | 25 |
Tangentbord/knappsats | Tangentbord P | 0x0007 | 0x0013 | 0x0019 | 26 |
Tangentbord/knappsats | Tangentbord Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Tangentbord/knappsats | Tangentbord R | 0x0007 | 0x0015 | 0x0013 | 20 |
Tangentbord/knappsats | Tangentbord S | 0x0007 | 0x0016 | 0x001F | 32 |
Tangentbord/knappsats | Tangentbord T | 0x0007 | 0x0017 | 0x0014 | 21 |
Tangentbord/knappsats | Tangentbord U | 0x0007 | 0x0018 | 0x0016 | 23 |
Tangentbord/knappsats | Tangentbord V | 0x0007 | 0x0019 | 0x002F | 49 |
Tangentbord/knappsats | Tangentbord W | 0x0007 | 0x001A | 0x0011 | 18 |
Tangentbord/knappsats | Tangentbord X | 0x0007 | 0x001B | 0x002D | 47 |
Tangentbord/knappsats | Tangentbord Y | 0x0007 | 0x001C | 0x0015 | 22 |
Tangentbord/knappsats | Tangentbord Z | 0x0007 | 0x001D | 0x002C | 46 |
Tangentbord/knappsats | Tangentbord 1 och Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Tangentbord/knappsats | Tangentbord 2 och At | 0x0007 | 0x001F | 0x0003 | 3 |
Tangentbord/knappsats | Tangentbord 3 och hash | 0x0007 | 0x0020 | 0x0004 | 4 |
Tangentbord/knappsats | Tangentbord 4 och dollar | 0x0007 | 0x0021 | 0x0005 | 5 |
Tangentbord/knappsats | Tangentbord 5 och procent | 0x0007 | 0x0022 | 0x0006 | 6 |
Tangentbord/knappsats | Tangentbord 6 och Caret | 0x0007 | 0x0023 | 0x0007 | 7 |
Tangentbord/knappsats | Tangentbord 7 och Ampersand | 0x0007 | 0x0024 | 0x0008 | 8 |
Tangentbord/knappsats | Tangentbord 8 och Star | 0x0007 | 0x0025 | 0x0009 | 9 |
Tangentbord/knappsats | Tangentbord 9 och vänster hakparentes | 0x0007 | 0x0026 | 0x000A | 10 |
Tangentbord/knappsats | Tangentbord 0 och höger hakparentes | 0x0007 | 0x0027 | 0x000B | 11 |
Tangentbord/knappsats | Tangentbord Retur Enter | 0x0007 | 0x0028 | 0x001C | 43 |
Tangentbord/knappsats | Tangentbordsrymning | 0x0007 | 0x0029 | 0x0001 | 110 |
Tangentbord/knappsats | Ta bort tangentbord | 0x0007 | 0x002A | 0x000E | 15 |
Tangentbord/knappsats | Tangentbordsflik | 0x0007 | 0x002B | 0x000F | 16 |
Tangentbord/knappsats | Tangentbord mellanslagstangent | 0x0007 | 0x002C | 0x0039 | 61 |
Tangentbord/knappsats | Tangentbordsstreck och understreck | 0x0007 | 0x002D | 0x000C | 12 |
Tangentbord/knappsats | Tangentbord är lika med och Plus | 0x0007 | 0x002E | 0x000D | 13 |
Tangentbord/knappsats | Vänsterklammer på tangentbord | 0x0007 | 0x002F | 0x001A | 27 |
Tangentbord/knappsats | Höger klammerparentes på tangentbord | 0x0007 | 0x0030 | 0x001B | 28 |
Tangentbord/knappsats | Tangentbordsrör och snedstreck | 0x0007 | 0x0031 | 0x002B | 29 |
Tangentbord/knappsats | Icke-amerikanskt tangentbord | 0x0007 | 0x0032 | 0x002B | 42 |
Tangentbord/knappsats | Semikolon och kolon för tangentbord | 0x0007 | 0x0033 | 0x0027 | 40 |
Tangentbord/knappsats | Tangentbordsapostrofer och dubbla citattecken | 0x0007 | 0x0034 | 0x0028 | 41 |
Tangentbord/knappsats | Tangentbord Grav Accent och Tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
Tangentbord/knappsats | Tangentbordskomma | 0x0007 | 0x0036 | 0x0033 | 53 |
Tangentbord/knappsats | Tangentbordsperiod | 0x0007 | 0x0037 | 0x0034 | 54 |
Tangentbord/knappsats | Frågetecken för tangentbord | 0x0007 | 0x0038 | 0x0035 | 55 |
Tangentbord/knappsats | Caps Lock på tangentbordet | 0x0007 | 0x0039 | 0x003A | 30 |
Tangentbord/knappsats | Tangentbord F1 | 0x0007 | 0x003A | 0x003B | 112 |
Tangentbord/knappsats | Tangentbord F2 | 0x0007 | 0x003B | 0x003C | 113 |
Tangentbord/knappsats | Tangentbord F3 | 0x0007 | 0x003C | 0x003D | 114 |
Tangentbord/knappsats | Tangentbord F4 | 0x0007 | 0x003D | 0x003E | 115 |
Tangentbord/knappsats | Tangentbord F5 | 0x0007 | 0x003E | 0x003F | 116 |
Tangentbord/knappsats | Tangentbord F6 | 0x0007 | 0x003F | 0x0040 | 117 |
Tangentbord/knappsats | Tangentbord F7 | 0x0007 | 0x0040 | 0x0041 | 118 |
Tangentbord/knappsats | Tangentbord F8 | 0x0007 | 0x0041 | 0x0042 | 119 |
Tangentbord/knappsats | Tangentbord F9 | 0x0007 | 0x0042 | 0x0043 | 120 |
Tangentbord/knappsats | Tangentbord F10 | 0x0007 | 0x0043 | 0x0044 | 121 |
Tangentbord/knappsats | Tangentbord F11 | 0x0007 | 0x0044 | 0x0057 | 122 |
Tangentbord/knappsats | Tangentbord F12 | 0x0007 | 0x0045 | 0x0058 | 123 |
Tangentbord/knappsats | Tangentbord Skärmavbild | 0x0007 | 0x0046 | 0xE037 0x0054 *Notering 1 |
124 |
Tangentbord/knappsats | Rullningslås för tangentbord | 0x0007 | 0x0047 | 0x0046 | 125 |
Tangentbord/knappsats | Tangentbordspaus | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Notera 2 0x0045 *Not 3 |
126 |
Tangentbord/knappsats | Tangentbordsinfogning | 0x0007 | 0x0049 | 0xE052 | 75 |
Tangentbord/knappsats | Tangentbord , startsida | 0x0007 | 0x004A | 0xE047 | 80 |
Tangentbord/knappsats | TangentbordssidaUpp | 0x0007 | 0x004B | 0xE049 | 85 |
Tangentbord/knappsats | Ta bort tangentbord framåt | 0x0007 | 0x004C | 0xE053 | 76 |
Tangentbord/knappsats | Tangentbordsslut | 0x0007 | 0x004D | 0xE04F | 81 |
Tangentbord/knappsats | Sida ned | 0x0007 | 0x004E | 0xE051 | 86 |
Tangentbord/knappsats | Tangentbord högerpil | 0x0007 | 0x004F | 0xE04D | 89 |
Tangentbord/knappsats | Tangentbord vänsterpil | 0x0007 | 0x0050 | 0xE04B | 79 |
Tangentbord/knappsats | Tangentbord nedåtpil | 0x0007 | 0x0051 | 0xE050 | 84 |
Tangentbord/knappsats | Tangentbordets uppåtpil | 0x0007 | 0x0052 | 0xE048 | 83 |
Tangentbord/knappsats | Knappsats Num Lock och Rensa | 0x0007 | 0x0053 | 0x0045 0xE045 *Note 3 |
90 |
Tangentbord/knappsats | Snedstreck på knappsats | 0x0007 | 0x0054 | 0xE035 | 95 |
Tangentbord/knappsats | Stjärna på knappsats | 0x0007 | 0x0055 | 0x0037 | 100 |
Tangentbord/knappsats | Knappsats-bindestreck | 0x0007 | 0x0056 | 0x004A | 105 |
Tangentbord/knappsats | Knappsats Plus | 0x0007 | 0x0057 | 0x004E | 106 |
Tangentbord/knappsats | Tangentbord Enter | 0x0007 | 0x0058 | 0xE01C | 108 |
Tangentbord/knappsats | Siffertangent 1 och End | 0x0007 | 0x0059 | 0x004F | 93 |
Tangentbord/knappsats | Knappsats 2 och nedåtpil | 0x0007 | 0x005A | 0x0050 | 98 |
Tangentbord/knappsats | Keypad 3 och PageDn | 0x0007 | 0x005B | 0x0051 | 103 |
Tangentbord/knappsats | Knappsats 4 och vänsterpil | 0x0007 | 0x005C | 0x004B | 92 |
Tangentbord/knappsats | Knappsats 5 | 0x0007 | 0x005D | 0x004C | 97 |
Tangentbord/knappsats | Knappsats 6 och högerpil | 0x0007 | 0x005E | 0x004D | 102 |
Tangentbord/knappsats | Keypad 7 och Home | 0x0007 | 0x005F | 0x0047 | 91 |
Tangentbord/knappsats | Knappsats 8 och uppåtpil | 0x0007 | 0x0060 | 0x0048 | 96 |
Tangentbord/knappsats | Knappsats 9 och Page Up | 0x0007 | 0x0061 | 0x0049 | 101 |
Tangentbord/knappsats | Tangent 0 och Infoga | 0x0007 | 0x0062 | 0x0052 | 99 |
Tangentbord/knappsats | Knappsatspunkt | 0x0007 | 0x0063 | 0x0053 | 104 |
Tangentbord/knappsats | Snedstreckstangent för icke-US-tangentbord | 0x0007 | 0x0064 | 0x0056 | 45 |
Tangentbord/knappsats | Tangentbordsprogram | 0x0007 | 0x0065 | 0xE05D | 129 |
Tangentbord/knappsats | Tangentbordskraft | 0x0007 | 0x0066 | 0xE05E | |
Tangentbord/knappsats | Knappsats är lika med | 0x0007 | 0x0067 | 0x0059 | |
Tangentbord/knappsats | Tangentbord F13 | 0x0007 | 0x0068 | 0x0064 | |
Tangentbord/knappsats | Tangentbord F14 | 0x0007 | 0x0069 | 0x0065 | |
Tangentbord/knappsats | Tangentbord F15 | 0x0007 | 0x006A | 0x0066 | |
Tangentbord/knappsats | Tangentbord F16 | 0x0007 | 0x006B | 0x0067 | |
Tangentbord/knappsats | Tangentbord F17 | 0x0007 | 0x006C | 0x0068 | |
Tangentbord/knappsats | Tangentbord F18 | 0x0007 | 0x006D | 0x0069 | |
Tangentbord/knappsats | Tangentbord F19 | 0x0007 | 0x006E | 0x006A | |
Tangentbord/knappsats | Tangentbord F20 | 0x0007 | 0x006F | 0x006B | |
Tangentbord/knappsats | Tangentbord F21 | 0x0007 | 0x0070 | 0x006C | |
Tangentbord/knappsats | Tangentbord F22 | 0x0007 | 0x0071 | 0x006D | |
Tangentbord/knappsats | Tangentbord F23 | 0x0007 | 0x0072 | 0x006E | |
Tangentbord/knappsats | Tangentbord F24 | 0x0007 | 0x0073 | 0x0076 | |
Tangentbord/knappsats | Kommatecken på knappsats | 0x0007 | 0x0085 | 0x007E | 107 *Notering 4 |
Tangentbord/knappsats | Tangentbord International1 | 0x0007 | 0x0087 | 0x0073 | 56 *Notera 4, 5 |
Tangentbord/knappsats | Tangentbord International2 | 0x0007 | 0x0088 | 0x0070 | 133 *Anmärkning 5 |
Tangentbord/knappsats | Tangentbord International3 | 0x0007 | 0x0089 | 0x007D | 14 *Not 5 |
Tangentbord/knappsats | Tangentbord International4 | 0x0007 | 0x008A | 0x0079 | 132 *Notering 5 |
Tangentbord/knappsats | Tangentbord International5 | 0x0007 | 0x008B | 0x007B | 131 *Note 5 |
Tangentbord/knappsats | Tangentbord International6 | 0x0007 | 0x008C | 0x005C | |
Tangentbord/knappsats | Tangentbord LANG1 | 0x0007 | 0x0090 | 0x0072 *Anteckning 6 0x00F2 *Notera 3, 6 |
|
Tangentbord/knappsats | Tangentbord LANG2 | 0x0007 | 0x0091 | 0x0071 *Notering 6 0x00F1 *Notera 3, 6 |
|
Tangentbord/knappsats | Tangentbord LANG3 | 0x0007 | 0x0092 | 0x0078 | |
Tangentbord/knappsats | Tangentbord LANG4 | 0x0007 | 0x0093 | 0x0077 | |
Tangentbord/knappsats | Tangentbord LANG5 | 0x0007 | 0x0094 | 0x0076 | |
Tangentbord/knappsats | Tangentbord Vänsterkontroll | 0x0007 | 0x00E0 | 0x001D | 58 |
Tangentbord/knappsats | Tangentbord Vänster Skift | 0x0007 | 0x00E1 | 0x002A | 44 |
Tangentbord/knappsats | Tangentbord Vänster Alt | 0x0007 | 0x00E2 | 0x0038 | 60 |
Tangentbord/knappsats | Vänster GUI-tangent | 0x0007 | 0x00E3 | 0xE05B | 127 |
Tangentbord/knappsats | Tangentbord Högerkontroll | 0x0007 | 0x00E4 | 0xE01D | 64 |
Tangentbord/knappsats | HögerSkift på tangentbordet | 0x0007 | 0x00E5 | 0x0036 | 57 |
Tangentbord/knappsats | Tangentbordet Höger Alt | 0x0007 | 0x00E6 | 0xE038 | 62 |
Tangentbord/knappsats | Tangentbord, höger GUI | 0x0007 | 0x00E7 | 0xE05C | 128 |
Konsument | Skanna nästa spår | 0x000C | 0x00B5 | 0xE019 | |
Konsument | Sök igenom föregående spår | 0x000C | 0x00B6 | 0xE010 | |
Konsument | Stoppa | 0x000C | 0x00B7 | 0xE024 | |
Konsument | Spela upp/pausa | 0x000C | 0x00CD | 0xE022 | |
Konsument | Tysta | 0x000C | 0x00E2 | 0xE020 | |
Konsument | Volymökning | 0x000C | 0x00E9 | 0xE030 | |
Konsument | Volymminskning | 0x000C | 0x00EA | 0xE02E | |
Konsument | Konfiguration av AL-konsumentkontroll | 0x000C | 0x0183 | 0xE06D | |
Konsument | AL-e-postläsare | 0x000C | 0x018A | 0xE06C | |
Konsument | AL-kalkylator | 0x000C | 0x0192 | 0xE021 | |
Konsument | AL Local Machine Browser | 0x000C | 0x0194 | 0xE06B | |
Konsument | AC-sökning | 0x000C | 0x0221 | 0xE065 | |
Konsument | Hem med AC | 0x000C | 0x0223 | 0xE032 | |
Konsument | AC Bakåt | 0x000C | 0x0224 | 0xE06A | |
Konsument | AC Forward | 0x000C | 0x0225 | 0xE069 | |
Konsument | AC-stopp | 0x000C | 0x0226 | 0xE068 | |
Konsument | AC-uppfräschning | 0x000C | 0x0227 | 0xE067 | |
Konsument | AC-bokmärken | 0x000C | 0x022A | 0xE066 |
Anteckningar:
- SysRq skanningskod genereras vid tangenttryckning av Alt+Print-skärm
- Bryt tangentscanningkod skickas ut på Ctrl+Pausa tangenttryckning
- Som du ser i äldre tangentbordsmeddelanden
- Nyckeln finns på brasilianska tangentbord
- Nyckeln finns på japanska tangentbord
- Skankoden genereras endast vid tangentens frigivningshändelse
Flaggan extended-key anger om tangenttryckningsmeddelandet kommer från en av de ytterligare tangenterna på det utökade tangentbordet med 101/102-tangenter. De utökade tangenterna består av Alt- och Ctrl- tangenterna till höger på tangentbordet; Insert*, Delete*, Home, End, Page up, Page down, och Piltangenterna i klustren till vänster om det numeriska tangentbordet; Num lock tangenten; Break (Ctrl+Paus) tangenten; Print Screen tangenten; och Dividera (/) och Enter tangenterna på det numeriska tangentbordet. Den högra Skift--nyckeln betraktas inte som en utökad nyckel, utan har en separat genomsökningskod i stället.
Om det anges består genomsökningskoden av en sekvens med två byte, där den första byte har värdet 0xE0.
Kontextkoden anger om Alt--tangenten var nere när tangenttryckningsmeddelandet genererades. Koden är 1 om Alt--nyckeln var nere och 0 om den var uppe.
Den tidigare flaggan för nyckeltillstånd anger om nyckeln som genererade tangenttryckningsmeddelandet tidigare var upp eller ned. Det är 1 om nyckeln tidigare var nere och 0 om nyckeln tidigare var upp. Du kan använda den här flaggan för att identifiera tangenttryckningsmeddelanden som genereras av tangentbordets automatiska upprepningsfunktion. Den här flaggan är inställd på 1 för WM_KEYDOWN och WM_SYSKEYDOWN tangenttryckningsmeddelanden som genereras av funktionen för automatisk upprepning. Den är alltid inställd på 1 för WM_KEYUP och WM_SYSKEYUP meddelanden.
Övergångstillståndsflaggan anger om du trycker på en nyckel eller släpper en nyckel som genererat tangenttryckningsmeddelandet. Den här flaggan är alltid inställd på 0 för WM_KEYDOWN och WM_SYSKEYDOWN meddelanden. det är alltid inställt på 1 för WM_KEYUP och WM_SYSKEYUP meddelanden.
Tangenttryckningsmeddelanden ger mycket information om tangenttryckningar, men de tillhandahåller inte teckenkoder för teckentangenttryckningar. För att hämta teckenkoder måste ett program inkludera funktionen TranslateMessage i sin trådmeddelandeslinga. TranslateMessage skickar ett WM_KEYDOWN eller WM_SYSKEYDOWN meddelande till tangentbordslayouten. Layouten undersöker meddelandets kod för virtuell nyckel och ger, om den motsvarar en teckennyckel, teckenkodens motsvarighet (med hänsyn till tillståndet för Shift och Caps Lock nycklar). Sedan genereras ett teckenmeddelande som innehåller teckenkoden och placerar meddelandet överst i meddelandekön. Nästa iteration av meddelandeloopen tar bort teckenmeddelandet från kön och skickar meddelandet till lämplig fönsterprocedur.
Det här avsnittet täcker följande ämnen:
En fönsterprocedur kan ta emot följande teckenmeddelanden: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARoch WM_UNICHAR. Funktionen TranslateMessage genererar ett WM_CHAR- eller WM_DEADCHAR meddelande när det bearbetar ett WM_KEYDOWN meddelande. På samma sätt genereras ett WM_SYSCHAR eller WM_SYSDEADCHAR meddelande när ett WM_SYSKEYDOWN meddelande bearbetas.
Ett program som bearbetar tangentbordsindata ignorerar vanligtvis alla meddelanden utom WM_CHAR och WM_UNICHAR, vilket skickar andra meddelanden till funktionen DefWindowProc. Observera att WM_CHAR använder UTF-16 (16-bitars Unicode Transformation Format) eller ANSI-teckenuppsättning medan WM_UNICHAR alltid använder UTF-32 (32-bitars Unicode-transformeringsformat). Systemet använder WM_SYSCHAR- och WM_SYSDEADCHAR-meddelanden för att implementera menygenvägar.
Parametern wParam för alla teckenmeddelanden innehåller teckenkoden för teckennyckeln som trycktes ned. Värdet för teckenkoden beror på fönsterklassen för fönstret som tar emot meddelandet. Om Unicode-versionen av funktionen RegisterClass användes för att registrera fönsterklassen, tillhandahåller systemet Unicode-tecken till alla fönster i den klassen. Annars tillhandahåller systemet ANSI-teckenkoder. Mer information finns i Registrera fönsterklasser och Använda UTF-8-kodsidor i Windows-appar.
Innehållet i parametern lParam för ett teckenmeddelande är identiskt med innehållet i parametern lParam i tangenttryckningsmeddelandet som översattes för att skapa teckenmeddelandet. För information, se tangenttryckningsmeddelandeflaggor.
Vissa tangentbord som inte är engelska innehåller teckennycklar som inte förväntas generera tecken på sig själva. I stället används de för att lägga till ett diakritiskt tecken i tecknet som skapas av efterföljande tangenttryckning. Dessa tangenter kallas döda tangenter. Cirkumflexnyckeln på ett tyskt tangentbord är ett exempel på en död nyckel. Om en tysk användare vill mata in tecknet som består av ett "o" med cirkumflex, trycker de på cirkumflextangenten följt av "o"-tangenten. Fönstret med tangentbordsfokus skulle få följande sekvens med meddelanden:
TranslateMessage genererar WM_DEADCHAR-meddelandet när det bearbetar WM_KEYDOWN-meddelandet från en död nyckel. Även om parametern wParam för WM_DEADCHAR-meddelandet innehåller teckenkoden för den döda nyckeln, ignorerar ett program vanligtvis meddelandet. I stället bearbetas det WM_CHAR meddelande som genereras av efterföljande tangenttryckning. Parametern wParam i WM_CHAR-meddelandet innehåller bokstavens teckenkod med diakritiska tecken. Om den efterföljande tangenttryckningen genererar ett tecken som inte kan kombineras med ett diakritiskt tecken genererar systemet två WM_CHAR meddelanden. Parametern wParam för den första innehåller teckenkoden för diakritiska. parametern wParam för den andra innehåller teckenkoden för den efterföljande teckennyckeln.
Funktionen TranslateMessage genererar det WM_SYSDEADCHAR meddelandet när det bearbetar WM_SYSKEYDOWN-meddelandet från en systemlös nyckel (en död nyckel som trycks in i kombination med Alt-tangenten). Ett program ignorerar vanligtvis meddelandet WM_SYSDEADCHAR.
När du bearbetar ett tangentbordsmeddelande kan ett program behöva fastställa statusen för en annan nyckel förutom den som genererade det aktuella meddelandet. Ett ordbehandlingsprogram som gör att användaren kan trycka på Skift+End- för att markera ett textblock måste till exempel kontrollera statusen för Skift-tangenten när det tar emot ett tangenttryckningsmeddelande från End-tangenten. Programmet kan använda funktionen GetKeyState för att fastställa status för en virtuell nyckel när det aktuella meddelandet genererades. den kan använda funktionen GetAsyncKeyState för att hämta den aktuella statusen för en virtuell nyckel.
Vissa tangenter anses vara växlingstangenter som ändrar tangentbordslayoutens tillstånd. Växlingstangenter omfattar vanligtvis Caps Lock (VK_CAPITAL), Num Lock (VK_NUMLOCK) och Scroll Lock (VK_SCROLL) tangenterna. De flesta tangentbord har motsvarande LED-indikatorer för dessa nycklar.
Tangentbordslayouten har en lista med namn. Namnet på en nyckel som genererar ett enda tecken är samma som det tecken som genereras av nyckeln. Namnet på en icke-teckennyckel, till exempel Tab och Enter lagras som en teckensträng. Ett program kan hämta namnet på valfri nyckel från tangentbordslayouten genom att anropa funktionen GetKeyNameText.
Systemet innehåller flera specialfunktioner som översätter genomsökningskoder, teckenkoder och virtuella nyckelkoder som tillhandahålls av olika tangenttryckningsmeddelanden. Dessa funktioner omfattar MapVirtualKey, ToAscii, ToUnicodeoch VkKeyScan.
Dessutom stöder Microsoft Rich Edit 3.0 HexToUnicode IME, som gör att en användare kan konvertera mellan hexadecimala och Unicode-tecken med hjälp av snabbtangenter. Det innebär att när Microsoft Rich Edit 3.0 införlivas i ett program ärver programmet funktionerna i HexToUnicode IME.
En är en nyckelkombination som genererar ett WM_HOTKEY meddelande, ett meddelande som systemet placerar högst upp i en tråds meddelandekö och kringgår befintliga meddelanden i kön. Program använder snabbtangenter för att hämta tangentbordsindata med hög prioritet från användaren. Genom att till exempel definiera en snabbnyckel som består av Ctrl+C- tangenttryckning kan ett program göra det möjligt för användaren att avbryta en lång åtgärd.
För att definiera en snabbnyckel anropar ett program funktionen RegisterHotKey och anger kombinationen av nycklar som genererar WM_HOTKEY meddelande, handtaget till fönstret för att ta emot meddelandet och identifieraren för snabbnyckeln. När användaren trycker på snabbtangenten placeras ett WM_HOTKEY meddelande i meddelandekön i tråden som skapade fönstret. Parametern wParam i meddelandet innehåller identifieraren för snabbnyckeln. Programmet kan definiera flera snabbnycklar för en tråd, men varje snabbnyckel i tråden måste ha en unik identifierare. Innan programmet avslutas bör det använda funktionen UnregisterHotKey för att förstöra snabbnyckeln.
Program kan använda en snabbnyckelkontroll för att göra det enkelt för användaren att välja en snabbnyckel. Hot key-kontroller används vanligtvis för att definiera en snabbnyckel som aktiverar ett fönster. de använder inte funktionerna RegisterHotKey och UnregisterHotKey. I stället skickar ett program som använder en snabbnyckelkontroll vanligtvis det WM_SETHOTKEY meddelandet för att ange den heta nyckeln. När användaren trycker på snabbtangenten skickar systemet ett WM_SYSCOMMAND meddelande som anger SC_HOTKEY. Mer information om snabbtangentkontroller finns i "Använda snabbnyckelkontroller" i Hot Key Controls.
Windows har stöd för tangentbord med särskilda nycklar för webbläsarfunktioner, mediefunktioner, programstart och energisparfunktioner. WM_APPCOMMAND har stöd för extra tangentbordstangenter. Dessutom ändras funktionen ShellProc för att stödja de extra tangentbordstangenterna.
Det är osannolikt att ett underordnat fönster i ett komponentprogram kommer att kunna implementera kommandon direkt för dessa extra tangentbordsnycklar. När en av dessa nycklar trycks ned skickar DefWindowProc ett WM_APPCOMMAND meddelande till ett fönster. DefWindowProc vidarebefordrar också WM_APPCOMMAND meddelandet till det överordnade fönstret. Detta liknar hur snabbmenyer anropas med höger musknapp, vilket är att DefWindowProc skickar ett WM_CONTEXTMENU meddelande med en högerklicka och bubblar det till dess överordnade. Om DefWindowProc tar emot ett WM_APPCOMMAND meddelande för ett fönster på den översta nivån anropas dessutom en gränssnittskrok med kod HSHELL_APPCOMMAND.
Windows stöder även Microsoft IntelliMouse Explorer, som är en mus med fem knappar. De två extra knapparna stöder framåt- och bakåtriktad webbläsarnavigering. Mer information finns i XBUTTONs.
Om du vill simulera en oavbruten serie användarindatahändelser använder du funktionen SendInput. Funktionen tar emot tre parametrar. Den första parametern, cInputs, anger antalet indatahändelser som ska simuleras. Den andra parametern, rgInputs, är en matris med INPUT- strukturer, där var och en beskriver en typ av indatahändelse och ytterligare information om händelsen. Den sista parametern, cbSize, accepterar storleken på strukturen INPUT i byte.
Funktionen SendInput fungerar genom att mata in en serie simulerade indatahändelser i en enhets indataström. Effekten liknar att anropa funktionen keybd_event eller mouse_event upprepade gånger, förutom att systemet ser till att inga andra indatahändelser stämmer med de simulerade händelserna. När anropet är klart anger returvärdet antalet indatahändelser som har spelats upp. Om det här värdet är noll blockerades indata.
Funktionen SendInput återställer inte tangentbordets aktuella tillstånd. Om användaren har några tangenter som trycks in när du anropar den här funktionen kan de därför störa de händelser som den här funktionen genererar. Om du är orolig för eventuell interferens kontrollerar du tangentbordets tillstånd med funktionen GetAsyncKeyState och korrigerar efter behov.
Ett språk är ett naturligt språk, till exempel engelska, franska och japanska. En underspråk är en variant av ett naturligt språk som talas i en viss geografisk region, till exempel engelska underspråk som talas i Storbritannien och USA. Program använder värden som kallas språkidentifierareför att unikt identifiera språk och underspråk.
Program använder vanligtvis nationella inställningar för att ange det språk där indata och utdata bearbetas. Om du till exempel anger språkinställningen för tangentbordet påverkas de teckenvärden som genereras av tangentbordet. Om du anger nationella inställningar för bildskärmen eller skrivaren påverkas de tecken som visas eller skrivs ut. Applikationer ställer in den regionala inställningen för ett tangentbord genom att läsa in och använda tangentbordslayouter. De anger nationella inställningar för en bildskärm eller skrivare genom att välja ett teckensnitt som stöder det angivna språket.
En tangentbordslayout anger inte bara tangenternas fysiska position på tangentbordet, utan avgör även de teckenvärden som genereras genom att trycka på tangenterna. Varje layout identifierar det aktuella indataspråket och avgör vilka teckenvärden som genereras av vilka nycklar och nyckelkombinationer.
Varje tangentbordslayout har ett motsvarande handtag som identifierar layouten och språket. Det låga ordet i handtaget är en språkidentifierare. Det höga ordet är ett enhetshandtag som anger den fysiska layouten, eller så är det noll vilket indikerar en fysisk standardlayout. Användaren kan associera valfritt indataspråk med en fysisk layout. Till exempel kan en engelsktalande användare som mycket ibland arbetar på franska ange tangentbordets indataspråk till franska utan att ändra tangentbordets fysiska layout. Det innebär att användaren kan ange text på franska med hjälp av den välbekanta engelska layouten.
Program förväntas vanligtvis inte manipulera indataspråk direkt. I stället konfigurerar användaren språk- och layoutkombinationer och växlar sedan mellan dem. När användaren klickar i text markerad med ett annat språk anropar programmet funktionen ActivateKeyboardLayout för att aktivera användarens standardlayout för det språket. Om användaren redigerar text på ett språk som inte finns i den aktiva listan kan programmet anropa funktionen LoadKeyboardLayout med språket för att få en layout baserad på det språket.
Funktionen ActivateKeyboardLayout anger indataspråket för den aktuella aktiviteten. Parametern hkl kan antingen vara handtaget till tangentbordslayouten eller en nollutökad språkidentifierare. Tangentbordslayout-handtag kan hämtas från funktionen LoadKeyboardLayout eller GetKeyboardLayoutList. Värdena HKL_NEXT och HKL_PREV kan också användas för att välja nästa eller föregående tangentbord.
Funktionen GetKeyboardLayoutName hämtar namnet på den aktiva tangentbordslayouten för den anropande tråden. Om ett program skapar den aktiva layouten med funktionen LoadKeyboardLayout hämtar GetKeyboardLayoutName samma sträng som används för att skapa layouten. Annars är strängen den primära språkidentifieraren som motsvarar den aktiva layoutens locale. Det innebär att funktionen kanske inte nödvändigtvis skiljer mellan olika layouter med samma primära språk, så det går inte att returnera specifik information om indataspråket. Funktionen GetKeyboardLayout kan dock användas för att fastställa indataspråket.
Funktionen LoadKeyboardLayout läser in en tangentbordslayout och gör layouten tillgänglig för användaren. Program kan göra layouten omedelbart aktiv för den aktuella tråden med hjälp av värdet KLF_ACTIVATE. Ett program kan använda värdet KLF_REORDER för att ändra ordning på layouterna utan att ange värdet för KLF_ACTIVATE. Program bör alltid använda värdet KLF_SUBSTITUTE_OK vid inläsning av tangentbordslayouter för att säkerställa att användarens inställningar, om några, är valda.
För flerspråkigt stöd tillhandahåller funktionen LoadKeyboardLayout flaggorna KLF_REPLACELANG och KLF_NOTELLSHELL. Flaggan KLF_REPLACELANG instruerar funktionen att ersätta en befintlig tangentbordslayout utan att ändra språket. Försök att ersätta en befintlig layout med samma språkidentifierare, men utan att ange KLF_REPLACELANG är ett fel. Flaggan KLF_NOTELLSHELL förhindrar att funktionen meddelar gränssnittet när en tangentbordslayout läggs till eller ersätts. Detta är användbart för program som lägger till flera layouter i en serie anrop i följd. Den här flaggan ska användas i alla utom det sista anropet.
Funktionen UnloadKeyboardLayout är begränsad eftersom den inte kan ta bort systemets standardindataspråk. Detta säkerställer att användaren alltid har en layout tillgänglig för att ange text med samma teckenuppsättning som används av gränssnittet och filsystemet.