Übersicht über die Tastatureingabe

Anwendungen sollten Benutzereingaben sowohl über die Tastatur als auch über die Maus akzeptieren. Eine Anwendung empfängt Tastatureingaben in Form von Nachrichten, die an ihre Fenster gesendet werden.

Tastatureingabemodell

Das System bietet geräteunabhängige Tastaturunterstützung für Anwendungen, indem es einen Tastaturgerätetreiber installiert, der für die aktuelle Tastatur geeignet ist. Das System bietet sprachunabhängige Tastaturunterstützung mithilfe des sprachspezifischen Tastaturlayouts, das der Benutzer oder die Anwendung derzeit ausgewählt hat. Der Tastaturgerätetreiber empfängt Scancodes von der Tastatur, die an das Tastaturlayout gesendet werden, wo sie in Nachrichten übersetzt und an die entsprechenden Fenster in Ihrer Anwendung gesendet werden.

Jeder Taste auf einer Tastatur wird ein eindeutiger Wert zugewiesen, der als Scancode bezeichnet wird, ein geräteabhängiger Bezeichner für die Taste auf der Tastatur. Eine Tastatur generiert zwei Scancodes, wenn der Benutzer auf eine Taste drückt – einen, wenn der Benutzer die Taste drückt, und einen weiteren, wenn der Benutzer die Taste loslässt.

Der Tastaturgerätetreiber interpretiert einen Scancode und übersetzt ihn in einen Virtuellen Schlüsselcode, einen geräteunabhängigen vom System definierten Wert, der den Zweck einer Taste identifiziert. Nach der Übersetzung eines Scancodes wird über das Tastaturlayout eine Nachricht erstellt, die den Scancode, den Code der virtuellen Taste und andere Informationen zur Tastatureingabe enthält, und die Nachricht wird in der Systemnachrichtenwarteschlange platziert. Das System entfernt die Nachricht aus der Systemnachrichtenwarteschlange und stellt sie in die Nachrichtenwarteschlange des entsprechenden Threads. Schließlich entfernt die Nachrichtenschleife des Threads die Nachricht und übergibt sie zur Verarbeitung an die entsprechende Fensterprozedur. In der folgenden Abbildung ist das Tastatureingabemodell dargestellt.

keyboard input processing model

Tastaturfokus und Aktivierung

Das System sendet Tastaturnachrichten an die Nachrichtenwarteschlange des Vordergrundthreads, der das Fenster mit dem Tastaturfokus erstellt hat. Der Tastaturfokus ist eine temporäre Eigenschaft eines Fensters. Das System teilt die Tastatur auf alle Fenstern in der Anzeige auf, indem der Tastaturfokus in Richtung des Benutzers von einem Fenster in ein anderes verschoben wird. Das Fenster mit dem Tastaturfokus empfängt (aus der Nachrichtenwarteschlange des Threads, von dem es erstellt wurde) alle Tastaturnachrichten, bis der Fokus in ein anderes Fenster wechselt.

Ein Thread kann die GetFocus-Funktion aufrufen, um zu bestimmen, welches seiner Fenster ggf. derzeit den Tastaturfokus hat. Ein Thread kann durch Aufrufen der SetFocus-Funktion den Tastaturfokus auf eines seiner Fenster legen. Wenn der Tastaturfokus von einem Fenster in ein anderes geändert wird, sendet das System eine WM_KILLFOCUS-Nachricht an das Fenster, das den Fokus verloren hat, und sendet dann eine WM_SETFOCUS-Nachricht an das Fenster, das den Fokus erhalten hat.

Das Konzept des Tastaturfokus hängt mit dem des aktiven Fensters zusammen. Das aktive Fenster ist das Fenster auf der obersten Ebene, mit dem der Benutzer derzeit arbeitet. Das Fenster mit dem Tastaturfokus ist entweder das aktive Fenster oder ein untergeordnetes Fenster des aktiven Fensters. Um den Benutzer bei der Identifizierung des aktiven Fensters zu unterstützen, platziert das System es oben in der Z-Reihenfolge und hebt ggf. die Titelleiste und den Rahmen hervor.

Der Benutzer kann ein Fenster auf oberster Ebene aktivieren, indem er darauf klickt und es mit der Tastenkombination ALT+TAB oder ALT+ESC aus der Aufgabenliste auswählt. Ein Thread kann ein Fenster auf oberster Ebene mithilfe der SetActiveWindow-Funktion aktivieren. Er kann mithilfe der GetActiveWindow-Funktion ermitteln, ob ein von ihm erstelltes Fenster auf oberster Ebene aktiv ist.

Wenn ein Fenster deaktiviert und ein anderes aktiviert ist, sendet das System die Nachricht WM_ACTIVATE. Das niederwertige Wort des Parameters wParam ist null, wenn das Fenster deaktiviert wird, und ungleich null, wenn es aktiviert wird. Wenn die Standardfensterprozedur die Nachricht WM_ACTIVATE empfängt, wird der Tastaturfokus auf das aktive Fenster gelegt.

Verwenden Sie BlockInput, um zu verhindern, dass Tastatur- und Mauseingabeereignisse Anwendungen erreichen. Beachten Sie, dass die BlockInput-Funktion die Tabelle mit dem asynchronen Tastatureingabestatus nicht beeinträchtigt. Dies bedeutet, dass das Aufrufen der SendInput-Funktion, während die Eingabe blockiert wird, die Tabelle mit dem asynchronen Tastatureingabestatus ändert.

Nachrichten zur Tastatureingabe

Wenn Sie eine Taste drücken, wird eine WM_KEYDOWN- oder eine WM_SYSKEYDOWN-Nachricht in der Threadnachrichtenwarteschlange platziert, die an das Fenster mit dem Tastaturfokus angefügt ist. Durch das Freigeben einer Taste wird eine WM_KEYUP - oder eine WM_SYSKEYUP-Nachricht in der Warteschlange platziert.

Key-up- und Key-down-Nachrichten treten in der Regel in Paaren auf. Wenn der Benutzer jedoch eine Taste so lange gedrückt hält, dass die automatische Wiederholungsfunktion der Tastatur gestartet wird, generiert das System nacheinander eine Reihe von WM_KEYDOWN- oder WM_SYSKEYDOWN-Nachrichten. Anschließend wird eine einzelne WM_KEYUP- oder WM_SYSKEYUP-Nachricht generiert, wenn der Benutzer die Taste freigibt.

Dieser Abschnitt enthält die folgenden Themen:

System- und systemfremde Tastatureingaben

Das System unterscheidet zwischen Systemtastatureingaben und systemfremden Tastatureingaben. Systemtastatureingaben erzeugen Nachrichten zu Systemtastatureingaben,WM_SYSKEYDOWN und WM_SYSKEYUP. Systemfremde Tastatureingaben erzeugen Nachrichten zu systemfremden Tastatureingaben, WM_KEYDOWN und WM_KEYUP.

Wenn Ihre Fensterprozedur eine Systemtastennachricht verarbeiten muss, stellen Sie sicher, dass die Prozedur sie nach der Verarbeitung der Nachricht an die DefWindowProc-Funktion übergibt. Andernfalls werden alle Systemvorgänge mit der ALT-Taste deaktiviert, wenn das Fenster den Tastaturfokus hat. Das heißt, der Benutzer kann nicht auf die Menüs oder das Systemmenü des Fensters zugreifen oder die Tastenkombination ALT+ESC oder ALT+TAB verwenden, um ein anderes Fenster zu aktivieren.

Nachrichten zu Systemtastatureingaben werden in erster Linie vom System und nicht von einer Anwendung verwendet. Das System verwendet sie, um die integrierte Tastaturschnittstelle für Menüs bereitzustellen und es dem Benutzer zu ermöglichen, zu steuern, welches Fenster aktiv ist. Nachrichten zu Systemtastatureingaben werden generiert, wenn der Benutzer eine Taste in Kombination mit der ALT-TASTE eingibt oder wenn der Benutzer etwas eingibt und kein Fenster den Tastaturfokus hat (z. B. wenn die aktive Anwendung minimiert wird). In diesem Fall werden die Nachrichten an die Nachrichtenwarteschlange gesendet, die an das aktive Fenster angefügt ist.

Nachrichten zu systemfremden Tastatureingaben sind für die Verwendung in Anwendungsfenstern vorgesehen. Die DefWindowProc-Funktion macht nichts mit ihnen. Eine Fensterprozedur kann alle Meldungen zu systemfremden Tastatureingaben verwerfen, die nicht benötigt werden.

Beschriebene Codes für virtuelle Tasten

Der Parameter wParam in einer Nachricht zu einer Tastatureingabe enthält den virtuellen Tastencode der Taste, die gedrückt oder freigegeben wurde. Eine Fensterprozedur verarbeitet oder ignoriert je nach Wert des virtuellen Tastencodes eine Nachricht zu einer Tastatureingabe.

Eine typische Fensterprozedur verarbeitet nur eine kleine Teilmenge der Meldungen zu einer Tastatureingabe, die sie empfängt, und ignoriert den Rest. Beispielsweise kann eine Nachrichten nur WM_KEYDOWN-Nachrichten zu Tastatureingaben verarbeiten, und nur solche, die virtuelle Schlüsselcodes für die Cursorbewegungstasten, Umschalttasten (auch als Steuertasten bezeichnet) und Funktionstasten enthalten. Eine typische Fensterprozedur verarbeitet keine Nachrichten zu Tastatureingaben von Tasten mit Zeichen. Stattdessen wird die TranslateMessage-Funktion verwendet, um die Nachricht in Zeichennachrichten zu konvertieren. Weitere Informationen zu TranslateMessage- und Zeichennachrichten finden Sie unter Zeichennachrichten.

Nachrichten -Flags für Tastatureingaben

Der Parameter lParam einer Nachricht zu Tastatureingaben enthält zusätzliche Informationen zu der Tastatureingabe, mit der die Nachricht generiert wurde. Diese Informationen umfassen die Wiederholungsanzahl, den Scancode, das Flag für erweiterte Tasten, den Kontextcode, das Flag zum vorherigen Tastenstatus und das Flag zum Übergangsstatus. Die folgende Abbildung zeigt die Speicherorte dieser Flags und Werte im Parameter lParam.

the locations of the flags and values in the lparam parameter of a keystroke message

Eine Anwendung kann die folgenden Werte verwenden, um die Tastatureingabeflags aus dem hochwertigen Wort des lParam abzurufen.

Wert Beschreibung
KF_EXTENDED
0x0100
Bearbeitet das Flag für erweiterte Tasten.
KF_DLGMODE
0x0800
Bearbeitet das Dialogfeldmodusflag, das angibt, ob ein Dialogfeld aktiv ist.
KF_MENUMODE
0x1000
Bearbeitet das Menümodusflag, das angibt, ob ein Menü aktiv ist.
KF_ALTDOWN
0x2000
Bearbeitet das Kontextcodeflag.
KF_REPEAT
0x4000
Bearbeitet das Flag des vorherigen Tastenstatus.
KF_UP
0x8000
Bearbeitet das Flag für den Übergangsstatus.

Codebeispiel:

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;

Zahl der Wiederholungen

Sie können die Wiederholungsanzahl überprüfen, um zu bestimmen, ob eine Tastatureingabe mehrere Tastatureingaben darstellt. Das System erhöht die Anzahl, wenn die Tastatur WM_KEYDOWN oder WM_SYSKEYDOWN Nachrichten schneller generiert, als eine Anwendung sie verarbeiten kann. Dies tritt häufig auf, wenn der Benutzer eine Taste lange genug gedrückt hält, um die automatische Wiederholungsfunktion der Tastatur zu starten. Anstatt die Systemnachrichtenwarteschlange mit den resultierenden Key-Down-Nachrichten zu füllen, kombiniert das System die Nachrichten in einer einzelnen Key-Down-Nachricht und erhöht die Wiederholungsanzahl. Das Freigeben einer Taste kann das Feature für automatische Wiederholungen nicht starten, sodass die Wiederholungsanzahl für WM_KEYUP und WM_SYSKEYUP-Nachrichten immer auf „1“ festgelegt ist.

Scancodes

Diagram of a Type 4 keyboard with the key locations for each key.

Der Scancode ist der Wert, den das System generiert, wenn Benutzer*innen eine Taste drücken. Es handelt sich um einen Wert, der die Taste unabhängig vom aktiven Tastaturlayout identifiziert – im Gegensatz zu dem Zeichen, das durch die Taste dargestellt wird. Eine Anwendung ignoriert Scancodes in der Regel. Stattdessen werden virtuelle Tastencodes verwendet, um Tastaturanschlagmeldungen zu interpretieren.

Moderne Tastaturen verwenden die HID-Spezifikation (Human Interface Devices), um mit einem Computer zu kommunizieren. Der Tastaturtreiber konvertiert die von der Tastatur gemeldeten HID-Verwendungswerte in Scancodes und leitet diese an Anwendungen weiter.

Hinweis

Während virtuelle Tastencodes in der Regel nützlicher für Desktopanwendungen sind, sind Scancodes möglicherweise in bestimmten Fällen erforderlich, in denen Sie wissen müssen, welche Taste unabhängig vom aktuellen Tastaturlayout gedrückt wird. Beispielsweise stellt die WASD-Tastenbindung (W ist nach oben, A ist nach links, S ist nach unten und D ist nach rechts) für Spiele eine konsistente Tastenzuordnung für verschiedene Tastaturlayouts wie US-QWERTY oder französisches AZERTY sicher.

In der folgenden Tabelle sind die Scancodes aufgeführt, die derzeit von Windows erkannt werden. Die Werte HID-Verwendungsseite/HID-Verwendungs-ID/HID-Verwendungsname finden Sie im Dokument HID-Verwendungstabellen. Die Werte für die Tastenposition finden Sie im obigen Tastaturbild.

Der Code Scan 1 Make wird in WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP- und WM_INPUT-Nachrichten übermittelt.

Name der HID-Verwendungsseite HID-Verwendungsname HID-Verwendungsseite HID-Verwendungs-ID Scan 1 Make Tastenposition
Generischer Desktop Systemleistung herunter fahren 0x0001 0x0081 0xE05E
Generischer Desktop System in den Ruhemodus versetzen 0x0001 0x0082 0xE05F
Generischer Desktop System reaktivieren 0x0001 0x0083 0xE063
Tastatur/Ziffernblock ErrorRollOver 0x0007 0x0001 0x00FF
Tastatur/Ziffernblock Tastatur A 0x0007 0x0004 0x001E 31
Tastatur/Ziffernblock Tastatur B 0x0007 0x0005 0x0030 50
Tastatur/Ziffernblock Tastatur C 0x0007 0x0006 0x002E 48
Tastatur/Ziffernblock Tastatur D 0x0007 0x0007 0x0020 33
Tastatur/Ziffernblock Tastatur E 0x0007 0x0008 0x0012 19
Tastatur/Ziffernblock Tastatur F 0x0007 0x0009 0x0021 34
Tastatur/Ziffernblock Tastatur G 0x0007 0x000A 0x0022 35
Tastatur/Ziffernblock Tastatur H 0x0007 0x000B 0x0023 36
Tastatur/Ziffernblock Tastatur I 0x0007 0x000C 0x0017 24
Tastatur/Ziffernblock Tastatur J 0x0007 0x000D 0x0024 37
Tastatur/Ziffernblock Tastatur K 0x0007 0x000E 0x0025 38
Tastatur/Ziffernblock Tastatur L 0x0007 0x000F 0x0026 39
Tastatur/Ziffernblock Tastatur M 0x0007 0x0010 0x0032 52
Tastatur/Ziffernblock Tastatur N 0x0007 0x0011 0x0031 51
Tastatur/Ziffernblock Tastatur O 0x0007 0x0012 0x0018 25
Tastatur/Ziffernblock Tastatur P 0x0007 0x0013 0x0019 26
Tastatur/Ziffernblock Tastatur Q 0x0007 0x0014 0x0010 17
Tastatur/Ziffernblock Tastatur R 0x0007 0x0015 0x0013 20
Tastatur/Ziffernblock Tastatur S 0x0007 0x0016 0x001F 32
Tastatur/Ziffernblock Tastatur T 0x0007 0x0017 0x0014 21
Tastatur/Ziffernblock Tastatur U 0x0007 0x0018 0x0016 23
Tastatur/Ziffernblock Tastatur V 0x0007 0x0019 0x002F 49
Tastatur/Ziffernblock Tastatur W 0x0007 0x001A 0x0011 18
Tastatur/Ziffernblock Tastatur X 0x0007 0x001B 0x002D 47
Tastatur/Ziffernblock Tastatur Y 0x0007 0x001C 0x0015 22
Tastatur/Ziffernblock Tastatur Z 0x0007 0x001D 0x002C 46
Tastatur/Ziffernblock Tastatur 1 und Ausrufezeichen 0x0007 0x001E 0x0002 2
Tastatur/Ziffernblock Tastatur 2 und At 0x0007 0x001F 0x0003 3
Tastatur/Ziffernblock Tastatur 3 und Hash 0x0007 0x0020 0x0004 4
Tastatur/Ziffernblock Tastatur 4 und Dollar 0x0007 0x0021 0x0005 5
Tastatur/Ziffernblock Tastatur 5 und Prozent 0x0007 0x0022 0x0006 6
Tastatur/Ziffernblock Tastatur 6 und Caret 0x0007 0x0023 0x0007 7
Tastatur/Ziffernblock Tastatur 7 und kaufmännisches Und-Zeichen 0x0007 0x0024 0x0008 8
Tastatur/Ziffernblock Tastatur 8 und Sternchen 0x0007 0x0025 0x0009 9
Tastatur/Ziffernblock Tastatur 9 und linke Klammer 0x0007 0x0026 0x000A 10
Tastatur/Ziffernblock Tastatur 0 und rechte Klammer 0x0007 0x0027 0x000B 11
Tastatur/Ziffernblock Tastatur EINGABETASTE 0x0007 0x0028 0x001C 43
Tastatur/Ziffernblock Tastatur ESC 0x0007 0x0029 0x0001 110
Tastatur/Ziffernblock Tastatur RÜCKTASTE 0x0007 0x002A 0x000E 15
Tastatur/Ziffernblock Tastatur TAB-Taste 0x0007 0x002B 0x000F 16
Tastatur/Ziffernblock Tastatur LEERTASTE 0x0007 0x002C 0x0039 61
Tastatur/Ziffernblock Tastatur Binde- und Unterstrich 0x0007 0x002D 0x000C 12
Tastatur/Ziffernblock Tastatur Gleichheits- und Pluszeichen 0x0007 0x002E 0x000D 13
Tastatur/Ziffernblock Tastatur linke geschweifte Klammer 0x0007 0x002F 0x001A 27
Tastatur/Ziffernblock Tastatur rechte geschweifte Klammer 0x0007 0x0030 0x001B 28
Tastatur/Ziffernblock Tastatur senkrechter und Schrägstrich 0x0007 0x0031 0x002B 29
Tastatur/Ziffernblock Tastatur ohne US-Layout 0x0007 0x0032 0x002B 42
Tastatur/Ziffernblock Tastatur Semikolon und Doppelpunkt 0x0007 0x0033 0x0027 40
Tastatur/Ziffernblock Tastatur Apostroph und doppeltes Anführungszeichen 0x0007 0x0034 0x0028 41
Tastatur/Ziffernblock Tastatur Graviszeichen und Tilde 0x0007 0x0035 0x0029 1
Tastatur/Ziffernblock Tastatur Komma 0x0007 0x0036 0x0033 53
Tastatur/Ziffernblock Tastatur Punkt 0x0007 0x0037 0x0034 54
Tastatur/Ziffernblock Tastatur Fragezeichen 0x0007 0x0038 0x0035 55
Tastatur/Ziffernblock Tastatur FESTSTELLTASTE 0x0007 0x0039 0x003A 30
Tastatur/Ziffernblock Tastatur F1 0x0007 0x003A 0x003B 112
Tastatur/Ziffernblock Tastatur F2 0x0007 0x003B 0x003C 113
Tastatur/Ziffernblock Tastatur F3 0x0007 0x003C 0x003D 114
Tastatur/Ziffernblock Tastatur F4 0x0007 0x003D 0x003E 115
Tastatur/Ziffernblock Tastatur F5 0x0007 0x003E 0x003F 116
Tastatur/Ziffernblock Tastatur F6 0x0007 0x003F 0x0040 117
Tastatur/Ziffernblock Tastatur F7 0x0007 0x0040 0x0041 118
Tastatur/Ziffernblock Tastatur F8 0x0007 0x0041 0x0042 119
Tastatur/Ziffernblock Tastatur F9 0x0007 0x0042 0x0043 120
Tastatur/Ziffernblock Tastatur F10 0x0007 0x0043 0x0044 121
Tastatur/Ziffernblock Tastatur F11 0x0007 0x0044 0x0057 122
Tastatur/Ziffernblock Tastatur F12 0x0007 0x0045 0x0058 123
Tastatur/Ziffernblock Tastatur DRUCK-Taste 0x0007 0x0046 0xE037
0x0054 *Anmerkung 1
124
Tastatur/Ziffernblock Tastatur ROLLEN-Taste 0x0007 0x0047 0x0046 125
Tastatur/Ziffernblock Tastatur PAUSE 0x0007 0x0048 0xE11D45
0xE046 *Anmerkung 2
0x0045 *Anmerkung 3
126
Tastatur/Ziffernblock Tastatur EINFG 0x0007 0x0049 0xE052 75
Tastatur/Ziffernblock Tastatur POS1 0x0007 0x004A 0xE047 80
Tastatur/Ziffernblock Tastatur SEITE-NACH-OBEN 0x0007 0x004B 0xE049 85
Tastatur/Ziffernblock Tastatur ENTF 0x0007 0x004C 0xE053 76
Tastatur/Ziffernblock Tastatur ENDE 0x0007 0x004D 0xE04F 81
Tastatur/Ziffernblock Tastatur SEITE-NACH-UNTEN 0x0007 0x004E 0xE051 86
Tastatur/Ziffernblock Tastatur NACH-RECHTS 0x0007 0x004F 0xE04D 89
Tastatur/Ziffernblock Tastatur NACH-LINKS 0x0007 0x0050 0xE04B 79
Tastatur/Ziffernblock Tastatur NACH-UNTEN 0x0007 0x0051 0xE050 84
Tastatur/Ziffernblock Tastatur NACH-OBEN 0x0007 0x0052 0xE048 83
Tastatur/Ziffernblock Ziffernblock NUM-Taste und Löschen 0x0007 0x0053 0x0045
0xE045 *Anmerkung 3
90
Tastatur/Ziffernblock Ziffernblock Schrägstrich 0x0007 0x0054 0xE035 95
Tastatur/Ziffernblock Ziffernblock Sternchen 0x0007 0x0055 0x0037 100
Tastatur/Ziffernblock Ziffernblock Bindestrich 0x0007 0x0056 0x004A 105
Tastatur/Ziffernblock Ziffernblock Plus 0x0007 0x0057 0x004E 106
Tastatur/Ziffernblock Ziffernblock EINGABETASTE 0x0007 0x0058 0xE01C 108
Tastatur/Ziffernblock Ziffernblock 1 und ENDE 0x0007 0x0059 0x004F 93
Tastatur/Ziffernblock Ziffernblock 2 und NACH-UNTEN 0x0007 0x005A 0x0050 98
Tastatur/Ziffernblock Ziffernblock 3 und SEITE-NACH-UNTEN 0x0007 0x005B 0x0051 103
Tastatur/Ziffernblock Ziffernblock 4 und NACH-LINKS 0x0007 0x005C 0x004B 92
Tastatur/Ziffernblock Ziffernblock 5 0x0007 0x005D 0x004C 97
Tastatur/Ziffernblock Ziffernblock 6 und NACH-RECHTS 0x0007 0x005E 0x004D 102
Tastatur/Ziffernblock Ziffernblock 7 und POS1 0x0007 0x005F 0x0047 91
Tastatur/Ziffernblock Ziffernblock 8 und NACH-OBEN 0x0007 0x0060 0x0048 96
Tastatur/Ziffernblock Ziffernblock 9 und SEITE-NACH-OBEN 0x0007 0x0061 0x0049 101
Tastatur/Ziffernblock Ziffernblock 0 und EINFG 0x0007 0x0062 0x0052 99
Tastatur/Ziffernblock Ziffernblock Punkt 0x0007 0x0063 0x0053 104
Tastatur/Ziffernblock Tastatur Nicht-US-Layout Schrägstrich 0x0007 0x0064 0x0056 45
Tastatur/Ziffernblock Tastatur Anwendung 0x0007 0x0065 0xE05D 129
Tastatur/Ziffernblock Tastatur Ein/Aus 0x0007 0x0066 0xE05E
Tastatur/Ziffernblock Ziffernblock Gleichheitszeichen 0x0007 0x0067 0x0059
Tastatur/Ziffernblock Tastatur F13 0x0007 0x0068 0x0064
Tastatur/Ziffernblock Tastatur F14 0x0007 0x0069 0x0065
Tastatur/Ziffernblock Tastatur F15 0x0007 0x006A 0x0066
Tastatur/Ziffernblock Tastatur F16 0x0007 0x006B 0x0067
Tastatur/Ziffernblock Tastatur F17 0x0007 0x006C 0x0068
Tastatur/Ziffernblock Tastatur F18 0x0007 0x006D 0x0069
Tastatur/Ziffernblock Tastatur F19 0x0007 0x006E 0x006A
Tastatur/Ziffernblock Tastatur F20 0x0007 0x006F 0x006B
Tastatur/Ziffernblock Tastatur F21 0x0007 0x0070 0x006C
Tastatur/Ziffernblock Tastatur F22 0x0007 0x0071 0x006D
Tastatur/Ziffernblock Tastatur F23 0x0007 0x0072 0x006E
Tastatur/Ziffernblock Tastatur F24 0x0007 0x0073 0x0076
Tastatur/Ziffernblock Ziffernblock Komma 0x0007 0x0085 0x007E 107 *Anmerkung 4
Tastatur/Ziffernblock Tastatur International1 0x0007 0x0087 0x0073 56 *Anmerkungen 4, 5
Tastatur/Ziffernblock Tastatur International2 0x0007 0x0088 0x0070 133 *Anmerkung 5
Tastatur/Ziffernblock Tastatur International3 0x0007 0x0089 0x007D 14 *Anmerkung 5
Tastatur/Ziffernblock Tastatur International4 0x0007 0x008A 0x0079 132 *Anmerkung 5
Tastatur/Ziffernblock Tastatur International5 0x0007 0x008B 0x007B 131 *Anmerkung 5
Tastatur/Ziffernblock Tastatur International6 0x0007 0x008C 0x005C
Tastatur/Ziffernblock Tastatur LANG1 0x0007 0x0090 0x0072 *Anmerkung 6
0x00F2 *Anmerkungen 3, 6
Tastatur/Ziffernblock Tastatur LANG2 0x0007 0x0091 0x0071 *Anmerkung 6
0x00F1 *Anmerkungen 3, 6
Tastatur/Ziffernblock Tastatur LANG3 0x0007 0x0092 0x0078
Tastatur/Ziffernblock Tastatur LANG4 0x0007 0x0093 0x0077
Tastatur/Ziffernblock Tastatur LANG5 0x0007 0x0094 0x0076
Tastatur/Ziffernblock Tastatur STRG (links) 0x0007 0x00E0 0x001D 58
Tastatur/Ziffernblock Tastatur UMSCHALT (links) 0x0007 0x00E1 0x002A 44
Tastatur/Ziffernblock Tastatur ALT (links) 0x0007 0x00E2 0x0038 60
Tastatur/Ziffernblock Tastatur GUI (links) 0x0007 0x00E3 0xE05B 127
Tastatur/Ziffernblock Tastatur STRG (rechts) 0x0007 0x00E4 0xE01D 64
Tastatur/Ziffernblock Tastatur UMSCHALT (rechts) 0x0007 0x00E5 0x0036 57
Tastatur/Ziffernblock Tastatur ALT (rechts) 0x0007 0x00E6 0xE038 62
Tastatur/Ziffernblock Tastatur GUI (rechts) 0x0007 0x00E7 0xE05C 128
Verbraucher Scannen Nächster Titel 0x000C 0x00B5 0xE019
Verbraucher Scannen Vorheriger Titel 0x000C 0x00B6 0xE010
Verbraucher Beenden 0x000C 0x00B7 0xE024
Verbraucher Play/Pause 0x000C 0x00CD 0xE022
Verbraucher Stummschalten 0x000C 0x00E2 0xE020
Verbraucher Lautstärke erhöhen 0x000C 0x00E9 0xE030
Verbraucher Lautstärke verringern 0x000C 0x00EA 0xE02E
Verbraucher AL Benutzersteuerelement-Konfiguration 0x000C 0x0183 0xE06D
Verbraucher AL E-Mail-Leseprogramm 0x000C 0x018A 0xE06C
Verbraucher AL Rechner 0x000C 0x0192 0xE021
Verbraucher AL Browser lokaler Computer 0x000C 0x0194 0xE06B
Verbraucher AC Suchen 0x000C 0x0221 0xE065
Verbraucher AC Start 0x000C 0x0223 0xE032
Verbraucher AC Zurück 0x000C 0x0224 0xE06A
Verbraucher AC Vorwärts 0x000C 0x0225 0xE069
Verbraucher AC Beenden 0x000C 0x0226 0xE068
Verbraucher AC Aktualisieren 0x000C 0x0227 0xE067
Verbraucher AC-Lesezeichen 0x000C 0x022A 0xE066

Hinweise:

  1. Der Scancode der SysRq-Taste wird als Tastendruck ALT+DRUCKEN ausgegeben.
  2. Der Scancode der Break-Taste wird als Tastendruck STRG+PAUSE ausgegeben.
  3. Wie in älteren Tastaturnachrichten zu sehen
  4. Die Taste ist auf brasilianischen Tastaturen vorhanden.
  5. Die Taste ist auf japanischen Tastaturen vorhanden.
  6. Der Scancode wird nur im Ereignis für das Loslassen der Taste ausgegeben.

Flat für erweiterte Taste

Das Flag für erweiterte Taste gibt an, ob die Tastatureingabenachricht von einer der zusätzlichen Tasten auf der erweiterten Tastatur mit 101/102-Tasten stammt. Die erweiterten Tasten bestehen aus den ALT- und STRG-Tasten auf der rechten Seite der Tastatur, den Tasten EINFG, ENTF, POS1, ENDE, BILD AUF, BILD AB und den Pfeiltasten in den Clustern links neben der Zehnertastatur, der NUM-Taste, der Taste PAUSE/UNTERBR (STRG+PAUSE); der BILDSCHIRM DRUCKEN-Taste und der Slash-(/-) und der EINGABE-Taste auf der numerischen Zehnertastatur. Die rechte UMSCHALT-Taste gilt nicht als erweiterte TasteSchlüssel, sondern verfügt stattdessen über einen separaten Scancode.

Sofern angegeben, besteht der Scancode aus einer Sequenz von zwei Bytes, wobei das erste Byte den Wert 0xE0 hat.

Kontextcode

Der Kontextcode gibt an, ob die ALT-Taste ausgefallen ist, als die Tastatureingabenachricht generiert wurde. Der Code ist 1, wenn die ALT-Taste gedrückt war, und 0, wenn sie nicht gedrückt war.

Flag für vorherigen Tastenstatus

Das Flag für den vorherigen Tastenstatus gibt an, ob die Taste, mit der die Tastatureingabenachricht generiert wurde, zuvor gedrückt oder nicht gedrückt war. Es ist 1, wenn die Taste zuvor gedrückt war, und 0, wenn die Taste Schlüssel zuvor nicht gedrückt war. Sie können dieses Flag verwenden, um Tastatureingabenachrichten zu identifizieren, die von der Funktion für automatische Wiederholungen der Tastatur generiert werden. Dieses Flag ist für WM_KEYDOWN und WM_SYSKEYDOWN-Tastatureingabenachrichten, die vom Feature für automatische Wiederholungen generiert werden, auf „1“ festgelegt. Sie ist für WM_KEYUP- und WM_SYSKEYUP-Nachrichten immer auf „1“ festgelegt.

Flag für Übergangsstatus

Das Flag für „Übergangsstatus“ gibt an, ob die Tastatureingabenachricht durch das Drücken einer Taste oder das Loslassen einer Taste generiert wurde. Dieses Flag ist für WM_KEYDOWN und WM_SYSKEYDOWN-Nachrichten immer auf „0“ festgelegt. Für WM_KEYUP- und WM_SYSKEYUP-Nachrichten ist es immer auf „1“ festgelegt.

Zeichennachrichten

Tastatureingabenachrichten bieten viele Informationen zu Tastatureingaben, aber sie stellen keine Zeichencodes für Zeichentastatureingaben bereit. Zum Abrufen von Zeichencodes muss eine Anwendung die TranslateMessage-Funktion in ihre Threadnachrichtenschleife einschließen. TranslateMessage übergibt eine WM_KEYDOWN-- oder WM_SYSKEYDOWN-Nachricht an das Tastaturlayout. Das Layout untersucht den virtuellen Tastencode der Nachricht und stellt, wenn er einer Zeichentaste entspricht, die Äquivalente des Zeichencodes bereit (unter Berücksichtigung des Zustands der UMSCHALT- und FESTSTELL-Tasten). Anschließend wird eine Zeichennachricht generiert, die den Zeichencode enthält, und die Nachricht an den Anfang der Nachrichtenwarteschlange platziert. Durch die nächste Iteration der Nachrichtenschleife wird die Zeichennachricht aus der Warteschlange entfernt, und die Nachricht wird an die entsprechende Fensterprozedur gesendet.

Dieser Abschnitt enthält die folgenden Themen:

Nachrichten zu systemfremden Zeichen

Eine Fensterprozedur kann die folgenden Zeichennachrichten empfangen: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR und WM_UNICHAR. Die TranslateMessage-Funktion generiert eine WM_CHAR oder eine WM_DEADCHAR-Nachricht, wenn sie eine WM_KEYDOWN-Nachricht verarbeitet. Ebenso generiert sie eine WM_SYSCHAR- oder eine WM_SYSDEADCHAR-Nachricht, wenn eine WM_SYSKEYDOWN-Nachricht verarbeitet wird.

Eine Anwendung, die Tastatureingaben verarbeitet, ignoriert in der Regel alle WM_CHAR- und WM_UNICHAR-Nachrichten und übergibt alle anderen Nachrichten an die DefWindowProc-Funktion. Beachten Sie, dass WM_CHAR deb UTF-16 (16-Bit Unicode Transformation Format) oder den ANSI-Zeichensatz verwendet, während WM_UNICHAR immer UTF-32 (32-Bit-Unicode-Transformationsformat) verwendet. Das System verwendet die WM_SYSCHAR und WM_SYSDEADCHAR-Nachrichten, um Menümnemonics zu implementieren.

Der Parameter wParam aller Zeichennachrichten enthält den Zeichencode der gedrückten Zeichentaste. Der Wert des Zeichencodes hängt von der Fensterklasse des Fensters ab, das die Nachricht empfängt. Wenn die Unicode-Version der RegisterClass-Funktion verwendet wurde, um die Fensterklasse zu registrieren, stellt das System Unicode-Zeichen für alle Fenster dieser Klasse bereit. Andernfalls stellt das System ANSI-Zeichencodes bereit. Weitere Informationen finden Sie unter Registrieren von Fensterklassen und Verwenden von UTF-8-Codepages in Windows-Apps.

Der Inhalt des Parameters lParam einer Zeichennachricht ist identisch mit dem Inhalt des Parameters lParam der Key-Down-Nachricht, die zur Erzeugung der Zeichennachricht übersetzt wurde. Weitere Informationen finden Sie unter Flags zu Tastatureingabenachrichten.

Nachrichten zu Totzeichen

Einige nicht englischsprachige Tastaturen enthalten Zeichentasten, von denen nicht erwartet wird, dass sie selbst Zeichen erzeugen. Stattdessen werden sie verwendet, um dem Zeichen, das durch die nachfolgende Tasteneingabe erzeugt wird, ein diakritisches Zeichen hinzuzufügen. Diese Schlüssel werden als Tottasten bezeichnet. Die Zirkumflextaste auf einer deutschen Tastatur ist ein Beispiel für eine Tottaste. Um das Zeichen einzugeben, das aus einem „o“ mit einem Zirkumflex besteht, würde ein deutscher Benutzer die Zirkumflex-Taste gefolgt von der „o“-Taste eingeben. Das Fenster mit dem Tastaturfokus erhält die folgende Nachrichtensequenz:

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

TranslateMessage generiert die WM_DEADCHAR-Nachricht, wenn die WM_KEYDOWN-Nachricht von einer Tottaste verarbeitet wird. Obwohl der Parameter wParam der WM_DEADCHAR-Nachricht den Zeichencode des diakritischen Zeichens für die Tottaste enthält, ignoriert eine Anwendung die Nachricht in der Regel. Stattdessen verarbeitet sie die WM_CHAR-Nachricht, die mit der nachfolgenden Tastatureingabe generiert wird. Der Parameter wParam der WM_CHAR-Nachricht enthält den Zeichencode des Buchstabens mit dem diakritischen Zeichen. Wenn mit der nachfolgenden Tastatureingabe ein Zeichen generiert wird, das nicht mit einem diakritischen Zeichen kombiniert werden kann, generiert das System zwei WM_CHAR-Nachrichten. Der Parameter wParam der ersten Nachricht enthält den Zeichencode des diakritischen Zeichens; der Parameter wParam der zweiten enthält den Zeichencode der nachfolgenden Zeichentaste.

Die TranslateMessage-Funktion generiert die WM_SYSDEADCHAR-Nachricht, wenn sie die WM_SYSKEYDOWN-Nachricht von einer Systemtottaste verarbeitet (eine Tottaste, die in Kombination mit der ALT-Taste gedrückt wird). Eine Anwendung ignoriert in der Regel die WM_SYSDEADCHAR-Nachricht.

Tastenstatus

Während der Verarbeitung einer Tastaturnachricht muss eine Anwendung möglicherweise den Status einer anderen Taste neben der Taste ermitteln, durch die die aktuelle Nachricht generiert wurde. Beispielsweise muss eine Textverarbeitungsanwendung, in der der Benutzer UMSCHALT+ENDE drücken kann, um einen Textblock auszuwählen, den Status der UMSCHALT-Taste überprüfen, wenn sie eine Tastatureingabenachricht von der ENDE-Taste empfängt. Die Anwendung kann mithilfe der GetKeyState-Funktion den Status einer virtuellen Taste zum Zeitpunkt der Generierung der aktuellen Nachricht bestimmen. Sie kann mit der GetAsyncKeyState-Funktion den aktuellen Status einer virtuellen Taste abrufen.

Das Tastaturlayout verwaltet eine Liste von Namen. Der Name einer Taste, die ein einzelnes Zeichen erzeugt, ist identisch mit dem von der Taste erzeugten Zeichen. Der Name einer Taste, die kein Zeichen generiert, wie z. B. die TAB und die EINGABE-Taste wird als Zeichenfolge gespeichert. Eine Anwendung kann den Namen einer beliebigen Taste vom Gerätetreiber abrufen, indem sie die Funktion GetKeyNameText aufruft.

Tastatureingabe- und Zeichenübersetzungen

Das System umfasst mehrere spezielle Funktionen, die Scancodes, Zeichencodes und Codes von virtuellen Tasten übersetzen, die von verschiedenen Tastatureingabenachrichten bereitgestellt werden. Zu diesen Funktionen gehören MapVirtualKey, ToAscii, ToUnicode und VkKeyScan.

Darüber hinaus unterstützt Microsoft Rich Edit 3.0 den HexToUnicode-IME, mit der ein Benutzer zwischen Hexadezimal- und Unicode-Zeichen mithilfe von Tastenkombinationen wechseln kann. Dies bedeutet, dass die Anwendung, wenn Microsoft Rich Edit 3.0 in eine Anwendung integriert wird, die Features der HexToUnicode-IME erbt.

Hot-Key-Support

Ein Hot-Key ist eine Tastenkombination, die eine WM_HOTKEY-Nachricht generiert, eine Nachricht, die das System oben in der Nachrichtenwarteschlange eines Threads platziert, wobei alle vorhandenen Nachrichten in der Warteschlange umgangen werden. Anwendungen verwenden Hot-Keys, um Tastatureingaben mit hoher Priorität vom Benutzer zu erhalten. Wenn Sie z. B. einen Hot-Key definieren, der aus der Tastenkombination STRG+C besteht, kann eine Anwendung es dem Benutzer ermöglichen, einen längeren Vorgang abzubrechen.

Um einen Hot-Key zu definieren, ruft eine Anwendung die RegisterHotKey-Funktion auf und gibt die Tastenkombination an, die die WM_HOTKEY-Nachricht generiert, das Handle für das Fenster zum Empfangen der Nachricht und den Bezeichner des Hot-Keys. Wenn der Benutzer die Tastenkombination drückt, wird eine WM_HOTKEY-Nachricht in der Nachrichtenwarteschlange des Threads platziert, der das Fenster erstellt hat. Der Parameter wParam der Nachricht enthält den Bezeichner des Hot-Keys. Die Anwendung kann mehrere Hot-Keys für einen Thread definieren, aber jeder Hot-Key im Thread muss über einen eindeutigen Bezeichner verfügen. Bevor die Anwendung beendet wird, sollte sie die UnregisterHotKey-Funktion verwenden, um den Hot-Key zu zerstören.

Anwendungen können eine Hot-Key-Steuerung verwenden, um dem Benutzer die Auswahl einer Tastenkombination zu erleichtern. Hot-Key-Steuerelemente werden in der Regel verwendet, um einen Hot-Key zu definieren, mit dem ein Fenster aktiviert wird. Sie verwenden nicht die Funktionen RegisterHotKey und UnregisterHotKey. Stattdessen sendet eine Anwendung, die ein Hot-Key-Steuerelement verwendet, in der Regel die WM_SETHOTKEY-Nachricht, um den Hot-Key festzulegen. Wenn der Benutzer die Tastenkombination drückt, sendet das System eine WM_SYSCOMMAND-Nachricht, in der SC_HOTKEY angegeben wird. Weitere Informationen zu Hot Key-Steuerelementen finden Sie unter „Verwenden von Hot-Key-Steuerelementen“ in Hot-Key-Steuerelemente.

Tastaturtasten zum Browsen und für andere Funktionen

Windows bietet Support für Tastaturen mit zusätzlichen Tasten für Browserfunktionen, Medienfunktionen, Anwendungsstarts und zur Energieverwaltung. Der WM_APPCOMMAND-Befehl unterstützt die zusätzlichen Tastaturtasten. Darüber hinaus wurde die ShellProc-Funktion geändert, um die zusätzlichen Tastaturtasten zu unterstützen.

Es ist unwahrscheinlich, dass ein untergeordnetes Fenster in einer Komponentenanwendung Befehle für diese zusätzlichen Tastaturtasten direkt implementieren kann. Wenn also eine dieser Tasten gedrückt wird, sendet DefWindowProc eine WM_APPCOMMAND-Nachricht an ein Fenster. DefWindowProc sendet die Nachricht WM_APPCOMMAND auch an das übergeordnete Fenster. Dies ähnelt der Art und Weise, wie Kontextmenüs mit der rechten Maustaste aufgerufen werden, d. h. DefWindowProc sendet eine WM_CONTEXTMENU-Nachricht bei einem Klick mit der rechten Maustaste und sendet sie an das übergeordnete Element. Wenn DefWindowProc eine WM_APPCOMMAND-Nachricht für ein Fenster der obersten Ebene empfängt, wird außerdem ein Shell-Hook mit dem Code HSHELL_APPCOMMAND aufgerufen.

Windows unterstützt auch den Microsoft IntelliMouse Explorer, bei dem es sich um eine Maus mit fünf Tasten handelt. Die beiden zusätzlichen Tasten unterstützen die Vorwärts- und Rückwärtsnavigation im Browser. Weitere Informationen finden Sie unter XBUTTONs.

Simulieren der Eingabe

Mit der SendInput-Funktion können Sie eine ununterbrochene Reihe von Benutzereingabeereignissen simulieren. Die Funktion besteht aus drei Parametern. Der erste Parameter cInputs gibt die Anzahl der Eingabeereignisse an, die simuliert werden. Der zweite Parameter, rgInputs, ist ein Array von INPUT-Strukturen, die jeweils Eingabeereignisse und zusätzliche Informationen eines Typs zu diesem Ereignis beschreiben. Der letzte Parameter, cbSize, übernimmt die Größe der INPUT-Struktur in Bytes.

Die SendInput-funktion fügt eine Reihe simulierter Eingabeereignisse in den Eingabedatenstrom eines Geräts ein. Der Effekt ähnelt dem wiederholten Aufrufen der keybd_event- oder der mouse_event-Funktion, bis auf dass das System sicherstellt, dass sich keine anderen Eingabeereignisse mit den simulierten Ereignissen mischen. Nach Abschluss des Aufrufs gibt der Rückgabewert die Anzahl der erfolgreich wiedergegebenen Eingabeereignisse an. Wenn dieser Wert Null ist, wurde die Eingabe blockiert.

Mit der SendInput-Funktion wird der aktuelle Zustand der Tastatur nicht zurückgesetzt. Daher können die Tasten die Ereignisse beeinträchtigen, die von dieser Funktion generiert werden, wenn der Benutzer beim Aufrufen dieser Funktion Tasten gedrückt hat. Wenn Sie über mögliche Störungen besorgt sind, überprüfen Sie den Zustand der Tastatur mit der GetAsyncKeyStateFunktion, und korrigieren Sie ihn bei Bedarf.

Sprachen, Gebietsschemas und Tastaturlayouts

Eine Sprache ist eine natürliche Sprache, z. B. Englisch, Französisch und Japanisch. Eine Untersprache ist eine Variante einer natürlichen Sprache, die in einer bestimmten geografischen Region gesprochen wird, z. B. die im Vereinigten Königreich und in den USA gesprochenen englischen Untervarianten. Anwendungen verwenden Werte, die Sprachbezeichner genannt werden, um Sprachen und Untersprachen eindeutig zu identifizieren.

Anwendungen verwenden in der Regel Gebietsschemas, um die Sprache festzulegen, in der Eingaben und Ausgaben verarbeitet werden. Das Festlegen des Gebietsschemas für die Tastatur wirkt sich beispielsweise auf die von der Tastatur generierten Zeichenwerte aus. Das Festlegen des Gebietsschemas für die Anzeige oder den Drucker wirkt sich auf die angezeigten oder gedruckten Symbole aus. In Anwendungen wird das Gebietsschema für eine Tastatur festgelegt, indem Tastaturlayouts geladen und verwendet werden. Sie legen das Gebietsschema für eine Anzeige oder einen Drucker fest, indem sie eine Schriftart auswählen, die das angegebene Gebietsschema unterstützt.

Ein Tastaturlayout gibt nicht nur die physische Position der Tasten auf der Tastatur an, sondern bestimmt auch die Zeichenwerte, die durch Drücken dieser Tasten generiert werden. Jedes Layout identifiziert die aktuelle Eingabesprache und bestimmt, welche Zeichenwerte von welchen Tasten und Tastenkombinationen generiert werden.

Jedes Tastaturlayout verfügt über einen entsprechenden Handle, der das Layout und die Sprache identifiziert. Das niederwertige Wort des Handles ist ein Sprachbezeichner. Das hochwertige Wort ist ein Gerätehandle, das das physische Layout angibt; wenn es Null ist, gibt dies ein physisches Standardlayout an. Der Benutzer kann eine beliebige Eingabesprache einem physischen Layout zuordnen. Beispielsweise kann ein englischsprachiger Benutzer, der sehr gelegentlich auf Französisch arbeitet, die Eingabesprache der Tastatur auf Französisch festlegen, ohne das physische Layout der Tastatur zu ändern. Dies bedeutet, dass der Benutzer Text in Französisch mit dem vertrauten englischen Layout eingeben kann.

Von Anwendungen wird im Allgemeinen nicht erwartet, dass sie Eingabesprachen direkt bearbeiten. Stattdessen richtet der Benutzer Sprach- und Layoutkombinationen ein und wechselt dann zwischen ihnen. Wenn der Benutzer in Text klickt, der mit einer anderen Sprache markiert ist, ruft die Anwendung die ActivateKeyboardLayout-Funktion auf, um das Standardlayout des Benutzers für diese Sprache zu aktivieren. Wenn der Benutzer Text in einer Sprache bearbeitet, die nicht in der aktiven Liste enthalten ist, kann die Anwendung die LoadKeyboardLayout-Funktion mit der Sprache aufrufen, um ein Layout basierend auf dieser Sprache zu erhalten.

Mit der ActivateKeyboardLayout-Funktion wird die Eingabesprache für die aktuelle Aufgabe festgelegt. Der hkl- Parameter kann entweder das Handle für das Tastaturlayout oder ein mit Null erweiterter Sprachbezeichner sein. Tastaturlayouthandles können über die Funktion LoadKeyboardLayout oder GetKeyboardLayoutList abgerufen werden. Mit den Werten HKL_NEXT und HKL_PREV kann ebenfalls die nächste oder vorherige Tastatur ausgewählt werden.

Mit der GetKeyboardLayoutName-Funktion wird der Name des aktiven Tastaturlayouts für den aufrufenden Thread abgerufen. Wenn eine Anwendung das aktive Layout mithilfe der LoadKeyboardLayout-Funktion erstellt, ruft GetKeyboardLayoutName dieselbe Zeichenfolge ab, die zum Erstellen des Layouts verwendet wurde. Andernfalls ist die Zeichenfolge der primäre Sprachbezeichner, der dem Gebietsschema des aktiven Layouts entspricht. Das bedeutet, dass die Funktion möglicherweise nicht unbedingt zwischen verschiedenen Layouts mit derselben primären Sprache unterscheidet, sodass keine spezifischen Informationen zur Eingabesprache zurückgegeben werden können. Mit der GetKeyboardLayout-Funktion kann jedoch die Eingabesprache bestimmt werden.

Mit der LoadKeyboardLayout-Funktion wird ein Tastaturlayout geladen und das Layout für den Benutzer zur Verfügung gestellt. Anwendungen können das Layout mithilfe des Wertes KLF_ACTIVATE sofort für den aktuellen Thread aktivieren. Eine Anwendung kann die Layouts mit dem Wert KLF_REORDER neu anordnen, ohne dass auch der KLF_ACTIVATE-Wert angegeben wird. Anwendungen sollten beim Laden von Tastaturlayouts immer den Wert KLF_SUBSTITUTE_OK verwenden, um sicherzustellen, dass die Einstellung des Benutzers ggf. ausgewählt ist.

Für mehrsprachigen Support stellt die LoadKeyboardLayout-Funktion die Flags KLF_REPLACELANG und KLF_NOTELLSHELL bereit. Das Flag KLF_REPLACELANG weist die Funktion an, ein vorhandenes Tastaturlayout zu ersetzen, ohne die Sprache zu ändern. Der Versuch, ein vorhandenes Layout mit demselben Sprachbezeichner zu ersetzen, ohne jedoch KLF_REPLACELANG anzugeben, ist ein Fehler. Das Flag KLF_NOTELLSHELL verhindert, dass die Funktion die Shell benachrichtigt, wenn ein Tastaturlayout hinzugefügt oder ersetzt wird. Dies ist nützlich bei Anwendungen, die mehrere Layouts in einer aufeinanderfolgenden Reihe von Aufrufen hinzufügen. Dieses Flag sollte bei allen Aufrufen außer dem letzten verwendet werden.

Die UnloadKeyboardLayout-Funktion ist eingeschränkt, da sie die Systemstandardeingabesprache nicht entladen kann. Dadurch wird sichergestellt, dass der Benutzer immer über ein Layout für die Eingabe von Text mit demselben Zeichensatz verfügt, der von der Shell und dem Dateisystem verwendet wird.