Volver al inicio

Windows 11 Cambio de Diseño de Teclado AutoHotkey

El artículo describe un script de AutoHotkey v2 para cambio estable de diseño de teclado con Alt+Shift en Windows 11. Omite el mecanismo estándar vía WinAPI, incluye debounce y soporte UAC. Código completo e instrucciones de configuración.

Repara Alt+Shift en Windows 11: script de AutoHotkey
Advertisement 728x90

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.

Google AdInline article slot

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: GetKeyState confirma 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: GetKeyboardLayout para el threadId de la ventana activa devuelve el HKL del hilo actual.
  • Cambio: PostMessage con WM_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.

Google AdInline article slot

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 GetWindowThreadProcessId y GetKeyboardLayout.
  • 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

Google AdInline article slot
Advertisement 728x90

Leer después