如何实现AutoHotkey循环按指定按键终止?求有效解决方案
解决AutoHotkey循环终止问题的简便方案
原代码的按键检测逻辑完全无效,只是创建了按键名称数组就直接执行break,根本没有实际检测按键输入。以下是两种简便的修复方案:
方案一:循环内实时检测按键状态
适合对响应速度要求不高的场景,每次循环迭代时检查指定按键是否被按下:
NumpadDiv:: loop { Sleep 1000 ImageSearch, LineX, LineY, 2800, 1270, 2965, 1435, *200 Faster.png if ErrorLevel = 1 { ImageSearch, LineX, LineY, 2800, 1270, 2965, 1435, *200 Slower.png if ErrorLevel = 1 { Send {Space} } } ; 检测指定按键是否被按下,任意一个按下就终止循环 if (GetKeyState("Esc", "P") || GetKeyState("NumpadAdd", "P") || GetKeyState("NumpadSub", "P") || GetKeyState("NumpadMult", "P")) break } Return
方案二:设置终止热键(更可靠)
如果循环内有较长时间的Sleep,方案一可能会延迟响应,这时用热键触发全局变量来终止循环更可靠:
global stopLoop := false ; 绑定终止热键 Esc:: NumpadAdd:: NumpadSub:: NumpadMult:: stopLoop := true Return NumpadDiv:: stopLoop := false ; 启动循环前重置标记 loop { if (stopLoop) ; 检查终止标记 break Sleep 1000 ImageSearch, LineX, LineY, 2800, 1270, 2965, 1435, *200 Faster.png if ErrorLevel = 1 { ImageSearch, LineX, LineY, 2800, 1270, 2965, 1435, *200 Slower.png if ErrorLevel = 1 { Send {Space} } } } Return
说明
- 方案一的
GetKeyState("按键名", "P")用于检测按键是否处于按下状态 - 方案二通过全局变量
stopLoop标记终止状态,热键触发后会立即修改标记,循环下次迭代时就会终止,不受Sleep延迟影响
内容的提问来源于stack exchange,提问作者Seabottom
相关产品推荐
相关产品推荐

