如何在AutoHotkey v1中为KeyWait或GetKeyState使用变量?
解决AutoHotkey v1热键重绑定的按键捕获问题
首先,你当前的核心问题是未正确实现按键捕获逻辑,导致后续的KeyWait、GetKeyState无法正常工作。以下是具体的修正方案:
1. 正确实现按键捕获函数
你代码里的GetKeyPress(keys)没有具体实现,这是关键缺失。可以用循环监听的方式捕获用户按下的摇杆/键盘按键:
rebind: ; GUI触发的重绑定按钮 ; 提示用户按下要绑定的按键 MsgBox, 请按下要绑定的按键(按ESC取消) ; 循环监听按键 Loop { ; 遍历所有可能的摇杆按键(Joy1到Joy32,可根据需求调整) Loop, 32 { Key := "Joy" A_Index GetKeyState, State, %Key%, P ; 检测按键是否按下 if (State = "D") { input := Key goto, CaptureDone ; 捕获到按键,跳出循环 } } ; 同时监听键盘按键(可选) GetKeyState, State, Escape, P if (State = "D") { MsgBox, 已取消绑定 return } Sleep, 10 ; 降低CPU占用 } CaptureDone: ; 等待按键松开,避免重复触发 KeyWait, %input% ; 保存到变量并设置热键 variables1through5 := input MsgBox, 你按下了 %input% ; 先关闭原有热键(如果存在) Hotkey, %variables1through5%, hotkey1through5, Off ; 开启新热键 Hotkey, %input%, hotkey1through5, On return ; 测试用的热键执行函数 hotkey1through5: MsgBox, 重绑定的热键触发了! return
2. 修复KeyWait的问题
你之前的KeyWait, %variable%失效,大概率是因为variable里的按键名称格式错误(比如摇杆按键必须是Joy1、JoyX这类标准格式)。确保捕获到的input是AutoHotkey识别的标准按键名称,再传入KeyWait。
另外,KeyWait默认是等待按键松开,如果要等待按下,需要加D参数:KeyWait, %input%, D。
3. 修复GetKeyState的问题
你之前的写法逻辑有误:
GetKeyState, outputthingy, %variable% if (outputthingy = "U"){ dothings }
- GetKeyState不加第三个参数时,返回的是按键的逻辑状态(比如切换键的状态),不是物理按下/松开状态。
- 要检测物理松开,应该用
GetKeyState, outputthingy, %variable%, P,此时返回U表示松开,D表示按下。但通常我们需要的是检测按键按下的动作,所以逻辑应该反过来:
GetKeyState, outputthingy, %input%, P if (outputthingy = "D") { ; 按键按下时执行操作 }
关键注意事项
- 摇杆按键的标准命名是
Joy1到Joy32(对应摇杆的各个按钮),JoyX/JoyY对应摇杆轴,JoyR/JoyU等对应POV方向。 - 重绑定时要先关闭原有热键,避免冲突。
- 捕获按键时加入取消逻辑(比如ESC),提升用户体验。
内容的提问来源于stack exchange,提问作者thingerthing
相关产品推荐
相关产品推荐

