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

