Zpět na domů

Přepínání rozložení Windows 11 AutoHotkey

Článek popisuje skript AutoHotkey v2 pro stabilní přepínání rozložení Alt+Shift v Windows 11. Obchází standardní mechanismus přes WinAPI, zahrnuje debounce a podporu UAC. Kompletní kód a návod na nastavení.

Oprava Alt+Shift v Windows 11: AutoHotkey skript
Advertisement 728x90

Stabilní přepínání klávesnicové rozložení v Windows 11 pomocí AutoHotkey v2

Ve Windows 11 standardní kombinace Alt+Shift někdy přeskočí přepnutí jazyka při rychlém psaní. Po restartu systému vše funguje správně, ale po čase se mechanismus začne chybovat. Přepínání pomocí Win+Mezerník zůstává stabilní, což ukazuje na zpoždění ve zpracování hotkey'ů standardního handleru.

Běžná doporučení – vypnutí lepivých kláves, restart ctfmon.exe nebo přeinstalace jazykových balíčků – ve většině případů problém neřeší.

Řešení založené na AutoHotkey v2

Zachytíme kombinaci Alt+Shift pomocí skriptu AutoHotkey v2, který přímo volá API Windows pro změnu rozložení. Tím obejdeme vestavěný mechanismus a zajistíme předvídatelnou funkčnost bez přeskočení.

Google AdInline article slot

Výhody přístupu

  • Rychlá reakce i při častých stisknutích.
  • Ochrana proti duplicitním událostem.
  • Funguje ve vláknech aktivního okna (thread-specific layout).

Alternativou je Punto Switcher s automatickým přepínáním, ale pro vývojáře je ruční ovládání preferováno kvůli flexibilitě.

Nastavení skriptu

Nainstalujte AutoHotkey v2. Vytvořte soubor LangSwitch.ahk a vložte kód:

#Requires AutoHotkey v2.0
#SingleInstance Force
; Přepínání mezi RU a EN pomocí Alt+Shift (v libovolném pořadí stisknutí)
~*LAlt::TrySwitch()
~*RAlt::TrySwitch()
~*LShift::TrySwitch()
~*RShift::TrySwitch()
TrySwitch() {
    static lastTick := 0
    if !(GetKeyState("Alt", "P") && GetKeyState("Shift", "P"))
        return
    ; Ochrana proti dvojitému spuštění při současných událostech kláves
    now := A_TickCount
    if (now - lastTick < 150)
        return
    lastTick := now
    ToggleRuEn()
}
ToggleRuEn() {
    static RU := 0x0419
    static EN := 0x0409
    hwnd := WinActive("A")
    if !hwnd
        return
    ; Aktuální rozložení vlákna aktivního okna
    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)
}

Rozbor logiky skriptu

  • Háky kláves: ~LAlt, ~RAlt atd. reagují na stisknutí bez blokování (~) a v libovolném pořadí.
  • Kontrola kombinace: GetKeyState potvrzuje současné stisknutí Alt+Shift.
  • Debounce: Interval 150 ms zabraňuje vícenásobným voláním při jitteru kláves.
  • Získání rozložení: GetKeyboardLayout pro threadId aktivního okna vrací HKL aktuálního vlákna.
  • Změna: PostMessage s WM_INPUTLANGCHANGEREQUEST (0x50) aplikuje cílový HKL.

Vypnutí standardního hotkey

Nastavení → Čas a jazyk → Psaní → Pokročilé nastavení klávesnice → Klávesové zkratky pro vstupní jazyky.

Google AdInline article slot

Vyberte „Přepnout vstupní jazyk“ → „Změnit klávesovou zkratku“ → „Nepřiřazeno“.

Automatické spuštění a UAC

  • Vytvořte zástupce skriptu v shell:startup.
  • Pro práci v UAC-aplikacích: spuštění přes C:\Program Files\AutoHotkey\v2\AutoHotkey64_UIA.exe (uiAccess).

Vyžaduje instalaci AutoHotkey v Program Files.

Co je důležité

  • Skript používá thread-specific layout přes GetWindowThreadProcessId a GetKeyboardLayout.
  • PostMessage(0x50) zaručuje změnu bez fokusu okna.
  • Debounce 150 ms minimalizuje falešná spuštění při rychlém psaní.
  • UIAccess-režim řeší problémy s administrátorskými právy.
  • Podpora RU/EN: 0x0419 a 0x0409.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Číst dál