返回首页

Windows 11 键盘布局切换 AutoHotkey

本文描述了一个用于 Windows 11 中稳定 Alt+Shift 键盘布局切换的 AutoHotkey v2 脚本。通过 WinAPI 绕过标准机制,包括防抖和 UAC 支持。完整代码和设置说明。

修复 Windows 11 中的 Alt+Shift:AutoHotkey 脚本
Advertisement 728x90

Windows 11 中基于 AutoHotkey v2 的稳定键盘布局切换方案

在 Windows 11 中,标准的 Alt+Shift 快捷键在快速打字时偶尔会错过语言切换。系统重启后,该功能可以正常工作,但随着时间的推移,切换机制开始失效。通过 Win+Space 切换则始终保持稳定,这表明标准热键处理程序在处理时存在延迟。

常见的建议——如禁用粘滞键、重启 ctfmon.exe 或重新安装语言包——在大多数情况下并不能解决问题。

基于 AutoHotkey v2 的解决方案

通过 AutoHotkey v2 脚本拦截 Alt+Shift 组合键,直接调用 Windows API 来更改布局。这种方法绕过了内置机制,确保操作可预测且不会错过切换。

Google AdInline article slot

此方法的优势

  • 即使频繁按键也能快速触发。
  • 防止重复事件。
  • 在活动窗口线程中工作(线程特定布局)。

另一种选择是使用 Punto Switcher 进行自动切换,但对于开发者而言,由于灵活性考虑,手动控制更为可取。

脚本设置

安装 AutoHotkey v2。创建文件 LangSwitch.ahk 并插入以下代码:

#Requires AutoHotkey v2.0
#SingleInstance Force
; 使用 Alt+Shift 在 RU 和 EN 之间切换(任意按键顺序)
~*LAlt::TrySwitch()
~*RAlt::TrySwitch()
~*LShift::TrySwitch()
~*RShift::TrySwitch()
TrySwitch() {
    static lastTick := 0
    if !(GetKeyState("Alt", "P") && GetKeyState("Shift", "P"))
        return
    ; 防止同时按键事件导致重复触发
    now := A_TickCount
    if (now - lastTick < 150)
        return
    lastTick := now
    ToggleRuEn()
}
ToggleRuEn() {
    static RU := 0x0419
    static EN := 0x0409
    hwnd := WinActive("A")
    if !hwnd
        return
    ; 获取活动窗口线程的当前布局
    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)
}

脚本逻辑解析

  • 按键钩子~LAlt~RAlt 等在不阻塞(~)的情况下触发按键,且支持任意顺序。
  • 组合键检查GetKeyState 确认 Alt+Shift 同时按下。
  • 防抖处理:150 毫秒间隔防止按键抖动导致多次调用。
  • 获取布局GetKeyboardLayout 针对活动窗口的 threadId 返回当前线程的 HKL。
  • 切换布局PostMessage 配合 WM_INPUTLANGCHANGEREQUEST (0x50) 应用目标 HKL。

禁用标准热键

设置 → 时间和语言 → 输入 → 高级键盘设置 → 输入语言热键。

Google AdInline article slot

选择“切换输入语言” → “更改按键顺序” → “未分配”。

自动启动和 UAC

  • shell:startup 中创建脚本快捷方式。
  • 对于 UAC 应用程序:通过 C:\Program Files\AutoHotkey\v2\AutoHotkey64_UIA.exe (uiAccess) 运行。

需要将 AutoHotkey 安装在 Program Files 目录中。

关键要点

  • 脚本通过 GetWindowThreadProcessIdGetKeyboardLayout 使用线程特定布局。
  • PostMessage(0x50) 确保无需窗口焦点即可切换。
  • 150 毫秒的防抖处理最小化快速输入时的误触发。
  • UIAccess 模式解决管理员权限问题。
  • RU/EN 支持:0x0419 和 0x0409。

— Editorial Team

Google AdInline article slot
Advertisement 728x90

继续阅读