如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?
Posted
技术标签:
【中文标题】如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?【英文标题】:How do I add a delay between SendInput commands in AutoHotkey? 【发布时间】:2017-09-20 15:28:48 【问题描述】:我有一个使用 SendInput
的 AutoHotkey 脚本,它发送 MouseClick
命令的速度太快,我的程序无法处理。我的脚本将发送一个鼠标点击来聚焦输入字段,然后在字段完成聚焦之前开始输入。
我尝试使用SetKeyDelay
让我的脚本运行得慢一点,但这不适用于SendInput
。
注意:SendInput 不遵守 SetKeyDelay;在该模式下,击键之间没有延迟。当 SendMode Input 生效时,Send 也是如此。Documentation for SetKeyDelay
我目前的解决方法是在每次输入后使用睡眠命令,但这并不理想。
SendMode Input
F1::
MouseClick, left, 61, 50 ; select title field
sleep 100 ; artificial delay to prevent misfocused inputs
SendInput %user_input%Enter ; enter job title
sleep 100 ; artificial delay
MouseClick, left, 67, 408 ; select job
sleep 100 ; artificial delay
Return
理想情况下,我想要一个更优雅的解决方案,在每个 SendInput 命令之间添加延迟,而无需每次手动使用睡眠命令。
如何在 AutoHotkey 中的 SendInput 命令之间添加延迟而不重复使用睡眠?
【问题讨论】:
【参考方案1】:尝试使用SendPlay 而不是SendInput。
这会在每次点击后以 100 毫秒的延迟发送文本和鼠标点击
user_input := "hello world"
SetMouseDelay 100, Play
SendPlay Click 61,50%user_input%enterclick 67,408
来自documentation for SendPlay。
SendPlay
注意:如果启用了 UAC,即使脚本以管理员身份运行,SendPlay 也可能完全没有效果。如需更多信息,请参阅FAQ。
与SendInput 一样,SendPlay 的击键不会与用户键入的击键穿插。因此,如果用户在 SendPlay 期间碰巧键入了某些内容,这些击键将被推迟到之后。
虽然 SendPlay 比 SendInput 慢很多,但通常比传统的SendEvent 模式快(即使KeyDelay 为-1)。
SendPlay 不使用 SetKeyDelay 和 SetMouseDelay 的标准设置。相反,它默认为完全没有延迟,可以按照以下示例进行更改:
SetKeyDelay, 0, 10, Play ; Note that both 0 and -1 are the same in SendPlay mode. SetMouseDelay, 10, Play
【讨论】:
我的理解是 SendInput 不会尝试协调键盘和鼠标事件或延迟,因此它可以利用没有此类支持的快速操作系统调用。以上是关于如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?的主要内容,如果未能解决你的问题,请参考以下文章