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í.
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,~RAltatd. reagují na stisknutí bez blokování (~) a v libovolném pořadí. - Kontrola kombinace:
GetKeyStatepotvrzuje 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í:
GetKeyboardLayoutpro threadId aktivního okna vrací HKL aktuálního vlákna. - Změna:
PostMessagesWM_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.
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
GetWindowThreadProcessIdaGetKeyboardLayout. 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
Zatím žádné komentáře.