Sdílet prostřednictvím


Přehled vstupu klávesnice

Aplikace by měly přijímat uživatelský vstup z klávesnice i z myši. Aplikace přijímá vstup pomocí klávesnice ve formě zpráv odeslaných do svých oken.

Model zadávání klávesnice

Systém poskytuje podporu klávesnice nezávislé na zařízeních pro aplikace instalací ovladače klávesnice vhodného pro aktuální klávesnici. Systém poskytuje podporu klávesnice nezávislou na jazyce pomocí rozložení klávesnice specifického pro jazyk, které aktuálně uživatel nebo aplikace vybral. Ovladač zařízení klávesnice přijímá kódy skenování z klávesnice, které se odesílají do rozložení klávesnice, kde jsou přeloženy do zpráv a publikovány do příslušných oken ve vaší aplikaci.

Každé klávese na klávesnici má přiřazenou jedinečnou hodnotu zvanou scan kód, který je závislý na zařízení a určuje klávesu na klávesnici. Klávesnice generuje dva kódy skenování, když uživatel zadá klávesu – jeden, když uživatel stiskne klávesu a druhý, když uživatel uvolní klávesu.

Ovladač zařízení klávesnice interpretuje kód skenování a překládá ho na kód virtuálního klíče, hodnotu nezávislou na zařízení definovanou systémem, která identifikuje účel klíče. Po překladu kódu skenování vytvoří rozložení klávesnice zprávu, která obsahuje kód kontroly, kód virtuálního klíče a další informace o stisknutí klávesy a potom zprávu umístí do systémové fronty zpráv. Systém odebere zprávu z fronty systémových zpráv a odešle ji do fronty zpráv příslušného vlákna. Nakonec je zpráva odebrána ze smyčky zpráv vlákna a předána příslušné proceduře okna ke zpracování. Následující obrázek znázorňuje model zadávání klávesnice.

model zpracování vstupu klávesnice

Fokus klávesnice a aktivace

Systém posílá zprávy klávesnice do fronty zpráv popředního vlákna, které vytvořilo okno se zaměřením klávesnice. Fokus klávesnice je dočasná vlastnost okna. Systém sdílí klávesnici mezi všemi okny na displeji tak, že posune fokus klávesnice ve směru uživatele z jednoho okna do druhého. Okno s fokusem klávesnice obdrží (z fronty zpráv vlákna, které ho vytvořilo), všechny zprávy klávesnice, dokud se fokus nezmění na jiné okno.

Vlákno může volat funkci GetFocus, aby určilo, která z jeho oken (pokud nějaká existují) má aktuálně klávesnicový fokus. Vlákno může dát fokus klávesnice na jedno ze svých oken voláním funkce SetFocus. Když se fokus klávesnice změní z jednoho okna na druhé, systém odešle zprávu WM_KILLFOCUS do okna, které fokus ztratil, a pak odešle WM_SETFOCUS zprávu do okna, které získalo fokus.

Koncept fokusu klávesnice souvisí s aktivním oknem. aktivní okno je okno nejvyšší úrovně, se kterým uživatel aktuálně pracuje. Okno s fokusem klávesnice je aktivní okno nebo podřízené okno aktivního okna. Aby mohl uživatel identifikovat aktivní okno, systém ho umístí do horní části pořadí Z a zvýrazní jeho záhlaví (pokud má jedno) a ohraničení.

Uživatel může aktivovat okno nejvyšší úrovně tak, že na něj klikne, vybere ho pomocí Alt+Tab nebo Kombinaci kláves Alt+Esc kláves nebo ho vybere ze seznamu úkolů. Vlákno může aktivovat okno nejvyšší vrstvy pomocí funkce SetActiveWindow. Pomocí funkce GetActiveWindow může určit, jestli je vytvořené okno nejvyšší úrovně aktivní.

Když je jedno okno deaktivované a jiné aktivované, systém odešle WM_ACTIVATE zprávu. Slovo s nízkým pořadím parametru wParam je nula, pokud je okno deaktivováno a nenulové, pokud je aktivováno. Když výchozí procedura okna obdrží zprávu WM_ACTIVATE, nastaví fokus klávesnice na aktivní okno.

Chcete-li blokovat události zadávání klávesnice a myši do aplikací, použijte BlockInput. Všimněte si, že funkce BlockInput nebude rušit stavovou tabulku asynchronního vstupu z klávesnice. To znamená, že volání funkce SendInput při blokování vstupu změní asynchronní tabulku stavu vstupu klávesnice.

Zprávy stisknutí kláves

Stisknutí klávesy způsobí, že se zpráva WM_KEYDOWN nebo WM_SYSKEYDOWN umístí do fronty zpráv vlákna připojeného k oknu, které má fokus klávesnice. Uvolnění klíče způsobí umístění zprávy typu WM_KEYUP nebo WM_SYSKEYUP do fronty.

Zprávy s klávesami nahoru a dolů se obvykle vyskytují ve dvojicích, ale pokud uživatel drží klávesu dostatečně dlouho, aby spustil funkci automatického opakování klávesnice, systém vygeneruje řadu WM_KEYDOWN nebo WM_SYSKEYDOWN zpráv za sebou. Potom vygeneruje jednu WM_KEYUP nebo WM_SYSKEYUP zprávu, když uživatel klíč uvolní.

Tato část se zabývá následujícími tématy:

Systémové a nesystémové stisknutí kláves

Systém rozlišuje systémové stisknutí kláves a nesystémové stisknutí kláves. Systémové stisknutí kláves vytváří systémové zprávy, WM_SYSKEYDOWN a WM_SYSKEYUP. Nesystémové stisknutí kláves vytváří nesystémové zprávy stisknutí kláves, WM_KEYDOWN a WM_KEYUP.

Pokud váš postup okna musí zpracovat zprávu systémového stisknutí kláves, ujistěte se, že ji procedura po zpracování zprávy předá funkci DefWindowProc. V opačném případě budou všechny systémové operace zahrnující klávesu Alt zakázány, kdykoli bude mít okno fokus klávesnice. To znamená, že uživatel nebude moct získat přístup k nabídkám okna nebo k systémové nabídce nebo k aktivaci jiného okna použít Alt+Esc nebo Alt+Tab stisknutí kláves.

Zprávy systémového stisknutí kláves jsou primárně určeny pro systém, nikoli pro aplikaci. Systém je používá k poskytování integrovaného rozhraní klávesnice k nabídkám a k tomu, aby uživatel mohl řídit, které okno je aktivní. Zprávy o stisknutí kláves systému se generují, když uživatel zadá klávesu v kombinaci s klávesou Alt nebo když uživatel zadá a žádné okno nemá fokus klávesnice (například když je aktivní aplikace minimalizovaná). V tomto případě se zprávy publikují do fronty zpráv připojené k aktivnímu okně.

Zprávy nesystémového stisknutí kláves jsou určené pro použití v oknech aplikací; funkce DefWindowProc s nimi nic nedělá. Procedura okna může zahodit všechny nesystémové zprávy stisknutí kláves, které nepotřebujete.

Virtual-Key popis kódů

Parametr wParam zprávy týkající se stisknutí klávesy obsahuje virtuální kód klávesy, která byla stisknuta nebo uvolněna. Procedura okna zpracovává nebo ignoruje zprávu stisknutí klávesy v závislosti na hodnotě kódu virtuálního klíče.

Typický postup okna zpracovává pouze malou podmnožinu zpráv stisknutí kláves, které přijímá a ignoruje zbytek. Například procedura okna může zpracovávat pouze WM_KEYDOWN zprávy stisknutí kláves a pouze ty, které obsahují kódy virtuálního klíče pro pohybové klávesy kurzoru, shift klávesy (označované také jako řídicí klávesy) a funkční klávesy. Typický postup okna nezpracovává zprávy o stisknutí kláves z klávesových klíčů. Místo toho používá funkci TranslateMessage k převodu zprávy na zprávy znaků. Další informace o TranslateMessage a znakových zprávách naleznete v tématu Zprávy znaků.

Příznaky zprávy stisknutí klávesy

Parametr lParam zprávy stisknutí klávesy obsahuje další informace o stisknutí klávesy, která zprávu vygenerovala. Tyto informace zahrnují počet opakování , kód skenování , příznak rozšířeného klíče , kontextový kód , příznak předchozího stavu klávesy a příznak stavu přechodu . Následující obrázek znázorňuje umístění těchto příznaků a hodnot v parametru lParam.

umístění příznaků a hodnot v parametru lparam zprávy stisknutí klávesy

Aplikace může použít následující hodnoty k získání příznaků stisknutí kláves z vysoce seřazeného slova lParam.

Hodnota Popis
KF_EXTENDED
0x0100
Manipuluje s rozšířeným příznakem klíče .
KF_DLGMODE
0x0800
Pracuje s příznakem režimu dialogového okna, který označuje, zda je dialogové okno aktivní.
KF_MENUMODE
0x1000
Manipuluje s příznakem režimu nabídky, který označuje, jestli je nabídka aktivní.
KF_ALTDOWN
0x2000
Manipuluje s příznakem kódu kontextu .
KF_REPEAT
0x4000
Manipuluje příznakem předchozího stavu klíče .
KF_UP
0x8000
Manipuluje příznakem stavu přechodu .

Příklad kódu:

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;

Počet opakování

Počet opakování můžete zkontrolovat a zjistit, jestli zpráva stisknutí kláves představuje více než jedno stisknutí kláves. Systém zvýší počet, když klávesnice generuje WM_KEYDOWN nebo WM_SYSKEYDOWN zprávy rychleji, než je aplikace dokáže zpracovat. K tomu často dochází, když uživatel podrží klávesu dostatečně dlouho, aby spustil funkci automatického opakování klávesnice. Místo vyplnění systémové fronty zpráv výslednými zprávami o stisknutí klávesy systém kombinuje zprávy do jedné zprávy o stisknutí klávesy a zvyšuje počítadlo opakování. Uvolnění klíče nemůže spustit funkci automatického opakování, takže počet opakování pro WM_KEYUP a WM_SYSKEYUP zprávy je vždy nastaven na hodnotu 1.

Skenovat kódy

diagram klávesnice Typu 4 s umístěním kláves pro každou klávesu.

Kód kontroly je hodnota, kterou systém generuje, když uživatel stiskne klávesu. Jedná se o hodnotu, která identifikuje stisknutou klávesu bez ohledu na aktivní rozložení klávesnice, na rozdíl od znaku reprezentovaného klávesou. Aplikace obvykle ignoruje kódy skenování. Místo toho používá kódy virtuálních klíčů k interpretaci zpráv o stisknutí kláves.

Moderní klávesnice používají Zařízení pro lidské rozhraní (HID) specifikaci pro komunikaci s počítačem. ovladač klávesnice převede hlášené hodnoty využití HID odeslané z klávesnice na kódy skenování a předává je do aplikací.

Poznámka

I když jsou kódy virtuálních kláves obvykle užitečnější pro desktopové aplikace, můžou být kódy skenování vyžadovány v konkrétních případech, když potřebujete vědět, která klávesa se stiskne bez ohledu na aktuální rozložení klávesnice. Například klávesy WASD (W je nahoru, A je vlevo, S je dolů a D je vpravo) pro hry, které zajišťují konzistentní tvorbu klíčů v US QWERTY nebo francouzské AZERTY rozložení klávesnice.

Následující tabulka uvádí sadu kódů skenování, jak je v současnosti rozpoznáno systémem Windows. stránka použití HID/ID použití HID/název použití HID hodnoty odkazují na dokument tabulek využití HID . Umístění klíče hodnoty odkazují na předchozí obrázek klávesnice.

Kód Scan 1 Make se doručuje ve WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP a WM_INPUT zprávách.

Název stránky využití HID Název použití HID Stránka využití HID ID použití HID Naskenovat 1 výrobce Umístění klíče
Obecná pracovní plocha Vypnutí systému 0x0001 0x0081 0xE05E
Obecná pracovní plocha Režim spánku systému 0x0001 0x0082 0xE05F
Obecná pracovní plocha Probuzení systému 0x0001 0x0083 0xE063
Klávesnice/klávesnice numerická ErrorRollOver 0x0007 0x0001 0x00FF
Klávesnice/klávesnice numerická Klávesnice A 0x0007 0x0004 0x001E 31
Klávesnice/klávesnice numerická Klávesnice B 0x0007 0x0005 0x0030 50
Klávesnice/klávesnice numerická Klávesnice C 0x0007 0x0006 0x002E 48
Klávesnice/klávesnice numerická Klávesnice D 0x0007 0x0007 0x0020 33
Klávesnice/klávesnice numerická Klávesnice E 0x0007 0x0008 0x0012 19
Klávesnice/klávesnice numerická Klávesnice F 0x0007 0x0009 0x0021 34
Klávesnice/klávesnice numerická Klávesnice G 0x0007 0x000A 0x0022 35
Klávesnice/klávesnice numerická Klávesnice H 0x0007 0x000B 0x0023 36
Klávesnice/klávesnice numerická Klávesnice I 0x0007 0x000C 0x0017 dvacet čtyři
Klávesnice/klávesnice numerická Klávesnice J 0x0007 0x000D 0x0024 37
Klávesnice/klávesnice numerická Klávesnice K 0x0007 0x000E 0x0025 38
Klávesnice/klávesnice numerická Klávesnice L 0x0007 0x000F 0x0026 39
Klávesnice/klávesnice numerická Klávesnice M 0x0007 0x0010 0x0032 52
Klávesnice/klávesnice numerická Klávesnice N 0x0007 0x0011 0x0031 51
Klávesnice/klávesnice numerická Klávesnice O 0x0007 0x0012 0x0018 25
Klávesnice/klávesnice numerická Klávesnice P 0x0007 0x0013 0x0019 26
Klávesnice/klávesnice numerická Klávesnice Q 0x0007 0x0014 0x0010 17
Klávesnice/klávesnice numerická Klávesnice R 0x0007 0x0015 0x0013 20
Klávesnice/klávesnice numerická Klávesnice S 0x0007 0x0016 0x001F 32
Klávesnice/klávesnice numerická Klávesnice T 0x0007 0x0017 0x0014 21
Klávesnice/klávesnice numerická Klávesnice U 0x0007 0x0018 0x0016 dvacet tři
Klávesnice/klávesnice numerická Klávesnice V 0x0007 0x0019 0x002F 49
Klávesnice/klávesnice numerická Klávesnice W 0x0007 0x001A 0x0011 18
Klávesnice/klávesnice numerická Klávesnice X 0x0007 0x001B 0x002D 47
Klávesnice/klávesnice numerická Klávesnice Y 0x0007 0x001C 0x0015 22
Klávesnice/klávesnice numerická Klávesnice Z 0x0007 0x001D 0x002C 46
Klávesnice/klávesnice numerická Klávesnice 1 a Bang 0x0007 0x001E 0x0002 2
Klávesnice/klávesnice numerická Klávesnice 2 a At 0x0007 0x001F 0x0003 3
Klávesnice/klávesnice numerická Klávesnice 3 a znak hash 0x0007 0x0020 0x0004 4
Klávesnice/klávesnice numerická Klávesnice 4 a Dolar 0x0007 0x0021 0x0005 5
Klávesnice/klávesnice numerická Klávesnice 5 a procento 0x0007 0x0022 0x0006 6
Klávesnice/klávesnice numerická Klávesnice 6 a kurzor 0x0007 0x0023 0x0007 7
Klávesnice/klávesnice numerická "Klávesnice číslo 7 a Ampersand" 0x0007 0x0024 0x0008 8
Klávesnice/klávesnice numerická Klávesnice 8 a hvězdička 0x0007 0x0025 0x0009 9
Klávesnice/klávesnice numerická Klávesnice 9 a levá závorka 0x0007 0x0026 0x000A 10
Klávesnice/klávesnice numerická Klávesnice 0 a pravá hranatá závorka 0x0007 0x0027 0x000B 11
Klávesnice/klávesnice numerická Klávesa Return Enter 0x0007 0x0028 0x001C 43
Klávesnice/klávesnice numerická Klávesa Escape 0x0007 0x0029 0x0001 110
Klávesnice/klávesnice numerická Odstranění klávesnice 0x0007 0x002A 0x000E 15
Klávesnice/klávesnice numerická Tab Klávesnice 0x0007 0x002B 0x000F 16
Klávesnice/klávesnice numerická Mezerník klávesnice 0x0007 0x002C 0x0039 61
Klávesnice/klávesnice numerická Klávesnice - pomlčka a podtržítko 0x0007 0x002D 0x000C 12
Klávesnice/klávesnice numerická Klávesa Rovná se a Plus 0x0007 0x002E 0x000D 13
Klávesnice/klávesnice numerická Levá složená závorka klávesnice 0x0007 0x002F 0x001A 27
Klávesnice/klávesnice numerická Pravá složená závorka klávesnice 0x0007 0x0030 0x001B 28
Klávesnice/klávesnice numerická Zpětné lomítko a svislé roury klávesnice 0x0007 0x0031 0x002B 29
Klávesnice/klávesnice numerická Klávesnice pro neamerické prostředí – křížek a vlnovka 0x0007 0x0032 0x002B 42
Klávesnice/klávesnice numerická Středník klávesnice a dvojtečka 0x0007 0x0033 0x0027 40
Klávesnice/klávesnice numerická Znak apostrofu a dvojité uvozovky na klávesnici 0x0007 0x0034 0x0028 41
Klávesnice/klávesnice numerická Ostrý přízvuk a vlnovka na klávesnici 0x0007 0x0035 0x0029 1
Klávesnice/klávesnice numerická Čárka klávesnice a LessThan 0x0007 0x0036 0x0033 53
Klávesnice/klávesnice numerická Období klávesnice a GreaterThan 0x0007 0x0037 0x0034 54
Klávesnice/klávesnice numerická Lomítko a otazník klávesnice 0x0007 0x0038 0x0035 55
Klávesnice/klávesnice numerická Caps Lock klávesnice 0x0007 0x0039 0x003A 30
Klávesnice/klávesnice numerická Klávesnice F1 0x0007 0x003A 0x003B 112
Klávesnice/klávesnice numerická Klávesnice F2 0x0007 0x003B 0x003C 113
Klávesnice/klávesnice numerická Klávesnice F3 0x0007 0x003C 0x003D 114
Klávesnice/klávesnice numerická Klávesnice F4 0x0007 0x003D 0x003E 115
Klávesnice/klávesnice numerická Klávesnice F5 0x0007 0x003E 0x003F 116
Klávesnice/klávesnice numerická Klávesnice F6 0x0007 0x003F 0x0040 117
Klávesnice/klávesnice numerická Klávesnice F7 0x0007 0x0040 0x0041 118
Klávesnice/klávesnice numerická Klávesnice F8 0x0007 0x0041 0x0042 119
Klávesnice/klávesnice numerická Klávesnice F9 0x0007 0x0042 0x0043 120
Klávesnice/klávesnice numerická Klávesnice F10 0x0007 0x0043 0x0044 121
Klávesnice/klávesnice numerická Klávesnice F11 0x0007 0x0044 0x0057 122
Klávesnice/klávesnice numerická Klávesnice F12 0x0007 0x0045 0x0058 123
Klávesnice/klávesnice numerická Klávesa PrintScreen 0x0007 0x0046 0xE037
0x0054 *Poznámka 1
124
Klávesnice/klávesnice numerická Zámek posouvání pomocí klávesnice 0x0007 0x0047 0x0046 125
Klávesnice/klávesnice numerická Klávesová pauza 0x0007 0x0048 0xE11D45
0xE046 *Poznámka 2
0x0045 *Poznámka 3
126
Klávesnice/klávesnice numerická Vložení klávesnice 0x0007 0x0049 0xE052 75
Klávesnice/klávesnice numerická Domovská stránka klávesnice 0x0007 0x004A 0xE047 80
Klávesnice/klávesnice numerická klávesa PageUp na klávesnici 0x0007 0x004B 0xE049 85
Klávesnice/klávesnice numerická Klávesová zkratka Odstranit vpřed 0x0007 0x004C 0xE053 76
Klávesnice/klávesnice numerická Konec klávesnice 0x0007 0x004D 0xE04F 81
Klávesnice/klávesnice numerická klávesa PageDown 0x0007 0x004E 0xE051 86
Klávesnice/klávesnice numerická Klávesa Šipka vpravo 0x0007 0x004F 0xE04D 89
Klávesnice/klávesnice numerická Klávesa Šipka vlevo 0x0007 0x0050 0xE04B 79
Klávesnice/klávesnice numerická Klávesa šipka dolů 0x0007 0x0051 0xE050 84
Klávesnice/klávesnice numerická klávesa Šipka nahoru 0x0007 0x0052 0xE048 83
Klávesnice/klávesnice numerická Klávesa Num Lock a Clear 0x0007 0x0053 0x0045
0xE045 *Poznámka 3
90
Klávesnice/klávesnice numerická Lomítko klávesnice 0x0007 0x0054 0xE035 95
Klávesnice/klávesnice numerická Hvězdička na klávesnici 0x0007 0x0055 0x0037 100
Klávesnice/klávesnice numerická Numerická klávesnice pomlčka 0x0007 0x0056 0x004A 105
Klávesnice/klávesnice numerická Klávesnice Plus 0x0007 0x0057 0x004E 106
Klávesnice/klávesnice numerická Klávesnice ENTER 0x0007 0x0058 0xE01C 108
Klávesnice/klávesnice numerická Klávesnice 1 a konec 0x0007 0x0059 0x004F 93
Klávesnice/klávesnice numerická Klávesnice 2 a šipka dolů 0x0007 0x005A 0x0050 98
Klávesnice/klávesnice numerická Klávesnice 3 a PageDn 0x0007 0x005B 0x0051 103
Klávesnice/klávesnice numerická Klávesa 4 a šipka vlevo 0x0007 0x005C 0x004B 92
Klávesnice/klávesnice numerická Klávesnice 5 0x0007 0x005D 0x004C 97
Klávesnice/klávesnice numerická Klávesnice 6 a šipka vpravo 0x0007 0x005E 0x004D 102
Klávesnice/klávesnice numerická Klávesa 7 a klávesa Home 0x0007 0x005F 0x0047 91
Klávesnice/klávesnice numerická Klávesnice 8 a šipka nahoru 0x0007 0x0060 0x0048 96
Klávesnice/klávesnice numerická Klávesnice 9 a PageUp 0x0007 0x0061 0x0049 101
Klávesnice/klávesnice numerická Klávesnice 0 a vložení 0x0007 0x0062 0x0052 99
Klávesnice/klávesnice numerická Období klávesnice a odstranění 0x0007 0x0063 0x0053 104
Klávesnice/klávesnice numerická Klávesnice mimo USA – zpětné lomítko a svislítko 0x0007 0x0064 0x0056 45
Klávesnice/klávesnice numerická Klávesová aplikace 0x0007 0x0065 0xE05D 129
Klávesnice/klávesnice numerická Napájení klávesnice 0x0007 0x0066 0xE05E
Klávesnice/klávesnice numerická Klávesnice se rovná 0x0007 0x0067 0x0059
Klávesnice/klávesnice numerická Klávesnice F13 0x0007 0x0068 0x0064
Klávesnice/klávesnice numerická Klávesnice F14 0x0007 0x0069 0x0065
Klávesnice/klávesnice numerická Klávesnice F15 0x0007 0x006A 0x0066
Klávesnice/klávesnice numerická Klávesnice F16 0x0007 0x006B 0x0067
Klávesnice/klávesnice numerická Klávesnice F17 0x0007 0x006C 0x0068
Klávesnice/klávesnice numerická Klávesnice F18 0x0007 0x006D 0x0069
Klávesnice/klávesnice numerická Klávesnice F19 0x0007 0x006E 0x006A
Klávesnice/klávesnice numerická Klávesnice F20 0x0007 0x006F 0x006B
Klávesnice/klávesnice numerická Klávesnice F21 0x0007 0x0070 0x006C
Klávesnice/klávesnice numerická Klávesnice F22 0x0007 0x0071 0x006D
Klávesnice/klávesnice numerická Klávesnice F23 0x0007 0x0072 0x006E
Klávesnice/klávesnice numerická Klávesnice F24 0x0007 0x0073 0x0076
Klávesnice/klávesnice numerická Numerická klávesnice čárka 0x0007 0x0085 0x007E 107 *Poznámka 4
Klávesnice/klávesnice numerická Klávesnice International1 0x0007 0x0087 0x0073 56 *Poznámka 4, 5
Klávesnice/klávesnice numerická Klávesnice International2 0x0007 0x0088 0x0070 133 *Poznámka 5
Klávesnice/klávesnice numerická Klávesnice International3 0x0007 0x0089 0x007D 14 *Poznámka 5
Klávesnice/klávesnice numerická Klávesnice International4 0x0007 0x008A 0x0079 132 *Poznámka 5
Klávesnice/klávesnice numerická Klávesnice International5 0x0007 0x008B 0x007B 131 *Poznámka 5
Klávesnice/klávesnice numerická Klávesnice International6 0x0007 0x008C 0x005C
Klávesnice/klávesnice numerická Klávesnice LANG1 0x0007 0x0090 0x0072 *Poznámka 6
0x00F2 *Poznámka 3, 6
Klávesnice/klávesnice numerická Klávesnice LANG2 0x0007 0x0091 0x0071 *Poznámka 6
0x00F1 *Poznámka 3, 6
Klávesnice/klávesnice numerická Klávesnice LANG3 0x0007 0x0092 0x0078
Klávesnice/klávesnice numerická Klávesnice LANG4 0x0007 0x0093 0x0077
Klávesnice/klávesnice numerická Klávesnice LANG5 0x0007 0x0094 0x0076
Klávesnice/klávesnice numerická Klávesnice Levý Control 0x0007 0x00E0 0x001D 58
Klávesnice/klávesnice numerická Klávesnice LeftShift 0x0007 0x00E1 0x002A 44
Klávesnice/klávesnice numerická Klávesa LeftAlt 0x0007 0x00E2 0x0038 60
Klávesnice/klávesnice numerická Grafické uživatelské rozhraní levého uživatelského rozhraní klávesnice 0x0007 0x00E3 0xE05B 127
Klávesnice/klávesnice numerická Klávesnice PravýControl 0x0007 0x00E4 0xE01D 64
Klávesnice/klávesnice numerická Klávesnice RightShift 0x0007 0x00E5 0x0036 57
Klávesnice/klávesnice numerická Klávesa RightAlt 0x0007 0x00E6 0xE038 62
Klávesnice/klávesnice numerická Pravé grafické uživatelské rozhraní klávesnice 0x0007 0x00E7 0xE05C 128
Spotřebitel Skenovat další skladbu 0x000C 0x00B5 0xE019
Spotřebitel Skenovat předchozí skladbu 0x000C 0x00B6 0xE010
Spotřebitel Zastavte 0x000C 0x00B7 0xE024
Spotřebitel Přehrát/pozastavit 0x000C 0x00CD 0xE022
Spotřebitel Ztlumit 0x000C 0x00E2 0xE020
Spotřebitel Zvýšení objemu 0x000C 0x00E9 0xE030
Spotřebitel Snížení hlasitosti 0x000C 0x00EA 0xE02E
Spotřebitel Konfigurace zákaznického řízení AL 0x000C 0x0183 0xE06D
Spotřebitel E-mailová čtečka AL 0x000C 0x018A 0xE06C
Spotřebitel Kalkulačka AL 0x000C 0x0192 0xE021
Spotřebitel Prohlížeč místního počítače AL 0x000C 0x0194 0xE06B
Spotřebitel AC Vyhledávání 0x000C 0x0221 0xE065
Spotřebitel Domovská stránka AC 0x000C 0x0223 0xE032
Spotřebitel Zadní část AC 0x000C 0x0224 0xE06A
Spotřebitel AC Forward 0x000C 0x0225 0xE069
Spotřebitel Zarážka AC 0x000C 0x0226 0xE068
Spotřebitel Obnovení AC 0x000C 0x0227 0xE067
Spotřebitel Záložky AC 0x000C 0x022A 0xE066

Poznámky:

  1. Kód skenování kláves SysRq se vysílá při stisknutí Alt+Print.
  2. Break skanovací kód je vygenerován při stisknutí kláves Ctrl+Pause
  3. Jak je vidět ve starších klávesových zprávách
  4. Klávesa je k dispozici na brazilských klávesnicích.
  5. Klávesa je k dispozici na japonských klávesnicích.
  6. Skenerový kód se vygeneruje pouze v události uvolnění klávesy.

Příznak Extended-Key

Příznak rozšířeného klíče označuje, jestli zpráva stisknutí kláves pochází z jedné z dalších kláves na klávesnici s rozšířenými klávesami 101/102. Rozšířené klávesy se skládají z Alt a kláves Ctrl na pravé straně klávesnice; Vložit*, Odstranit*, Domů, Konec, Page Up, Page Downa Šipka ve skupinách vlevo od numerické klávesnice; klávesy Num Lock; klávesy Break (Ctrl+Pause); klávesy Print screen; a klávesy Divide (/) a Enter na numerické klávesnici. Pravá klávesa Shift není považována za rozšířenou klávesu, ale má vlastní kód skenování.

Pokud je zadáno, kód kontroly se skládá ze sekvence dvou bajtů, kde první bajt má hodnotu 0xE0.

Kontextový kód

Kontextový kód označuje, jestli Klávesa Alt byla po vygenerování zprávy o stisknutí klávesy dolů. Kód je 1, pokud Klávesa Alt byla dolů a 0, pokud byla nahoru.

Příznak předchozího stavu klávesy

Příznak předchozího stavu klíče označuje, jestli byl klíč, který vygeneroval zprávu o stisknutí klávesy, dříve nahoru nebo dolů. Jedná se o 1, pokud byl klíč dříve nižší a 0, pokud byl klíč dříve nahoru. Tento příznak můžete použít k identifikaci zpráv o stisknutí kláves vygenerovaných funkcí automatického opakování klávesnice. Tento příznak je nastaven na hodnotu 1 pro WM_KEYDOWN a WM_SYSKEYDOWN zprávy stisknutí kláves vygenerované funkcí automatického opakování. Pro WM_KEYUP a WM_SYSKEYUP zprávy je vždy hodnota nastavena na 1.

Vlajka stavu přechodu

Příznak přechodu-stav označuje, zda stisknutí klávesy nebo uvolnění klávesy vygenerovalo zprávu stisknutí klávesy. Tento příznak je vždy nastaven na 0 pro WM_KEYDOWN a WM_SYSKEYDOWN zprávy. Pro WM_KEYUP a WM_SYSKEYUP zprávy je vždy nastaven na 1.

Zprávy postav

Zprávy o stisknutí kláves poskytují mnoho informací o stisknutích kláves, ale neposkytují znakové kódy pro stisknutí znakových kláves. Aby bylo možné načíst kódy znaků, musí aplikace do smyčky zpráv vlákna zahrnout funkci TranslateMessage. TranslateMessage předává WM_KEYDOWN nebo WM_SYSKEYDOWN zprávu do rozložení klávesnice. Rozložení prozkoumá kód virtuálního klíče zprávy a pokud odpovídá klíči znaku, poskytne odpovídající kód znaku (s ohledem na stav kláves Shift a Caps Lock). Potom vygeneruje znakovou zprávu, která obsahuje kód znaku a umístí zprávu do horní části fronty zpráv. Další iterace smyčky zpráv odebere znakovou zprávu z fronty a předá zprávu příslušné proceduře okna.

Tato část se zabývá následujícími tématy:

Zprávy o nesystémových znacích

Procedura okna může přijímat následující zprávy znaků: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARa WM_UNICHAR. Funkce TranslateMessage při zpracování zprávy WM_KEYDOWN vygeneruje WM_CHAR nebo WM_DEADCHAR zprávu. Podobně generuje WM_SYSCHAR nebo WM_SYSDEADCHAR zprávu, když zpracovává WM_SYSKEYDOWN zprávu.

Aplikace, která zpracovává vstup klávesnice, obvykle ignoruje všechny zprávy kromě WM_CHAR a WM_UNICHAR zpráv a předává všechny ostatní zprávyfunkciDefWindowProc. Všimněte si, že WM_CHAR používá UTF-16 (16bitový formát transformace Unicode) nebo znakovou sadu ANSI, zatímco WM_UNICHAR vždy používá UTF-32 (32bitový formát transformace Unicode). Systém používá zprávy WM_SYSCHAR a WM_SYSDEADCHAR k implementaci menu mnemotechnik.

Parametr wParam všech zpráv obsahujících znaky obsahuje kód znaku klávesy, která byla stisknuta. Hodnota kódu znaku závisí na třídě okna, které přijímá zprávu. Pokud byla k registraci třídy okna použita verze Unicode RegisterClass funkce, systém poskytuje znaky Unicode pro všechna okna této třídy. V opačném případě systém poskytuje kódy znaků ANSI. Další informace najdete v tématu Registrace tříd oken a Používání znakových stránek UTF-8 v aplikacích pro Windows.

Obsah parametru lParam znakové zprávy je identický s obsahem parametru lParam zprávy stisknutí klávesy, která byla přeložena pro vytvoření znakové zprávy. Pro informace viz Příznaky zprávy o stisku kláves.

Dead-Character Zprávy

Některé neanglické klávesnice obsahují znakové klávesy, které by samy neměly vytvářet znaky. Místo toho se používají k přidání diakritiky k znaku vytvořenému následným stisknutí klávesy. Tyto klávesy se nazývají mrtvé klávesy. Circumflexní klávesa na německé klávesnici je příkladem mrtvé klávesy. Pokud chce uživatel zadat znak, který se skládá z "o" se stříškou, německý uživatel napíše nejprve klávesu pro stříšku a poté klávesu "o". V okně s fokusem klávesnice by se zobrazila následující posloupnost zpráv:

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

TranslateMessage generuje zprávu WM_DEADCHAR, když zpracovává zprávu WM_KEYDOWN ze zastavené klávesy. Přestože wParam parametr zprávy WM_DEADCHAR obsahuje kód znaku diakritických znamének pro mrtvý klíč, aplikace obvykle zprávu ignoruje. Místo toho zpracuje WM_CHAR zprávu vygenerovanou následným stisknutí klávesy. Parametr wParam zprávy WM_CHAR obsahuje kód znaku pro písmeno s diakritikou. Pokud následující stisknutí klávesy vygeneruje znak, který nelze kombinovat s diakritikou, systém vygeneruje dvě WM_CHAR zprávy. Parametr wParam prvního parametru obsahuje kód znaku diakritického znaménka; parametr wParam druhého parametru obsahuje kód znaku následujícího znakového klíče.

Funkce TranslateMessage vygeneruje WM_SYSDEADCHAR zprávu při zpracování WM_SYSKEYDOWN zprávy ze systémového mrtvého klíče (neaktivní klávesa, která se stiskne v kombinaci s klávesou Alt). Aplikace obvykle ignoruje WM_SYSDEADCHAR zprávu.

Stav klíče

Při zpracování zprávy klávesnice může aplikace potřebovat určit stav jiné klávesy kromě té, která vygenerovala aktuální zprávu. Například aplikace pro zpracování textu, která uživateli umožňuje stisknout Shift+End vybrat blok textu, musí zkontrolovat stav klávesy Shift, kdykoli obdrží zprávu o stisknutí klávesy z klávesy End. Aplikace může použít funkci GetKeyState k určení stavu virtuálního klíče v době vygenerování aktuální zprávy; může použít funkci GetAsyncKeyState k načtení aktuálního stavu virtuálního klíče.

Některé klávesy se považují za přepínače, které mění stav rozložení klávesnice. Mezi přepínací klávesy obvykle patří klávesa Caps Lock (VK_CAPITAL), klávesa Num Lock (VK_NUMLOCK), a klávesa Scroll Lock (VK_SCROLL). Většina klávesnic má pro tyto klávesy odpovídající indikátory LED.

Rozložení klávesnice udržuje seznam názvů. Název klíče, který vytvoří jeden znak, je stejný jako znak vytvořený klíčem. Název neznakového klíče, jako například Tab a Enter, je uložen jako řetězec znaků. Aplikace může načíst název libovolné klávesy z rozložení klávesnice zavoláním funkce GetKeyNameText.

Překlady stisků kláves a znaků

Systém obsahuje několik speciálních funkcí, které překládají kódy skenování, kódy znaků a kódy virtuálních klíčů poskytované různými zprávami o stisknutí kláves. Mezi tyto funkce patří MapVirtualKey, ToAscii, ToUnicodea VkKeyScan.

Kromě toho Microsoft Rich Edit 3.0 podporuje HexToUnicode IME, který umožňuje uživateli převádět mezi šestnáctkovými a Unicode znaky pomocí klávesových zkratek. To znamená, že když je Microsoft Rich Edit 3.0 začleněn do aplikace, aplikace dědí funkce hexToUnicode IME.

podpora klávesových zkratek

klávesová zkratka je kombinace kláves, která vygeneruje WM_HOTKEY zprávu, kterou systém umístí na začátek fronty zpráv vlákna, čímž obejde všechny existující zprávy ve frontě. Aplikace používají klávesové zkratky k získání zadání z klávesnice s vysokou prioritou od uživatele. Například definováním klávesové zkratky složené z Ctrl+C stisknutí kláves může aplikace uživateli povolit zrušení zdlouhavé operace.

K definování klávesové zkratky aplikace volá funkci RegisterHotKey, která určuje kombinaci kláves, která generuje WM_HOTKEY zprávu, popisovač okna pro příjem zprávy a identifikátor klávesové zkratky. Když uživatel stiskne klávesovou zkratku, umístí se zpráva WM_HOTKEY do fronty zpráv vlákna, které okno vytvořilo. Parametr wParam zprávy obsahuje identifikátor klávesové zkratky. Aplikace může definovat více klávesových zkratek pro vlákno, ale každá klávesa ve vlákně musí mít jedinečný identifikátor. Před ukončením aplikace by měla použít funkci UnregisterHotKey ke zničení klávesové zkratky.

Aplikace mohou používat ovládací prvek s klávesovou zkratkou, aby uživatel mohl klávesovou zkratku jednoduše zvolit. Ovládací prvky horkých kláves se obvykle používají k definování klávesové zkratky, která aktivuje okno; nepoužívají funkce RegisterHotKey a UnregisterHotKey. Místo toho aplikace, která používá ovládací prvek klávesové zkratky, obvykle odešle zprávu WM_SETHOTKEY k nastavení klávesové zkratky. Pokaždé, když uživatel stiskne klávesovou zkratku, systém odešle WM_SYSCOMMAND zprávu určující SC_HOTKEY. Další informace o ovládacích prvcích klávesových zkratek naleznete v tématu "Použití ovládacích prvků klávesových zkratek" v Hot Key Controls.

Klávesové zkratky pro procházení a další funkce

Systém Windows podporuje klávesnice se speciálními klávesami pro funkce prohlížeče, funkce médií, spouštění aplikací a řízení spotřeby. WM_APPCOMMAND podporuje další klávesové zkratky. Kromě toho je funkce ShellProc upravena tak, aby podporovala další klávesové zkratky.

Je nepravděpodobné, že podřízené okno v aplikaci komponenty bude moct přímo implementovat příkazy pro tyto nadbytečné klávesové zkratky. Když je tedy stisknuta jedna z těchto kláves, DefWindowProc odešle WM_APPCOMMAND zprávu do okna. DefWindowProc také propaguje zprávu WM_APPCOMMAND k nadřazenému oknu. To se podobá způsobu, jakým jsou místní nabídky vyvolány pravým tlačítkem myši, což znamená, že DefWindowProc na kliknutí pravým tlačítkem odešle zprávu WM_CONTEXTMENU a předá ji svému nadřazenému prvku. Kromě toho, pokud DefWindowProc obdrží WM_APPCOMMAND zprávu pro okno nejvyšší úrovně, zavolá systémový hák s kódem HSHELL_APPCOMMAND.

Systém Windows podporuje také Microsoft IntelliMouse Explorer, což je myš s pěti tlačítky. Dvě další tlačítka podporují navigaci v prohlížeči dopředu a dozadu. Další informace naleznete na XBUTTONs.

Simulace vstupu

K simulaci nepřerušované řady událostí uživatelského vstupu použijte funkci SendInput. Funkce přijímá tři parametry. První parametr, cInputs, označuje počet vstupních událostí, které budou simulovány. Druhý parametr, rgInputs, je pole INPUT struktur, přičemž každá z nich popisuje typ vstupní události a další informace o této události. Poslední parametr, cbSize, přijímá velikost INPUT struktury v bajtech.

Funkce SendInput funguje vložením řady simulovaných vstupních událostí do vstupního datového proudu zařízení. Účinek se podobá opakovanému volání keybd_event nebo mouse_event funkce s tím rozdílem, že systém zajistí, že žádné další vstupní události nezasahují do simulovaných událostí. Po dokončení volání vrátí vrácená hodnota počet vstupních událostí, které se úspěšně přehrály. Pokud je tato hodnota nula, vstup se zablokoval.

Funkce SendInput neobnovuje aktuální stav klávesnice. Pokud tedy uživatel při volání této funkce stiskne nějaké klávesy, může narušovat události, které tato funkce vygeneruje. Pokud máte obavy o možnou interferenci, zkontrolujte stav klávesnice pomocí funkce GetAsyncKeyState a podle potřeby opravte.

Jazyky, národní prostředí a rozložení klávesnice

jazyk je přirozený jazyk, jako je angličtina, francouzština a japonština. sublanguage je varianta přirozeného jazyka, který se mluví v konkrétní geografické oblasti, jako jsou anglické podjazyky mluvené ve Spojeném království a Spojených státech. Aplikace používají hodnoty, označované jako identifikátory jazyka , k jedinečné identifikaci jazyků a podlanguage.

Aplikace obvykle používají národní prostředí k nastavení jazyka, ve kterém se zpracovává vstup a výstup. Nastavení národního prostředí klávesnice má například vliv na hodnoty znaků vygenerované klávesnicí. Nastavení národního prostředí pro displej nebo tiskárnu má vliv na zobrazené nebo vytištěné glyfy. Aplikace nastavují národní prostředí klávesnice načtením a použitím rozložení klávesnice. Národní prostředí pro zobrazení nebo tiskárnu nastaví výběrem písma, které podporuje zadané národní prostředí.

Rozložení klávesnice určuje nejen fyzickou pozici kláves na klávesnici, ale také určuje hodnoty znaků vygenerované stisknutím těchto kláves. Každé rozložení identifikuje aktuální jazyk zadávání a určuje, které hodnoty znaků se generují pomocí kláves a kombinací kláves.

Každé rozložení klávesnice má odpovídající identifikátor, který identifikuje rozložení a jazyk. Nízké slovo popisovače je identifikátor jazyka. Horní slovo je úchyt zařízení, které určuje fyzické rozložení; nebo je nula, což označuje výchozí fyzické rozložení. Uživatel může přidružit libovolný jazyk zadávání k fyzickému rozložení. Například anglicky mluvící uživatel, který velmi příležitostně pracuje ve francouzštině, může nastavit jazyk zadávání klávesnice na francouzštinu beze změny fyzického rozložení klávesnice. To znamená, že uživatel může zadat text ve francouzštině pomocí známého anglického rozložení.

Aplikace se obecně neočekávají, že budou pracovat s vstupními jazyky přímo. Místo toho uživatel nastaví kombinace jazyka a rozložení a pak mezi nimi přepne. Když uživatel klikne na text označený jiným jazykem, aplikace zavolá funkci ActivateKeyboardLayout k aktivaci výchozího rozložení uživatele pro daný jazyk. Pokud uživatel upravuje text v jazyce, který není v aktivním seznamu, může aplikace volat LoadKeyboardLayout funkci s jazykem, aby získala rozložení podle daného jazyka.

Funkce ActivateKeyboardLayout nastaví jazyk zadávání pro aktuální úlohu. Parametr hkl může být buď popisovač rozložení klávesnice, nebo nulově rozšířený identifikátor jazyka. Popisovače rozložení klávesnice lze získat pomocí funkcí LoadKeyboardLayout nebo GetKeyboardLayoutList. Hodnoty HKL_NEXT a HKL_PREV lze také použít k výběru další nebo předchozí klávesnice.

Funkce GetKeyboardLayoutName načte název aktivního rozložení klávesnice pro volající vlákno. Pokud aplikace vytvoří aktivní rozložení pomocí funkce LoadKeyboardLayout, GetKeyboardLayoutName načte stejný řetězec použitý k vytvoření rozložení. V opačném případě je řetězec identifikátor primárního jazyka odpovídající národnímu prostředí aktivního rozložení. To znamená, že funkce nemusí nutně rozlišovat mezi různými rozloženími se stejným primárním jazykem, takže nelze vrátit konkrétní informace o jazyku zadávání. Funkci GetKeyboardLayout lze použít k určení jazyka zadávání.

Funkce LoadKeyboardLayout načte rozložení klávesnice a zpřístupní rozložení uživateli. Aplikace můžou rozložení okamžitě aktivovat pro aktuální vlákno pomocí hodnoty KLF_ACTIVATE. Aplikace může pomocí KLF_REORDER hodnoty změnit pořadí rozložení, aniž by také zadala hodnotu KLF_ACTIVATE. Aplikace by při načítání rozložení klávesnice měly vždy používat KLF_SUBSTITUTE_OK hodnotu, aby byla vybrána předvolba uživatele( pokud existuje).

Pro podporu více jazyků poskytuje funkce LoadKeyboardLayout příznaky KLF_REPLACELANG a KLF_NOTELLSHELL. Příznak KLF_REPLACELANG nasměruje funkci tak, aby nahradila stávající rozložení klávesnice beze změny jazyka. Pokus o nahrazení existujícího rozložení pomocí stejného identifikátoru jazyka, ale bez zadání KLF_REPLACELANG je chyba. Příznak KLF_NOTELLSHELL zabrání funkci v tom, aby informovala shell při přidání nebo nahrazení rozložení klávesnice. To je užitečné pro aplikace, které přidávají více rozložení do po sobě jdoucí řady volání. Tento příznak by se měl používat ve všech voláních kromě posledního volání.

Funkce UnloadKeyboardLayout je omezená v tom, že nemůže uvolnit výchozí jazyk zadávání systému. Tím se zajistí, že uživatel bude mít vždy k dispozici jedno rozložení pro zadání textu pomocí stejné znakové sady, jakou používá prostředí a systém souborů.