如何在 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 命令之间添加延迟?的主要内容,如果未能解决你的问题,请参考以下文章

notepad++中如何让autohotkey 代码高亮

autohotkey 如何设置多键位和一些组合键

无论如何让热键激活没有 AutoHotkey 的应用程序?

如何在 AutoHotkey 中传播变量?

使用 AutoHotKey ControlSend 访问 MDI 工具栏菜单

如何在 AutoHotKey 脚本中使用“或”?