Stabile Tastaturlayout-Umschaltung in Windows 11 mit AutoHotkey v2
In Windows 11 verpasst die Standardtastenkombination Alt+Umschalt manchmal Sprachwechsel bei schnellem Tippen. Nach einem Systemneustart funktioniert sie korrekt, aber mit der Zeit beginnt der Mechanismus zu versagen. Das Umschalten über Win+Leertaste bleibt stabil, was auf Verzögerungen in der Verarbeitung des Standard-Hotkey-Handlers hindeutet.
Gängige Empfehlungen – wie das Deaktivieren der Einrastfunktionen, Neustarten von ctfmon.exe oder Neuinstallation von Sprachpaketen – lösen das Problem in den meisten Fällen nicht.
Lösung basierend auf AutoHotkey v2
Die Alt+Umschalt-Kombination wird über ein AutoHotkey v2-Skript abgefangen, das direkt die Windows-API aufruft, um das Layout zu ändern. Dies umgeht den eingebauten Mechanismus und gewährleistet einen vorhersehbaren Betrieb ohne Ausfälle.
Vorteile dieses Ansatzes
- Schnelles Auslösen auch bei häufigen Drücken.
- Schutz vor doppelten Ereignissen.
- Funktioniert in aktiven Fenster-Threads (threadspezifisches Layout).
Eine Alternative ist Punto Switcher mit automatischer Umschaltung, aber für Entwickler ist die manuelle Steuerung aufgrund der Flexibilität vorzuziehen.
Skript-Einrichtung
AutoHotkey v2 installieren. Eine Datei LangSwitch.ahk erstellen und den Code einfügen:
#Requires AutoHotkey v2.0
#SingleInstance Force
; Wechsel zwischen RU und EN mit Alt+Umschalt (in beliebiger Drückreihenfolge)
~*LAlt::TrySwitch()
~*RAlt::TrySwitch()
~*LShift::TrySwitch()
~*RShift::TrySwitch()
TrySwitch() {
static lastTick := 0
if !(GetKeyState("Alt", "P") && GetKeyState("Shift", "P"))
return
; Schutz vor Doppelauslösung durch gleichzeitige Tastenereignisse
now := A_TickCount
if (now - lastTick < 150)
return
lastTick := now
ToggleRuEn()
}
ToggleRuEn() {
static RU := 0x0419
static EN := 0x0409
hwnd := WinActive("A")
if !hwnd
return
; Aktuelles Layout des Threads des aktiven Fensters
threadId := DllCall("GetWindowThreadProcessId", "Ptr", hwnd, "UInt*", 0, "UInt")
hkl := DllCall("GetKeyboardLayout", "UInt", threadId, "UPtr")
langId := hkl & 0xFFFF
target := (langId = RU) ? EN : RU
targetHKL := (target << 16) | target
; WM_INPUTLANGCHANGEREQUEST
DllCall("PostMessage", "Ptr", hwnd, "UInt", 0x50, "Ptr", 0, "Ptr", targetHKL)
}
Skript-Logik im Detail
- Tastenhooks:
~LAlt,~RAltusw. lösen bei Drücken aus, ohne zu blockieren (~) und in beliebiger Reihenfolge. - Kombinationsprüfung:
GetKeyStatebestätigt gleichzeitiges Drücken von Alt+Umschalt. - Entprellung: Ein Intervall von 150 ms verhindert mehrfache Aufrufe durch Tastenflackern.
- Layout-Abfrage:
GetKeyboardLayoutfür die threadId des aktiven Fensters gibt das HKL des aktuellen Threads zurück. - Umschaltung:
PostMessagemitWM_INPUTLANGCHANGEREQUEST (0x50)wendet das Ziel-HKL an.
Deaktivieren des Standard-Hotkeys
Einstellungen → Zeit & Sprache → Eingabe → Erweiterte Tastatureinstellungen → Eingabesprachen-Hotkeys.
"Eingabesprache wechseln" auswählen → "Tastenkombination ändern" → "Nicht zugewiesen".
Autostart und UAC
- Eine Skript-Verknüpfung in
shell:startuperstellen. - Für UAC-Anwendungen: über
C:\Program Files\AutoHotkey\v2\AutoHotkey64_UIA.exe(uiAccess) ausführen.
Erfordert AutoHotkey-Installation in Program Files.
Wichtige Punkte
- Das Skript verwendet threadspezifisches Layout über
GetWindowThreadProcessIdundGetKeyboardLayout. PostMessage(0x50)gewährleistet Umschaltung ohne Fensterfokus.- Entprellung von 150 ms minimiert Fehlauslösungen bei schneller Eingabe.
- UIAccess-Modus löst Probleme mit Administratorberechtigungen.
- RU/EN-Unterstützung: 0x0419 und 0x0409.
— Editorial Team
Noch keine Kommentare.