Retour à l'accueil

Changement de disposition de clavier Windows 11 AutoHotkey

L'article décrit un script AutoHotkey v2 pour un changement stable de disposition de clavier Alt+Shift dans Windows 11. Contourne le mécanisme standard via WinAPI, inclut debounce et support UAC. Code complet et instructions de configuration.

Corriger Alt+Shift dans Windows 11 : script AutoHotkey
Advertisement 728x90

Changement stable de disposition clavier sous Windows 11 avec AutoHotkey v2

Sous Windows 11, le raccourci standard Alt+Maj échoue parfois à changer de langue lors d'une frappe rapide. Après un redémarrage du système, il fonctionne correctement, mais avec le temps, le mécanisme commence à défaillir. Le changement via Win+Espace reste stable, ce qui indique des délais dans le traitement du raccourci standard.

Les recommandations courantes — désactiver les touches rémanentes, redémarrer ctfmon.exe ou réinstaller les packs de langue — ne résolvent pas le problème dans la plupart des cas.

Solution basée sur AutoHotkey v2

Intercepter la combinaison Alt+Maj via un script AutoHotkey v2 qui appelle directement l'API Windows pour changer la disposition. Cela contourne le mécanisme intégré, garantissant un fonctionnement prévisible sans échec.

Google AdInline article slot

Avantages de cette approche

  • Déclenchement rapide même avec des pressions fréquentes.
  • Protection contre les événements en double.
  • Fonctionne dans les threads de fenêtre active (disposition spécifique au thread).

Une alternative est Punto Switcher avec changement automatique, mais pour les développeurs, le contrôle manuel est préférable en raison de sa flexibilité.

Configuration du script

Installez AutoHotkey v2. Créez un fichier LangSwitch.ahk et insérez le code :

#Requires AutoHotkey v2.0
#SingleInstance Force
; Changer entre RU et EN avec Alt+Maj (dans n'importe quel ordre d'appui)
~*LAlt::TrySwitch()
~*RAlt::TrySwitch()
~*LShift::TrySwitch()
~*RShift::TrySwitch()
TrySwitch() {
    static lastTick := 0
    if !(GetKeyState("Alt", "P") && GetKeyState("Shift", "P"))
        return
    ; Protection contre le double déclenchement dû à des événements de touche simultanés
    now := A_TickCount
    if (now - lastTick < 150)
        return
    lastTick := now
    ToggleRuEn()
}
ToggleRuEn() {
    static RU := 0x0419
    static EN := 0x0409
    hwnd := WinActive("A")
    if !hwnd
        return
    ; Disposition actuelle du thread de la fenêtre active
    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)
}

Explication de la logique du script

  • Crochets de touches : ~LAlt, ~RAlt, etc., se déclenchent à l'appui sans bloquer (~) et dans n'importe quel ordre.
  • Vérification de la combinaison : GetKeyState confirme l'appui simultané d'Alt et Maj.
  • Anti-rebond : Un intervalle de 150 ms empêche les appels multiples dus aux tremblements de touches.
  • Obtention de la disposition : GetKeyboardLayout pour le threadId de la fenêtre active renvoie le HKL du thread actuel.
  • Changement : PostMessage avec WM_INPUTLANGCHANGEREQUEST (0x50) applique le HKL cible.

Désactivation du raccourci standard

Paramètres → Heure et langue → Saisie → Paramètres avancés du clavier → Raccourcis de langue de saisie.

Google AdInline article slot

Sélectionnez "Changer de langue de saisie" → "Modifier la séquence de touches" → "Non attribué".

Démarrage automatique et UAC

  • Créez un raccourci du script dans shell:startup.
  • Pour les applications UAC : exécutez via C:\Program Files\AutoHotkey\v2\AutoHotkey64_UIA.exe (uiAccess).

Nécessite AutoHotkey installé dans Program Files.

Points clés

  • Le script utilise la disposition spécifique au thread via GetWindowThreadProcessId et GetKeyboardLayout.
  • PostMessage(0x50) garantit le changement sans focus de fenêtre.
  • L'anti-rebond de 150 ms minimise les déclenchements intempestifs lors d'une saisie rapide.
  • Le mode UIAccess résout les problèmes d'autorisations administrateur.
  • Prise en charge RU/EN : 0x0419 et 0x0409.

— Editorial Team

Google AdInline article slot
Advertisement 728x90

Lire ensuite