Zurück zur Startseite

Windows 11 Tastaturbelegung Umschalten AutoHotkey

Der Artikel beschreibt ein AutoHotkey v2-Skript für stabiles Alt+Shift-Tastaturbelegungsumschalten in Windows 11. Umgeht den Standardmechanismus über WinAPI, enthält Debounce und UAC-Unterstützung. Vollständiger Code und Einrichtungsanweisungen.

Alt+Shift in Windows 11 reparieren: AutoHotkey-Skript
Advertisement 728x90

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.

Google AdInline article slot

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, ~RAlt usw. lösen bei Drücken aus, ohne zu blockieren (~) und in beliebiger Reihenfolge.
  • Kombinationsprüfung: GetKeyState bestätigt gleichzeitiges Drücken von Alt+Umschalt.
  • Entprellung: Ein Intervall von 150 ms verhindert mehrfache Aufrufe durch Tastenflackern.
  • Layout-Abfrage: GetKeyboardLayout für die threadId des aktiven Fensters gibt das HKL des aktuellen Threads zurück.
  • Umschaltung: PostMessage mit WM_INPUTLANGCHANGEREQUEST (0x50) wendet das Ziel-HKL an.

Deaktivieren des Standard-Hotkeys

Einstellungen → Zeit & Sprache → Eingabe → Erweiterte Tastatureinstellungen → Eingabesprachen-Hotkeys.

Google AdInline article slot

"Eingabesprache wechseln" auswählen → "Tastenkombination ändern" → "Nicht zugewiesen".

Autostart und UAC

  • Eine Skript-Verknüpfung in shell:startup erstellen.
  • 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 GetWindowThreadProcessId und GetKeyboardLayout.
  • 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

Google AdInline article slot
Advertisement 728x90

Weiterlesen