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

AutoHotkey:同定时器异步多循环实现问题求助

解决AutoHotkey异步按键循环同步问题

你的问题出在用SetTimer创建两个独立定时器后,仅靠初始sleep延迟启动无法维持异步状态——两个定时器的周期都是1200ms,第一次启动后,它们的触发节奏会逐渐对齐,最终导致1和2同时被按下,完全不符合你想要的错开循环效果。

核心问题分析

你原来的代码逻辑是:

  • 启动gun1定时器(每1200ms触发一次)
  • 延迟600ms后启动gun2定时器(同样每1200ms触发一次)
    但两个定时器的周期相同,经过一轮循环后,gun1的第2次触发(1200ms)和gun2的第1次触发(600ms)之间的间隔会被周期覆盖,最终两者会同步触发,导致按键重叠。

解决方案:用单定时器协调全流程

最可靠的方式是用一个主定时器来控制整个循环逻辑,这样能精准把控1、2按键的按压和停止时机,完全避免同步问题。以下是实现代码:

autofire := false

Numpad0::
    autofire := !autofire
    if (autofire) {
        SetTimer, CycleKeys, 0  ; 立即启动循环,无需初始延迟
    } else {
        SetTimer, CycleKeys, Off
        ; 确保按键松开,避免启停时按键卡住
        SendInput {1 up}{2 up}
    }
Return

CycleKeys:
    ; 按住1键1000ms
    SendInput {1 down}
    Sleep 1000
    SendInput {1 up}
    
    ; 停止1200ms
    Sleep 1200
    
    ; 按住2键1000ms
    SendInput {2 down}
    Sleep 1000
    SendInput {2 up}
    
    ; 停止1200ms
    Sleep 1200
Return

如果你需要同时按住1和2的版本

如果你的需求是同时按住1和2保持1000ms,然后松开停止1200ms,可以修改循环逻辑如下:

autofire := false

Numpad0::
    autofire := !autofire
    if (autofire) {
        SetTimer, CycleKeys, 0
    } else {
        SetTimer, CycleKeys, Off
        SendInput {1 up}{2 up}
    }
Return

CycleKeys:
    ; 同时按住1和2键1000ms
    SendInput {1 down}{2 down}
    Sleep 1000
    SendInput {1 up}{2 up}
    
    ; 停止1200ms
    Sleep 1200
Return

为什么这个方案有效?

  • 单个定时器负责整个循环流程,所有按键操作和延迟都在同一个执行链中,完全不会出现同步问题
  • 启停时主动松开按键,避免因中途停止导致按键一直处于按下状态
  • 逻辑清晰,后续修改时机(比如调整按压/停止时长)非常方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:38