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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:42:19