如何在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
相关产品推荐
相关产品推荐

