Läs på engelska

Dela via


Översikt över tangentbordsindata

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.

Tangentbordsinmatningsmodell

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.

modell för bearbetning av tangentbordsindata

Tangentbordsfokus och aktivering

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.

Tangenttryckningsmeddelanden

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:

Tangenttryckningar för system och icke-system

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.

Beskrivning av Virtual-Key Koder

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.

Meddelandeflaggor för tangenttryckning

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.

platserna för flaggorna och värdena i parametern lparam för ett tangenttryckningsmeddelande

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;

Antal repetition

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.

Skanningskoder

diagram över ett typ 4-tangentbord med nyckelplatserna för varje nyckel.

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:

  1. SysRq skanningskod genereras vid tangenttryckning av Alt+Print-skärm
  2. Bryt tangentscanningkod skickas ut på Ctrl+Pausa tangenttryckning
  3. Som du ser i äldre tangentbordsmeddelanden
  4. Nyckeln finns på brasilianska tangentbord
  5. Nyckeln finns på japanska tangentbord
  6. Skankoden genereras endast vid tangentens frigivningshändelse

Extended-Key-flagg

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.

Kontextkod

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.

Föregående Key-State-flagga

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.

Transition-State Flagga

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

Teckenmeddelanden

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:

Icke-system teckenmeddelanden

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.

Dead Character-meddelanden

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:

  1. WM_KEYDOWN
  2. WM_DEADCHAR
  3. WM_KEYUP
  4. WM_KEYDOWN
  5. WM_CHAR
  6. WM_KEYUP

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.

Nyckelstatus

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.

Tangenttryckning och teckenöversättningar

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.

Hot-Key stöd

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.

Tangentbordstangenter för surfning och andra funktioner

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.

Simulera indata

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.

Språk, nationella inställningar och tangentbordslayouter

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.