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.
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
- Kody Virtual-Key opisane
- Flagi komunikatów naciśnięcia klawisza
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.
Aplikacja może użyć następujących wartości, aby pobrać flagi naciśnięć z wysokiego rzędu słowa lParam.
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
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:
- kod skanowania klawisza SysRq jest emitowany po naciśnięciu kombinacji klawiszy Alt+Print screen
- Kod skanowania klawisza break jest emitowany przy naciśnięciu klawiszy Control+Pause
- Jak pokazano w starszych wiadomościach klawiaturowych
- Klawisz jest obecny na klawiaturach brazylijskich
- Klawisz jest obecny na japońskich klawiaturach
- 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:
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.