AHK中能否判断按键组合输出?及检测当前键盘语言设置
AutoHotkey 按键输出判断与键盘语言检测方案
问题描述
- 初始疑问:能否在AutoHotkey中判断特定按键组合的实际输出结果?比如检测Shift+1是否输出
!(英文键盘下该组合对应此字符),并给出错误示例代码:
x = +1 if (x = !) { Send abc }
- 补充需求:需根据当前键盘语言设置执行不同脚本逻辑——日语键盘时启用某部分功能,英文/德语键盘时启用另一部分。例如按
a键输出a则判定为英/德键盘,输出あ则判定为日语键盘。
解决方案
一、正确判断按键组合的输出结果
你给出的错误代码逻辑有误:+1是AHK的按键标识符,并非实际输出的字符。要获取按键组合的真实输出,可通过临时输入框捕获的方式实现:
; 检测Shift+1的输出是否为! TestShift1Output() { Gui Add, Edit, w100 h20 vTempEdit Gui Show, x0 y0 NoActivate ControlSend, TempEdit, +{1}, A ControlGetText, Output, TempEdit, A Gui Destroy if (Output = "!") { Send abc } }
二、检测当前键盘语言布局(核心需求)
相较于检测按键输出,直接获取系统键盘布局ID的方式更可靠(不受临时输入法状态干扰),具体实现如下:
- 获取当前激活窗口的键盘布局ID
GetCurrentKeyboardLayout() { WinGet, activeWin, ID, A return DllCall("GetKeyboardLayout", "UInt", activeWin, "UInt") }
- 常用语言布局ID参考(可根据实际情况调整)
- 英文(美国):
0x04090409 - 德语:
0x04070407 - 日语:
0x04110411
- 根据布局ID执行对应逻辑
#Persistent SetTimer, CheckKeyboardLayout, 500 ; 每500毫秒检测一次布局变化 CheckKeyboardLayout() { layoutID := GetCurrentKeyboardLayout() ; 英文/德语键盘逻辑 if (layoutID = 0x04090409 || layoutID = 0x04070407) { Hotkey, a, EnglishGermanA, On Hotkey, a, JapaneseA, Off } ; 日语键盘逻辑 else if (layoutID = 0x04110411) { Hotkey, a, JapaneseA, On Hotkey, a, EnglishGermanA, Off } } EnglishGermanA: Send a return JapaneseA: Send あ return GetCurrentKeyboardLayout() { WinGet, activeWin, ID, A return DllCall("GetKeyboardLayout", "UInt", activeWin, "UInt") }
若你坚持要通过按键输出来判断(适配特殊自定义布局),可参考以下捕获a键输出的实现:
CheckAKeyOutput() { Gui Add, Edit, w100 h20 vTempEdit Gui Show, x0 y0 NoActivate ControlSend, TempEdit, a, A ControlGetText, Output, TempEdit, A Gui Destroy if (Output = "a") { ; 英/德键盘对应操作 Send abc } else if (Output = "あ") { ; 日语键盘对应操作 Send あいう } }
内容的提问来源于stack exchange,提问作者Celestial Dragon
相关产品推荐
相关产品推荐

