Cambio estable de distribución de teclado en Windows 11 con AutoHotkey v2
En Windows 11, el atajo estándar Alt+Shift a veces falla al cambiar de idioma durante una escritura rápida. Tras un reinicio del sistema, funciona correctamente, pero con el tiempo el mecanismo empieza a fallar. Cambiar mediante Win+Space sigue siendo estable, lo que indica retrasos en el procesamiento del gestor de atajos estándar.
Las recomendaciones habituales—desactivar teclas especiales, reiniciar ctfmon.exe o reinstalar paquetes de idioma—no resuelven el problema en la mayoría de los casos.
Solución basada en AutoHotkey v2
Interceptar la combinación Alt+Shift mediante un script de AutoHotkey v2 que llama directamente a la API de Windows para cambiar la distribución. Esto evita el mecanismo integrado, garantizando un funcionamiento predecible sin fallos.
Ventajas de este enfoque
- Activación rápida incluso con pulsaciones frecuentes.
- Protección contra eventos duplicados.
- Funciona en hilos de ventana activa (distribución específica del hilo).
Una alternativa es Punto Switcher con cambio automático, pero para desarrolladores, el control manual es preferible por su flexibilidad.
Configuración del script
Instala AutoHotkey v2. Crea un archivo LangSwitch.ahk e inserta el código:
#Requires AutoHotkey v2.0
#SingleInstance Force
; Cambiar entre RU y EN con Alt+Shift (en cualquier orden de pulsación)
~*LAlt::TrySwitch()
~*RAlt::TrySwitch()
~*LShift::TrySwitch()
~*RShift::TrySwitch()
TrySwitch() {
static lastTick := 0
if !(GetKeyState("Alt", "P") && GetKeyState("Shift", "P"))
return
; Protección contra activación doble por eventos de tecla simultáneos
now := A_TickCount
if (now - lastTick < 150)
return
lastTick := now
ToggleRuEn()
}
ToggleRuEn() {
static RU := 0x0419
static EN := 0x0409
hwnd := WinActive("A")
if !hwnd
return
; Distribución actual del hilo de la ventana activa
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)
}
Explicación de la lógica del script
- Ganchos de teclas:
~LAlt,~RAlt, etc., se activan al pulsar sin bloquear (~) y en cualquier orden. - Comprobación de combinación:
GetKeyStateconfirma la pulsación simultánea de Alt+Shift. - Antirrebote: Un intervalo de 150 ms evita múltiples llamadas por fluctuaciones de teclas.
- Obtención de distribución:
GetKeyboardLayoutpara el threadId de la ventana activa devuelve el HKL del hilo actual. - Cambio:
PostMessageconWM_INPUTLANGCHANGEREQUEST (0x50)aplica el HKL objetivo.
Desactivar el atajo estándar
Configuración → Hora e idioma → Escritura → Configuración avanzada del teclado → Teclas de acceso rápido de idioma de entrada.
Selecciona "Cambiar idioma de entrada" → "Cambiar secuencia de teclas" → "No asignado".
Inicio automático y UAC
- Crea un acceso directo del script en
shell:startup. - Para aplicaciones UAC: ejecuta mediante
C:\Program Files\AutoHotkey\v2\AutoHotkey64_UIA.exe(uiAccess).
Requiere AutoHotkey instalado en Program Files.
Puntos clave
- El script usa distribución específica del hilo mediante
GetWindowThreadProcessIdyGetKeyboardLayout. PostMessage(0x50)garantiza el cambio sin enfoque de ventana.- Antirrebote de 150 ms minimiza activaciones falsas durante entrada rápida.
- Modo UIAccess resuelve problemas de permisos de administrador.
- Soporte RU/EN: 0x0419 y 0x0409.
— Editorial Team
Aún no hay comentarios.