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.
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 :
GetKeyStateconfirme 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 :
GetKeyboardLayoutpour le threadId de la fenêtre active renvoie le HKL du thread actuel. - Changement :
PostMessageavecWM_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.
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
GetWindowThreadProcessIdetGetKeyboardLayout. 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
Aucun commentaire pour le moment.