Udostępnij za pośrednictwem


Omówienie wprowadzania klawiatury

Aplikacje powinny akceptować dane wejściowe użytkownika z klawiatury, a także myszy. Aplikacja odbiera dane wejściowe klawiatury w postaci komunikatów publikowanych w oknach.

Model wprowadzania klawiatury

System zapewnia niezależną od urządzenia obsługę klawiatury dla aplikacji, instalując sterownik urządzenia klawiaturowego odpowiedni dla bieżącej klawiatury. System zapewnia obsługę klawiatury niezależnej od języka przy użyciu układu klawiatury specyficznego dla języka aktualnie wybranego przez użytkownika lub aplikację. Sterownik urządzenia klawiaturowego odbiera kody skanowania z klawiatury, które są wysyłane do układu klawiatury, w którym są one tłumaczone na komunikaty i publikowane w odpowiednich oknach w aplikacji.

Każdemu klawiszowi na klawiaturze przypisana jest unikatowa wartość o nazwie kod skanowania, która jest identyfikatorem zależnym od urządzenia dla klawisza na klawiaturze. Klawiatura generuje dwa kody skanów, gdy użytkownik naciśnie klawisz – jeden, gdy naciska, i drugi, gdy puszcza klawisz.

Sterownik urządzenia klawiaturowego interpretuje kod skanowania i tłumaczy go (mapuje) na kod klucza wirtualnego, niezależną od urządzenia wartość zdefiniowaną przez system identyfikujący cel klucza. Po przetłumaczeniu kodu skanowania układ klawiatury tworzy komunikat zawierający kod skanowania, kod klucza wirtualnego i inne informacje o naciśnięciu, a następnie umieszcza komunikat w kolejce komunikatów systemowych. System usuwa komunikat z kolejki komunikatów systemowych i publikuje go w kolejce komunikatów odpowiedniego wątku. W końcu pętla wątku komunikatów usuwa komunikat i przekazuje go odpowiedniej procedurze okna w celu przetworzenia. Na poniższej ilustracji przedstawiono model wprowadzania klawiatury.

modelu przetwarzania danych wejściowych klawiatury

Fokus klawiatury i aktywacja

System publikuje komunikaty klawiaturowe w kolejce komunikatów wątku na pierwszym planie, który stworzył okno z aktywną klawiaturą. Fokus klawiatury jest tymczasową właściwością okna. System udostępnia klawiaturę wśród wszystkich okien na wyświetlaczu, przesuwając fokus klawiatury, w kierunku użytkownika, z jednego okna do drugiego. Okno z fokusem klawiatury odbiera (z kolejki komunikatów wątku, który go utworzył) wszystkie komunikaty klawiatury, dopóki fokus nie zmieni się na inne okno.

Wątek może wywołać funkcję GetFocus, aby określić, które z okien (jeśli istnieją) aktualnie ma fokus klawiatury. Wątek może nadać fokus klawiatury jednemu ze swoich okien, wywołując funkcję SetFocus. Gdy fokus klawiatury zmieni się z jednego okna na inny, system wysyła WM_KILLFOCUS komunikat do okna, który stracił fokus, a następnie wysyła komunikat WM_SETFOCUS do okna, które zyskał fokus.

Koncepcja fokusu klawiatury jest związana z pojęciem aktywnego okna. Aktywne okno to okno najwyższego poziomu, z którymi aktualnie pracuje użytkownik. Okno z fokusem klawiatury to aktywne okno lub okno podrzędne aktywnego okna. Aby ułatwić użytkownikowi zidentyfikowanie aktywnego okna, system umieszcza je w górnej części kolejności Z i podświetla pasek tytułu (jeśli taki istnieje) oraz obramowanie.

Użytkownik może aktywować okno najwyższego poziomu, klikając go, wybierając go przy użyciu kombinacji ALT+TAB lub ALT+ESC lub wybierając je z listy zadań. Wątek może aktywować okno najwyższego poziomu przy użyciu funkcji SetActiveWindow. Może określić, czy utworzone przez niego okno najwyższego poziomu jest aktywne przy użyciu funkcji GetActiveWindow.

Po dezaktywowaniu jednego okna i aktywowaniu drugiego system wysyła komunikat WM_ACTIVATE. Słowo o niskiej kolejności parametru wParam jest zerowe, jeśli okno jest dezaktywowane i niezerowe, jeśli jest aktywowane. Gdy domyślna procedura okna odbiera komunikat WM_ACTIVATE, ustawia fokus klawiatury na aktywne okno.

Aby zablokować zdarzenia wejściowe z klawiatury i myszy przed dotarciem do aplikacji, użyj BlockInput. Uwaga: funkcja BlockInput nie zakłóca asynchronicznej tabeli stanu wprowadzania klawiatury. Oznacza to, że wywołanie funkcji SendInput podczas blokowania danych wejściowych spowoduje zmianę asynchronicznej tabeli stanu wprowadzania klawiatury.

Komunikaty naciśnięć klawiszy

Naciśnięcie klawisza powoduje umieszczenie komunikatu WM_KEYDOWN lub WM_SYSKEYDOWN w kolejce komunikatów wątku przypisanej do okna, w którym znajduje się fokus klawiatury. Zwolnienie klucza powoduje umieszczenie komunikatu WM_KEYUP lub WM_SYSKEYUP w kolejce.

Komunikaty klawiszy do góry i na dół zwykle występują parami, ale jeśli użytkownik przytrzyma klawisz wystarczająco długo, aby uruchomić funkcję automatycznego powtarzania klawiatury, system generuje szereg WM_KEYDOWN lub WM_SYSKEYDOWN komunikatów z rzędu. Następnie generuje pojedynczy komunikat WM_KEYUP lub WM_SYSKEYUP, gdy użytkownik zwolni klucz.

W tej sekcji omówiono następujące tematy:

Naciśnięcia klawiszy systemowych i niesystemowych

System rozróżnia naciśnięcia klawiszy systemowych i niesystemowych. Naciśnięcia klawiszy systemowych generują wiadomości naciśnięć klawiszy systemowych, WM_SYSKEYDOWN i WM_SYSKEYUP. Niesystemowe klawisze generują komunikaty klawiszy niesystemowych, WM_KEYDOWN i WM_KEYUP.

Jeśli procedura okna musi przetworzyć komunikat o naciśnięciu klawisza systemowego, upewnij się, że po przetworzeniu komunikatu procedura przekazuje go do funkcji DefWindowProc. W przeciwnym razie wszystkie operacje systemowe z udziałem ALT będą wyłączone za każdym razem, gdy okno ma fokus klawiatury. Oznacza to, że użytkownik nie będzie mógł uzyskać dostępu do menu okna lub menu systemowego albo użyć kombinacji ALT+ESC lub ALT+TAB, aby aktywować inne okno.

Komunikaty dotyczące naciskania klawiszy systemowych są używane głównie przez system, a nie przez aplikację. System używa ich do udostępniania wbudowanego interfejsu klawiaturowego do menu i umożliwienia użytkownikowi kontrolowania, które okno jest aktywne. Komunikaty naciśnięć klawiszy systemowych są generowane, gdy użytkownik naciśnie klawisz w połączeniu z klawiszem ALT, lub gdy użytkownik wpisze i żadne okno nie ma fokusu klawiatury (na przykład gdy aktywna aplikacja jest zminimalizowana). W takim przypadku komunikaty są publikowane w kolejce komunikatów dołączonej do aktywnego okna.

Komunikaty niesystemowego naciśnięcia klawisza są używane przez okna aplikacji; funkcja DefWindowProc nic z nimi nie robi. Procedura okna może odrzucać wszelkie niesystemowe komunikaty naciśnięć klawiszy, których nie potrzebuje.

Virtual-Key Opis kodów

Parametr wParam komunikatu naciśnięcia zawiera kod klucza wirtualnego, który został naciśnięty lub zwolniony. Procedura okna przetwarza lub ignoruje komunikat naciśnięcia w zależności od wartości kodu klucza wirtualnego.

Typowa procedura okna przetwarza tylko niewielki podzestaw komunikatów naciśnięcia, które odbiera i ignoruje resztę. Na przykład procedura okna może przetwarzać tylko WM_KEYDOWN komunikaty klawiszy i tylko te, które zawierają kody klawiszy wirtualnych dla klawiszy sterujących kursorem, klawiszy modyfikujących (nazywane również klawiszami sterującymi) i klawiszy funkcyjnych. Typowa procedura okna nie przetwarza komunikatów naciśnięcia z klawiszy znakowych. Zamiast tego używa funkcji TranslateMessage, aby przekonwertować komunikat na komunikaty znakowe. Aby uzyskać więcej informacji na temat komunikatów TranslateMessage i komunikatów znaków, zobacz Komunikaty znaków.

Flagi wiadomości naciśnięcia klawisza

Parametr lParam wiadomości o naciśnięciu klawisza zawiera dodatkowe informacje dotyczące naciśnięcia klawisza, które wygenerowało wiadomość. Te informacje obejmują liczbę powtórzeń , kod skanowania , flagę klucza rozszerzonego , kod kontekstu , flagę poprzedniego stanu klucza i flagę stanu przejścia . Poniższa ilustracja przedstawia lokalizacje tych flag i wartości w parametrze lParam.

lokalizacje flag i wartości w parametrze lparam komunikatu o naciśnięciu klawisza

Aplikacja może użyć następujących wartości, aby pobrać flagi naciśnięć z wysokiego rzędu słowa lParam.

Wartość Opis
KF_EXTENDED
0x0100
Manipuluje rozszerzoną flagą klucza .
KF_DLGMODE
0x0800
Manipuluje flagą trybu okna dialogowego, która wskazuje, czy okno dialogowe jest aktywne.
KF_MENUMODE
0x1000
Manipuluje flagą trybu menu, która wskazuje, czy menu jest aktywne.
KF_ALTDOWN
0x2000
Manipuluje flagą kodu kontekstu .
KF_REPEAT
0x4000
Manipuluje flagą stanu poprzedniego klawisza .
KF_UP
0x8000
Manipuluje flagą stanu przejścia .

Przykładowy kod:

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;

Liczba powtórzeń

Możesz sprawdzić liczbę powtórzeń, aby określić, czy komunikat naciśnięcia reprezentuje więcej niż jedno naciśnięcie. System zwiększa liczbę, gdy klawiatura generuje WM_KEYDOWN lub WM_SYSKEYDOWN komunikatów szybciej niż aplikacja może je przetworzyć. Dzieje się tak często, gdy użytkownik przytrzymuje klawisz wystarczająco długo, aby uruchomić funkcję automatycznego powtarzania klawiatury. Zamiast wypełniać kolejkę komunikatów systemowych wynikowymi komunikatami naciśnięcia klawisza, system łączy te komunikaty w pojedynczy komunikat naciśnięcia klawisza i zwiększa licznik powtórzeń. Zwolnienie klucza nie może uruchomić funkcji automatycznego powtarzania, więc liczba powtórzeń dla WM_KEYUP i WM_SYSKEYUP komunikatów jest zawsze ustawiona na 1.

Kody skanowania

Diagram klawiatury typu 4 z lokalizacjami klawiszy dla każdego klawisza.

Kod skanowania to wartość wygenerowana przez system, gdy użytkownik naciśnie klawisz. Jest to wartość identyfikująca naciśnięcie klawisza, niezależnie od aktywnego układu klawiatury , w przeciwieństwie do znaku reprezentowanego przez klawisz. Aplikacja zazwyczaj ignoruje kody skanowania. Zamiast tego używa kodów klawiszy wirtualnych dla interpretowania sygnałów klawiszy.

Nowoczesne klawiatury używają specyfikacji Urządzeń Interfejsu Ludzkiego (HID) do komunikowania się z komputerem. sterownik klawiatury konwertuje zgłaszane wartości użycia HID wysyłane z klawiatury na kody skanowania i przekazuje je do aplikacji.

Notatka

Chociaż wirtualne kody klawiszy są zazwyczaj bardziej przydatne w aplikacjach desktopowych, kody skanowania mogą być potrzebne w określonych przypadkach, gdy trzeba wiedzieć, który klawisz jest naciskany, niezależnie od aktualnego układu klawiatury . Na przykład WASD (W jest w górę, A jest w lewo, S jest w dół, a D jest w prawo) powiązania dla gier, które zapewniają spójne tworzenie w USA QWERTY lub francuski AZERTY układy klawiatury.

W poniższej tabeli wymieniono zestaw kodów skanowania, który jest obecnie rozpoznawany przez system Windows. HID Usage Page/HID Usage ID (Identyfikator użycia HID)/Nazwa użycia HID wartości odnoszą się do dokumentu tabel użycia HID. Wartości Położenie klucza odwołują się do poprzedniego obrazu klawiatury.

Kod Scan 1 Make jest dostarczany w komunikatach WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP oraz WM_INPUT.

Nazwa strony użycia HID Nazwa użycia HID Strona użycia HID Identyfikator użycia HID Utwórz skan 1 Lokalizacja klucza
Pulpit ogólny Wyłączenie systemu 0x0001 0x0081 0xE05E
Pulpit ogólny Uśpienie systemu 0x0001 0x0082 0xE05F
Pulpit ogólny Wznawianie systemu 0x0001 0x0083 0xE063
Klawiatura/klawiatura numeryczna BłądRollOver 0x0007 0x0001 0x00FF
Klawiatura/klawiatura numeryczna Klawiatura A 0x0007 0x0004 0x001E 31
Klawiatura/klawiatura Klawiatura B 0x0007 0x0005 0x0030 50
Klawiatura/Klawiatura numeryczna Klawiatura C 0x0007 0x0006 0x002E 48
Klawiatura/klawiatura numeryczna Klawiatura D 0x0007 0x0007 0x0020 33
Klawiatura/klawiszownik Klawiatura E 0x0007 0x0008 0x0012 19
Klawiatura/klawisz Klawiatura F 0x0007 0x0009 0x0021 34
Klawiatura/klawiatura numeryczna Klawiatura G 0x0007 0x000A 0x0022 35
Klawiatura/klawiatura numeryczna Klawiatura H 0x0007 0x000B 0x0023 36
Klawiatura/Klawiatura numeryczna Klawiatura I 0x0007 0x000C 0x0017 24
Klawiatura/klawiatura numeryczna Klawiatura J 0x0007 0x000D 0x0024 37
Klawiatura/Klawisze numeryczne Klawiatura K 0x0007 0x000E 0x0025 38
Klawiatura/klawiatura Klawiatura L 0x0007 0x000F 0x0026 39
Klawiatura/klawiatura numeryczna Klawiatura M 0x0007 0x0010 0x0032 52
Klawiatura/klawiatura numeryczna Klawiatura N 0x0007 0x0011 0x0031 51
Klawiatura/klawiatura numeryczna Klawiatura O 0x0007 0x0012 0x0018 25
Klawiatura/klawiaturka Klawiatura P 0x0007 0x0013 0x0019 26
Klawiatura/klawiatura numeryczna Klawiatura Q 0x0007 0x0014 0x0010 17
Klawiatura/klawiatura numeryczna Klawiatura R 0x0007 0x0015 0x0013 20
Klawiatura/blok numeryczny Klawiatura S 0x0007 0x0016 0x001F 32
Klawiatura/klawiatura numeryczna Klawiatura T 0x0007 0x0017 0x0014 21
Klawiatura / Klawiatura numeryczna Klawiatura U 0x0007 0x0018 0x0016 23
Klawiatura/klawiatura numeryczna Klawiatura V 0x0007 0x0019 0x002F 49
Klawiatura/klawiaturka Klawiatura W 0x0007 0x001A 0x0011 18
Klawiatura/klawiaturka Klawiatura X 0x0007 0x001B 0x002D 47
Klawiatura/klawiatura numeryczna Klawiatura Y 0x0007 0x001C 0x0015 22
Klawiatura/klawiatura numeryczna Klawiatura Z 0x0007 0x001D 0x002C 46
Klawiatura/klawisze numeryczne Klawiatura 1 i Bang 0x0007 0x001E 0x0002 2
Klawiatura/klawiatura numeryczna Klawiatura 2 i at 0x0007 0x001F 0x0003 3
Klawiatura/Klawiatura numeryczna Klawiatura 3 i skrót 0x0007 0x0020 0x0004 4
Klawiatura/klawiatura numeryczna Klawiatura 4 i dolar 0x0007 0x0021 0x0005 5
Klawiatura/blok numeryczny Klawiatura 5 i procent 0x0007 0x0022 0x0006 6
Klawiatura/klawiatura numeryczna Klawiatura 6 i kursor 0x0007 0x0023 0x0007 7
Klawiatura/klawiatura numeryczna Klawiatura 7 i znak ampersand 0x0007 0x0024 0x0008 8
Klawiatura/klawiatura numeryczna Klawiatura 8 i Gwiazda 0x0007 0x0025 0x0009 9
Klawiatura/klawiatura numeryczna Klawisz 9 i lewy nawias kwadratowy 0x0007 0x0026 0x000A 10
Klawiatura/Blok numeryczny Klawisz 0 i prawy nawias kwadratowy 0x0007 0x0027 0x000B 11
Klawiatura/klawiatura numeryczna Klawiatura Return Enter 0x0007 0x0028 0x001C 43
Klawiatura/panel klawiszy Ucieczka klawiatury 0x0007 0x0029 0x0001 110
Klawiatura/klawiatura numeryczna Usuwanie klawiatury 0x0007 0x002A 0x000E 15
Klawiatura/Klawiaturka Karta klawiatury 0x0007 0x002B 0x000F 16
Klawiatura/klawiatura numeryczna Pasek spacji klawiatury 0x0007 0x002C 0x0039 61
Klawiatura/Klawisze numeryczne Kreska klawiaturowa i podkreślenie 0x0007 0x002D 0x000C 12
Klawiatura/klawiatura numeryczna Klawiatura klawisze równości ('=') i plusa ('+') 0x0007 0x002E 0x000D 13
Klawiatura/klawiatura numeryczna Lewy nawias klamrowy klawiatury 0x0007 0x002F 0x001A 27
Klawiatura/Klawiatura numeryczna Prawy nawias klamrowy klawiatury 0x0007 0x0030 0x001B 28
Klawiatura/klawiatura numeryczna Rura klawiaturowa i ukośnik 0x0007 0x0031 0x002B 29
Klawiatura/klawiaturka Klawiatura poza USA 0x0007 0x0032 0x002B 42
Klawiatura/klawiatura numeryczna Klawisze średnika i dwukropka na klawiaturze 0x0007 0x0033 0x0027 40
Klawiatura/Klawiatura numeryczna Apostrof i podwójny cudzysłów na klawiaturze 0x0007 0x0034 0x0028 41
Klawiatura/blok klawiszy Klawisz akcentu grwego i tyldy 0x0007 0x0035 0x0029 1
Klawiatura/klawiatura numeryczna Przecinek klawiatury 0x0007 0x0036 0x0033 53
Klawiatura/klawiatura numeryczna Okres klawiatury 0x0007 0x0037 0x0034 54
Klawiatura/klawiatura numeryczna Klawiaturowy znak zapytania 0x0007 0x0038 0x0035 55
Klawiatura/Klawisznik Blokada klawiatury 0x0007 0x0039 0x003A 30
Klawiatura/klawiatura numeryczna Klawiatura F1 0x0007 0x003A 0x003B 112
Klawiatura/klawiatura numeryczna Klawiatura F2 0x0007 0x003B 0x003C 113
Klawiatura/klawiatura numeryczna Klawiatura F3 0x0007 0x003C 0x003D 114
Klawiatura/blok numeryczny Klawiatura F4 0x0007 0x003D 0x003E 115
Klawiatura/klawiaturka numeryczna Klawiatura F5 0x0007 0x003E 0x003F 116
Klawiatura/Panel numeryczny Klawiatura F6 0x0007 0x003F 0x0040 117
Klawiatura/blok numeryczny Klawiatura F7 0x0007 0x0040 0x0041 118
Klawiatura/Klawisze numeryczne Klawiatura F8 0x0007 0x0041 0x0042 119
Klawiatura/klawiatura numeryczna Klawiatura F9 0x0007 0x0042 0x0043 120
Klawiatura/klawiatura Klawiatura F10 0x0007 0x0043 0x0044 121
Klawiatura/blok numeryczny Klawiatura F11 0x0007 0x0044 0x0057 122
Klawiatura/klawiaturka numeryczna Klawiatura F12 0x0007 0x0045 0x0058 123
Klawiatura/klawiatura numeryczna Klawisz PrintScreen 0x0007 0x0046 0xE037
0x0054 *Uwaga 1
124
Klawiatura/panel numeryczny Blokada przewijania klawiatury 0x0007 0x0047 0x0046 125
Klawiatura/klawiatura numeryczna Wstrzymywanie klawiatury 0x0007 0x0048 0xE11D45
0xE046 *Uwaga 2
0x0045 *Uwaga 3
126
Klawiatura/Klawisznik Wstawianie klawiatury 0x0007 0x0049 0xE052 75
Klawiatura/Klawisznik Klawiatura główna 0x0007 0x004A 0xE047 80
Klawiatura/klawiaturka numeryczna Klawiatura PageUp 0x0007 0x004B 0xE049 85
Klawiatura/blok numeryczny Usuwanie klawiatury do przodu 0x0007 0x004C 0xE053 76
Klawiatura/Klawiaturka Koniec klawiatury 0x0007 0x004D 0xE04F 81
Klawiatura/klawisze numeryczne Klawisz PageDown 0x0007 0x004E 0xE051 86
Klawiatura/klawisz Strzałka w prawo na klawiaturze 0x0007 0x004F 0xE04D 89
Klawiatura/klawiatura numeryczna Lewa krawędz klawiatury 0x0007 0x0050 0xE04B 79
Klawiatura/Klawisze numeryczne Klawisz strzałki w dół 0x0007 0x0051 0xE050 84
Klawiatura/klawiatura numeryczna Strzałka w górę na klawiaturze 0x0007 0x0052 0xE048 83
Klawiatura/klawiatura numeryczna Blokada numerów klawiatury i wyczyść 0x0007 0x0053 0x0045
0xE045 *Uwaga 3
90
Klawiatura/klawiatura numeryczna Ukośnik na klawiaturze numerycznej 0x0007 0x0054 0xE035 95
Klawiatura/Klawiaturka Klawisz gwiazdka 0x0007 0x0055 0x0037 100
Klawiatura/panel dotykowy Klawisz Dash 0x0007 0x0056 0x004A 105
Klawiatura/blok numeryczny Klawiatura Plus 0x0007 0x0057 0x004E 106
Klawiatura/Klawiatura numeryczna Klawisz ENTER na klawiaturze numerycznej 0x0007 0x0058 0xE01C 108
Klawiatura/klawiatura numeryczna Klawiatura 1 i koniec 0x0007 0x0059 0x004F 93
Klawiatura/klawiatura numeryczna Klawiatura 2 i strzałka w dół 0x0007 0x005A 0x0050 98
Klawiatura/klawiaturka Klawiatura 3 i pageDn 0x0007 0x005B 0x0051 103
Klawiatura/Klawiatura numeryczna Klawiatura 4 i strzałka w lewo 0x0007 0x005C 0x004B 92
Klawiatura/klawiatura numeryczna Klawiatura 5 0x0007 0x005D 0x004C 97
Klawiatura/klawiatura numeryczna Klawiatura 6 i strzałka w prawo 0x0007 0x005E 0x004D 102
Klawiatura/Klawisze Klawiatura 7 i strona główna 0x0007 0x005F 0x0047 91
Klawiatura/klawiatura numeryczna Klawiatura 8 i strzałka w górę 0x0007 0x0060 0x0048 96
Klawiatura/blok numeryczny Klawiatura 9 i PageUp 0x0007 0x0061 0x0049 101
Klawiatura/panel numeryczny Klawiatura 0 i wstawianie 0x0007 0x0062 0x0052 99
Klawiatura/Klawiatura numeryczna Okres klawiatury 0x0007 0x0063 0x0053 104
Klawiatura/Klawisze numeryczne Klawisz ukośnika na klawiaturze nieamerykańskiej 0x0007 0x0064 0x0056 45
Klawiatura/klawiatura numeryczna Aplikacja klawiaturowa 0x0007 0x0065 0xE05D 129
Klawiatura/klawiszowa klawiatura Zasilanie klawiatury 0x0007 0x0066 0xE05E
Klawiatura/klawiatura numeryczna Klawiatura równa się 0x0007 0x0067 0x0059
Klawiatura/Klawiatura numeryczna Klawiatura F13 0x0007 0x0068 0x0064
Klawiatura/klawiszownica Klawiatura F14 0x0007 0x0069 0x0065
Klawiatura/klawiatura numeryczna Klawiatura F15 0x0007 0x006A 0x0066
Klawiatura/klawiatura numeryczna Klawiatura F16 0x0007 0x006B 0x0067
Klawiatura/klawiatura numeryczna Klawiatura F17 0x0007 0x006C 0x0068
Klawiatura/klawiaturka Klawiatura F18 0x0007 0x006D 0x0069
Klawiatura/Klawiatura numeryczna Klawiatura F19 0x0007 0x006E 0x006A
Klawiatura/Klawisz Klawiatura F20 0x0007 0x006F 0x006B
Klawiatura/klawiatura numeryczna Klawiatura F21 0x0007 0x0070 0x006C
Klawiatura/klawiatura numeryczna Klawiatura F22 0x0007 0x0071 0x006D
Klawiatura/klawisze numeryczne Klawiatura F23 0x0007 0x0072 0x006E
Klawiatura/klawiatura numeryczna Klawiatura F24 0x0007 0x0073 0x0076
Klawiatura/klawiatura numeryczna Przecinek klawiatury numerycznej 0x0007 0x0085 0x007E 107 *Uwaga 4
Klawiatura/klawiszowy blok numeryczny Klawiatura International1 0x0007 0x0087 0x0073 56 *Uwaga 4, 5
Klawiatura/panel Klawiatura Międzynarodowa2 0x0007 0x0088 0x0070 133 *Uwaga 5
Klawiatura/blok numeryczny Klawiatura International3 0x0007 0x0089 0x007D 14 *Uwaga 5
Klawiatura/blok numeryczny Klawiatura International4 0x0007 0x008A 0x0079 132 *Uwaga 5
Klawiatura/klawiatura numeryczna Klawiatura Międzynarodowa5 0x0007 0x008B 0x007B 131 *Uwaga 5
Klawiatura/klawiatura numeryczna Klawiatura International6 0x0007 0x008C 0x005C
Klawiatura/klawiatura Klawiatura LANG1 0x0007 0x0090 0x0072 *Uwaga 6
0x00F2 *Uwaga 3, 6
Klawiatura/Klawiatura numeryczna Klawiatura LANG2 0x0007 0x0091 0x0071 *Uwaga 6
0x00F1 *Uwaga 3, 6
Klawiatura/klawiatura Klawiatura LANG3 0x0007 0x0092 0x0078
Klawiatura/klawiatura numeryczna Klawiatura LANG4 0x0007 0x0093 0x0077
Klawiatura/Klawiatura numeryczna Klawiatura LANG5 0x0007 0x0094 0x0076
Klawiatura/Klawiatura numeryczna Lewa kontrola klawiatury 0x0007 0x00E0 0x001D 58
Klawiatura/panel numeryczny LeftShift klawiatury 0x0007 0x00E1 0x002A 44
Klawiatura/Klawisz Klawiatura LeftAlt 0x0007 0x00E2 0x0038 60
Klawiatura/Klawiszarka Lewy graficzny interfejs użytkownika klawiatury 0x0007 0x00E3 0xE05B 127
Klawiatura/klawiaturka Klawiatura RightControl 0x0007 0x00E4 0xE01D 64
Klawiatura/Klawisznik Klawiatura PrawyShift 0x0007 0x00E5 0x0036 57
Klawiatura/klawiatura numeryczna Klawiatura RightAlt 0x0007 0x00E6 0xE038 62
Klawiatura/klawiatura numeryczna Prawy klawisz GUI na klawiaturze 0x0007 0x00E7 0xE05C 128
Konsument Przeskanuj następny utwór 0x000C 0x00B5 0xE019
Konsument Skanuj poprzednią ścieżkę 0x000C 0x00B6 0xE010
Konsument Zatrzymać 0x000C 0x00B7 0xE024
Konsument Odtwarzanie/wstrzymywanie 0x000C 0x00CD 0xE022
Konsument Wycisz 0x000C 0x00E2 0xE020
Konsument Przyrost woluminu 0x000C 0x00E9 0xE030
Konsument Dekrementacja woluminu 0x000C 0x00EA 0xE02E
Konsument Konfiguracja Kontroli Konsumenckiej AL 0x000C 0x0183 0xE06D
Konsument Czytnik wiadomości e-mail AL 0x000C 0x018A 0xE06C
Konsument Kalkulator AL 0x000C 0x0192 0xE021
Konsument Przeglądarka maszyny lokalnej AL 0x000C 0x0194 0xE06B
Konsument AC Search 0x000C 0x0221 0xE065
Konsument Strona główna AC 0x000C 0x0223 0xE032
Konsument Powrót klimatyzacji 0x000C 0x0224 0xE06A
Konsument AC Forward 0x000C 0x0225 0xE069
Konsument Wyłączenie klimatyzacji 0x000C 0x0226 0xE068
Konsument Odświeżanie AC 0x000C 0x0227 0xE067
Konsument Zakładki AC 0x000C 0x022A 0xE066

Notatki:

  1. kod skanowania klawisza SysRq jest emitowany po naciśnięciu kombinacji klawiszy Alt+Print screen
  2. Kod skanowania klawisza break jest emitowany przy naciśnięciu klawiszy Control+Pause
  3. Jak pokazano w starszych wiadomościach klawiaturowych
  4. Klawisz jest obecny na klawiaturach brazylijskich
  5. Klawisz jest obecny na japońskich klawiaturach
  6. Kod skanowania jest emitowany tylko w przypadku zdarzenia wydania klucza

flaga Extended-Key

Flaga rozszerzonego klawisza wskazuje, czy komunikat o naciśnięciu klawisza pochodzi z jednego z dodatkowych klawiszy na klawiaturze rozszerzonej 101/102. Klucze rozszerzone składają się z klawiszy ALT i CTRL po prawej stronie klawiatury; INS, DEL, HOME, END, PAGE UP, PAGE DOWN i strzałki w klastrach po lewej stronie klawiatury numerycznej; klawisz NUM LOCK; PRZERWA (CTRL+PAUSA); PRINT SCREEN; oraz klawisze dzielenia (/) i ENTER w klawiaturze numerycznej. SHIFT po prawej stronie nie jest traktowany jako klucz rozszerzony. Zamiast tego ma on oddzielny kod skanowania.

Jeśli zostanie określony, kod skanowania składa się z sekwencji dwóch bajtów, gdzie pierwszy bajt ma wartość 0xE0.

Kod kontekstu

Kod kontekstu wskazuje, czy klawisz ALT był wciśnięty podczas generowania komunikatu o naciśnięciu klawisza. Kod wynosi 1, jeśli klawisz ALT był wciśnięty, a 0, jeśli był zwolniony.

Poprzednia flaga Key-State

Poprzednia flaga stanu klawisza wskazuje, czy klawisz, który wygenerował komunikat naciśnięcia, był wcześniej naciśnięty czy puszczony. Jest to 1, jeśli klawisz był wcześniej wciśnięty i 0, jeśli klawisz był wcześniej zwolniony. Tej flagi można użyć do identyfikowania komunikatów naciśnięcia generowanych przez funkcję automatycznego powtarzania klawiatury. Ta flaga jest ustawiona na 1 dla WM_KEYDOWN i WM_SYSKEYDOWN komunikatów dotyczących naciśnięcia klawisza generowanych przez funkcję automatycznego powtarzania. Zawsze jest ustawiona wartość 1 dla komunikatów WM_KEYUP i WM_SYSKEYUP.

Flaga Transition-State

Flaga stanu przejściowego wskazuje, czy naciśnięcie lub zwolnienie klawisza wygenerowało komunikat o naciśnięciu klawisza. Ta flaga jest zawsze ustawiona na 0 dla komunikatów WM_KEYDOWN i WM_SYSKEYDOWN; Zawsze jest ustawiona wartość 1 dla komunikatów WM_KEYUP i WM_SYSKEYUP.

Wiadomości postaci

Komunikaty dotyczące naciśnięć klawiszy zawierają wiele informacji na temat naciśnięć, ale nie udostępniają kodów znaków dla naciśnięć znaków. Aby pobrać kody znaków, aplikacja musi zawierać funkcję TranslateMessage w pętli komunikatów wątku. TranslateMessage przekazuje komunikat WM_KEYDOWN lub WM_SYSKEYDOWN do układu klawiatury. Układ analizuje kod wirtualny klawisza komunikatu i, jeśli odpowiada znakowemu klawiszowi, generuje odpowiedni kod znaku (uwzględniając stan klawiszy SHIFT i CAPS LOCK). Następnie generuje komunikat znaku zawierający kod znaku i umieszcza komunikat w górnej części kolejki komunikatów. Następna iteracja pętli komunikatów usuwa wiadomość dotyczącą znaku z kolejki i przekazuje ją do odpowiedniej procedury okna.

W tej sekcji omówiono następujące tematy:

Komunikaty o niesystemowych znakach

Procedura okna może odbierać następujące komunikaty znaków: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR, WM_UNICHAR. Funkcja TranslateMessage generuje komunikat WM_CHAR lub WM_DEADCHAR podczas przetwarzania komunikatu WM_KEYDOWN. Podobnie generuje komunikat WM_SYSCHAR lub WM_SYSDEADCHAR podczas przetwarzania komunikatu WM_SYSKEYDOWN.

Aplikacja przetwarzająca dane wejściowe klawiatury zwykle ignoruje wszystkie komunikaty WM_CHAR i WM_UNICHAR, przekazując wszelkie inne komunikaty do funkcji DefWindowProc. Należy pamiętać, że WM_CHAR używa formatu transformacji Unicode UTF-16 (16-bitowego formatu unicode) lub zestawu znaków ANSI, podczas gdy WM_UNICHAR zawsze używa formatu przekształcenia UTF-32 (32-bitowy format przekształcenia Unicode). System używa komunikatów WM_SYSCHAR i WM_SYSDEADCHAR w celu zaimplementowania mnemonik menu.

Parametr wParam wszystkich komunikatów znakowych zawiera kod znaku odpowiadający naciśniętemu klawiszowi znakowemu. Wartość kodu znaku zależy od klasy okna okna odbierającego komunikat. Jeśli wersja Unicode funkcji RegisterClass została użyta do zarejestrowania klasy okna, system udostępnia znaki Unicode we wszystkich oknach tej klasy. W przeciwnym razie system udostępnia kody znaków ANSI. Aby uzyskać więcej informacji, zobacz Rejestrowanie klas okien i Używanie stron kodu UTF-8 w aplikacjach systemu Windows.

Zawartość parametru lParam komunikatu znakowego jest identyczna z zawartością parametru lParam komunikatu o naciśnięciu klawisza przetłumaczonego w celu wygenerowania komunikatu znakowego. Aby uzyskać informacje, zobacz flagi komunikatów naciśnięć .

Dead-Character Komunikaty

Niektóre klawiatury inne niż angielskie zawierają klawisze, które same nie powinny wytwarzać znaków. Zamiast tego są one używane do dodawania znaku diakrytycznego do znaku wygenerowanego przez kolejne naciśnięcie. Te klawisze są nazywane klawiszami martwymi. Klawisz z daszkiem na niemieckiej klawiaturze jest przykładem martwego klawisza. Aby wprowadzić znak składający się z "o" z circumflex, niemiecki użytkownik wpisze klucz circumflex, a następnie "o". Okno z fokusem klawiatury otrzyma następującą sekwencję komunikatów:

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

TranslateMessage generuje komunikat WM_DEADCHAR podczas przetwarzania komunikatu WM_KEYDOWN z klucza martwego. Mimo że parametr wParam komunikatu WM_DEADCHAR zawiera kod znaku diakrytycznego dla martwego klucza, aplikacja zazwyczaj ignoruje komunikat. Zamiast tego przetwarza komunikat WM_CHAR wygenerowany przez kolejne naciśnięcie. Parametr wParam komunikatu WM_CHAR zawiera kod znaku litery z znakiem diakrytycznym. Jeśli kolejne naciśnięcie generuje znak, którego nie można połączyć z znakiem diakrytycznym, system generuje dwa komunikaty WM_CHAR. Parametr wParam pierwszego zawiera kod znaku diakrytycznego; parametr wParam drugiego zawiera kod znaku kolejnego klucza znaku.

Funkcja TranslateMessage generuje komunikat WM_SYSDEADCHAR podczas przetwarzania komunikatu WM_SYSKEYDOWN z systemowego martwego klawisza (klawisz, który jest naciskany w połączeniu z klawiszem ALT). Aplikacja zazwyczaj ignoruje komunikat WM_SYSDEADCHAR.

Stan klucza

Podczas przetwarzania komunikatu klawiaturowego aplikacja może wymagać określenia stanu innego klucza oprócz tego, który wygenerował bieżący komunikat. Na przykład edytor tekstu, który umożliwia użytkownikowi naciśnięcie klawiszy SHIFT+END w celu wybrania bloku tekstu, musi sprawdzić stan klawisza SHIFT za każdym razem, gdy otrzyma komunikat o naciśnięciu klawisza END. Aplikacja może użyć funkcji GetKeyState, aby określić stan klucza wirtualnego w momencie wygenerowania bieżącego komunikatu; może użyć funkcji GetAsyncKeyState, aby pobrać bieżący stan klucza wirtualnego.

Układ klawiatury przechowuje listę nazw. Nazwa klucza tworzącego pojedynczy znak jest taka sama jak znak wygenerowany przez klucz. Nazwa klucza nietypowego, takiego jak TAB i ENTER, jest przechowywana jako ciąg znaków. Aplikacja może pobrać nazwę dowolnego klucza ze sterownika urządzenia, wywołując funkcję GetKeyNameText.

Przycisk klawisza oraz tłumaczenia znaków

System zawiera kilka funkcji do specjalnych celów, które tłumaczą kody skanowania, kody znaków i kody kluczy wirtualnych dostarczane przez różne komunikaty naciśnięcia klawiszy. Te funkcje obejmują MapVirtualKey, ToAscii, ToUnicodei VkKeyScan.

Ponadto program Microsoft Rich Edit 3.0 obsługuje HexToUnicode IME, dzięki czemu użytkownik może konwertować znaki szesnastkowe na Unicode przy użyciu skrótów klawiszowych. Oznacza to, że gdy aplikacja microsoft Rich Edit 3.0 zostanie włączona do aplikacji, aplikacja odziedziczy funkcje protokołu IME hexToUnicode.

Obsługa Hot-Key

Klawisz skrótu jest kombinacją klawiszy, które generują wiadomość WM_HOTKEY, wiadomość, którą system umieszcza na początku kolejki komunikatów wątku, pomijając jakiekolwiek istniejące komunikaty w kolejce. Aplikacje używają klawiszy skrótu do uzyskiwania danych wejściowych z klawiatury o wysokim priorytecie od użytkownika. Na przykład przez zdefiniowanie klucza gorącego składającego się z kombinacji CTRL+C aplikacja może zezwolić użytkownikowi na anulowanie długotrwałej operacji.

Aby zdefiniować klucz gorący, aplikacja wywołuje funkcję RegisterHotKey, określając kombinację kluczy, która generuje komunikat WM_HOTKEY, dojście do okna w celu odebrania komunikatu oraz identyfikator klucza gorącego. Gdy użytkownik naciśnie klawisz skrótu, komunikat WM_HOTKEY zostaje umieszczony w kolejce komunikatów wątku, który utworzył okno. Parametr wParam komunikatu zawiera identyfikator klucza gorącego. Aplikacja może zdefiniować wiele skrótów klawiaturowych dla wątku, ale każdy skrót klawiaturowy w wątku musi mieć unikatowy identyfikator. Przed zakończeniem działania aplikacji należy użyć funkcji UnregisterHotKey, aby zniszczyć klucz gorący.

Aplikacje mogą używać kontrolki klucza gorącego, aby ułatwić użytkownikowi wybranie klucza gorącego. Kontrolki klucza gorącego są zwykle używane do definiowania klucza gorącego, który aktywuje okno; nie używają funkcji RegisterHotKey i UnregisterHotKey. Zamiast tego aplikacja, która używa kontrolki klucza gorącego, zwykle wysyła komunikat WM_SETHOTKEY w celu ustawienia klucza gorącego. Za każdym razem, gdy użytkownik naciska klawisz skrótu, system wysyła komunikat WM_SYSCOMMAND określający SC_HOTKEY. Aby uzyskać więcej informacji na temat kontrolek gorących, zobacz artykuł "Using Hot Key Controls" (Używanie kontrolek gorących) w hot key controls.

Klawisze klawiatury do przeglądania i innych funkcji

System Windows zapewnia obsługę klawiatur z klawiszami specjalnymi do funkcji przeglądarki, funkcji multimedialnych, uruchamiania aplikacji i zarządzania energią. WM_APPCOMMAND obsługuje dodatkowe klawiatury. Ponadto funkcja ShellProc została zmodyfikowana w celu obsługi dodatkowych klawiszy klawiatury.

Jest mało prawdopodobne, że okno podrzędne w aplikacji komponentu będzie mogło bezpośrednio zaimplementować polecenia dla tych dodatkowych klawiszy klawiatury. Po naciśnięciu jednego z tych klawiszy DefWindowProc wyśle komunikat WM_APPCOMMAND do okna. DefWindowProc będzie również bąbelkować komunikat WM_APPCOMMAND do okna nadrzędnego. Jest to podobne do sposobu wywoływania menu kontekstowego za pomocą prawego przycisku myszy, w ten sposób, że DefWindowProc wysyła komunikat WM_CONTEXTMENU po kliknięciu prawym przyciskiem i przekazuje to do elementu nadrzędnego. Ponadto, jeśli DefWindowProc otrzyma komunikat WM_APPCOMMAND dla okna najwyższego poziomu, wywoła hak powłoki z kodem HSHELL_APPCOMMAND.

System Windows obsługuje również eksploratora Microsoft IntelliMouse, który jest myszą z pięcioma przyciskami. Dwa dodatkowe przyciski obsługują nawigację w przeglądarce do przodu i do tyłu. Aby uzyskać więcej informacji, zobacz XBUTTONs.

Symulowanie danych wejściowych

Aby symulować nieprzerwaną serię zdarzeń wejściowych użytkownika, użyj funkcji SendInput. Funkcja akceptuje trzy parametry. Pierwszy parametr, cInputs, wskazuje liczbę zdarzeń wejściowych, które będą symulowane. Drugi parametr, rgInputs, jest tablicą struktur INPUT, z których każdy opisuje typ zdarzenia wejściowego i dodatkowe informacje o tym zdarzeniu. Ostatni parametr, cbSize, akceptuje rozmiar struktury INPUT w bajtach.

Funkcja SendInput działa przez wstrzyknięcie serii symulowanych zdarzeń wejściowych do strumienia wejściowego urządzenia. Rezultatem jest podobne działanie do wielokrotnego wywoływania funkcji keybd_event lub mouse_event, z wyjątkiem tego, że system gwarantuje, że żadne inne zdarzenia wejściowe nie mieszają się ze zdarzeniami symulowanymi. Po zakończeniu wywołania zwracana wartość wskazuje liczbę zdarzeń wejściowych, które zostały pomyślnie odtworzone. Jeśli ta wartość jest równa zero, dane wejściowe zostały zablokowane.

Funkcja SendInput nie resetuje bieżącego stanu klawiatury. W związku z tym, jeśli użytkownik ma jakiekolwiek klawisze wciśnięte podczas wywoływania tej funkcji, mogą one zakłócać zdarzenia generowane przez tę funkcję. Jeśli martwisz się o możliwą interferencję, sprawdź stan klawiatury za pomocą funkcji GetAsyncKeyState i popraw w razie potrzeby.

Języki, ustawienia regionalne i układy klawiatury

Język to język naturalny, taki jak angielski, francuski i japoński. Język podrzędny jest wariantem języka naturalnego, który jest używany w określonym regionie geograficznym, takim jak angielskie podjęzyczności mówione w Wielkiej Brytanii i Stanach Zjednoczonych. Aplikacje używają wartości nazywanych identyfikatorami języka , aby jednoznacznie identyfikować języki i podjęzyczności.

Aplikacje zazwyczaj używają ustawień regionalnych, aby ustawić język przetwarzania danych wejściowych i wyjściowych. Ustawienie ustawień regionalnych dla klawiatury, na przykład, wpływa na wartości znaków generowane przez klawiaturę. Ustawienie regionu dla wyświetlacza lub drukarki wpływa na wyświetlane lub drukowane glify. Aplikacje ustawiają ustawienia regionalne dla klawiatury, ładując i używając układów klawiatury. Ustawiają ustawienia regionalne dla wyświetlania lub drukarki, wybierając czcionkę, która obsługuje określone ustawienia regionalne.

Układ klawiatury nie tylko określa fizyczne położenie klawiszy na klawiaturze, ale także ustala wartości znaków generowane przez naciśnięcie tych klawiszy. Każdy układ identyfikuje bieżący język wejściowy i określa, jakie wartości znaków są generowane przez klawisze i kombinacje klawiszy.

Każdy układ klawiatury ma odpowiedni uchwyt, który identyfikuje układ i język. Niższa część uchwytu jest identyfikatorem języka. Wyższe słowo to uchwyt urządzenia, określający układ fizyczny, lub zero, co oznacza domyślny układ fizyczny. Użytkownik może skojarzyć dowolny język wejściowy z układem fizycznym. Na przykład użytkownik języka angielskiego, który bardzo czasami pracuje w języku francuskim, może ustawić język wejściowy klawiatury na francuski bez zmiany układu fizycznego klawiatury. Oznacza to, że użytkownik może wprowadzić tekst w języku francuskim przy użyciu znanego układu języka angielskiego.

Aplikacje zazwyczaj nie powinny bezpośrednio manipulować językami wejściowymi. Zamiast tego użytkownik konfiguruje kombinacje języków i układów, a następnie przełącza się między nimi. Gdy użytkownik kliknie tekst oznaczony innym językiem, aplikacja wywołuje funkcję ActivateKeyboardLayout, aby aktywować domyślny układ użytkownika dla tego języka. Jeśli użytkownik edytuje tekst w języku, który nie znajduje się na aktywnej liście, aplikacja może wywołać funkcję LoadKeyboardLayout z językiem, aby uzyskać układ na podstawie tego języka.

Funkcja ActivateKeyboardLayout ustawia język wejściowy dla bieżącego zadania. Parametr hkl może być dojściem do układu klawiatury lub identyfikatorem języka bez rozszerzenia. Uchwyty układu klawiatury można uzyskać z funkcji LoadKeyboardLayout lub GetKeyboardLayoutList. Wartości HKL_NEXT i HKL_PREV mogą być również używane do wybierania następnej lub poprzedniej klawiatury.

Funkcja GetKeyboardLayoutName pobiera nazwę aktywnego układu klawiatury dla wątku wywołującego. Jeśli aplikacja tworzy aktywny układ przy użyciu funkcji LoadKeyboardLayout, GetKeyboardLayoutName pobiera ten sam ciąg użyty do utworzenia układu. W przeciwnym razie ciąg jest identyfikatorem podstawowego języka odpowiadającym ustawieniom regionalnym aktywnego układu. Oznacza to, że funkcja może niekoniecznie rozróżniać różne układy z tym samym językiem podstawowym, więc nie może zwracać określonych informacji o języku wejściowym. Funkcja GetKeyboardLayout może jednak służyć do określania języka wejściowego.

Funkcja LoadKeyboardLayout ładuje układ klawiatury i udostępnia układ użytkownikowi. Aplikacje mogą natychmiast uaktywnić układ dla bieżącego wątku przy użyciu wartości KLF_ACTIVATE. Aplikacja może użyć wartości KLF_REORDER, aby zmienić kolejność układów bez określania wartości KLF_ACTIVATE. Aplikacje powinny zawsze używać wartości KLF_SUBSTITUTE_OK podczas ładowania układów klawiatury, aby upewnić się, że preferencja użytkownika, jeśli istnieje, jest zaznaczona.

W przypadku obsługi wielu języków funkcja LoadKeyboardLayout udostępnia flagi KLF_REPLACELANG i KLF_NOTELLSHELL. Flaga KLF_REPLACELANG kieruje funkcję w celu zastąpienia istniejącego układu klawiatury bez zmiany języka. Próba zastąpienia istniejącego układu przy użyciu tego samego identyfikatora języka, ale bez określenia KLF_REPLACELANG jest błędem. Flaga KLF_NOTELLSHELL uniemożliwia funkcji powiadamianie powłoki po dodaniu lub zastąpieniu układu klawiatury. Jest to przydatne w przypadku aplikacji, które dodają wiele układów w kolejnej serii wywołań. Ta flaga powinna być używana we wszystkich wywołaniach oprócz ostatniego.

Funkcja UnloadKeyboardLayout jest ograniczona, ponieważ nie może zwolnić domyślnego języka wejściowego systemu. Gwarantuje to, że użytkownik zawsze ma jeden układ dostępny do wprowadzania tekstu przy użyciu tego samego zestawu znaków, który jest używany przez powłokę i system plików.