You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AutoHotkey中获取当前键盘布局(语言设置)实现布局适配脚本

AutoHotkey 响应键盘布局切换的实现方案

你需要通过Windows系统API获取当前活跃窗口对应的键盘布局语言标识,以下是完整实现步骤:

1. 封装获取键盘布局语言的函数

将以下代码加入你的AHK脚本开头,该函数会返回标准的语言区域标签(如en-US、de-DE、zh-CN等):

GetKeyboardLang() {
    ; 获取当前活动窗口所属的线程ID
    ThreadID := DllCall("GetWindowThreadProcessId", "Ptr", WinActive("A"), "UInt", 0)
    ; 获取该线程对应的键盘布局ID
    LayoutID := DllCall("GetKeyboardLayout", "UInt", ThreadID, "Ptr")
    ; 提取低位的语言ID
    LangID := LayoutID & 0xFFFF
    ; 读取对应的ISO标准语言区域名称
    VarSetCapacity(LangName, 85 * 2, 0)
    DllCall("GetLocaleInfo", "UInt", LangID, "UInt", 0x00000059, "Str", LangName, "Int", 85)
    return LangName
}

2. 实现上下文敏感热键

直接在#If指令后调用上述函数即可实现不同键盘布局下的热键区分,注意#If后接表达式不需要用百分号包裹变量/函数,正确写法如下:

; 英文键盘布局下触发
#If GetKeyboardLang() = "en-US"
a::
MsgBox, 我在英文键盘下按了a
return

; 德语键盘布局下触发
#If GetKeyboardLang() = "de-DE"
a::
MsgBox, 我在德语键盘下按了a
return

; 结束上下文敏感判定,避免影响后续所有热键
#If

3. 调试方法

如果你不确定自己当前键盘对应的语言标签值,可以加一个临时快捷键打印结果:

F1::MsgBox, 当前键盘布局语言:% GetKeyboardLang()

注意事项

  • 不同区域的同语言键盘标签可能有差异,比如德语键盘常见标签为de-DE而非你示例中写的de-US,建议先用上面的调试方法确认你的键盘对应标签值。
  • 普通使用场景下该函数的性能足够,如果你有高频触发的热键,可以监听系统输入法切换事件缓存语言值,减少API调用次数。

内容的提问来源于stack exchange,提问作者Cadoiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:48:03