关于 LUA 中 MouseMoveRelative 函数 Sleep() 的问题

我换了一块新硬盘,并安装了全新的 Windows 操作系统。

在旧系统中,我可以使用 "Sleep" 函数使 "MoveMouseRelative" 像自然运动一样工作。

我创建了一个函数,调用它时可以移动鼠标多少次,示例中每次“移动”之间的毫秒数:(效果良好)

function _move(x, range, time, range2)
    for i = 1, x do
    MoveMouseRelative(range,range2)
    Sleep(time)
    end
end

如果我在每个 "MoveMouseRelative" 之间设置 "Sleep(1)",它的移动就像有 "Sleep(50)" 一样,我不知道为什么。

如果我每次移动鼠标 50 次,每次的时间间隔为 1 毫秒,则需要 2.5 秒钟才能完成,而不是 50 毫秒。

在我的旧硬盘上且在旧操作系统上(同一台计算机),我可以正常使用,并且只需要 50 毫秒。

就像软件不允许我使用小于等于 1 毫秒的延迟时间。

我尝试了

重新安装 LGHUB

停用 AV

禁用 Windows 上的某些东西

从正常工作的 OS 复制 LGHUB 文件夹

复制具有配置的 LGHUB 文件夹(LocalAppdata)

我的鼠标是 G502 SE

求助?

点赞
用户1847592
用户1847592

TL;DR:

Sleep(1) 的行为不稳定,不应使用。

Sleep() 的精度比您想象的要差得多。


长篇回答:

LGHUB 脚本中的 Sleep() 在内部调用 WinAPI 函数 Sleep

从文件中摘录出来的一些文档内容:

在休眠间隔经过后,线程准备运行。请注意,准备好的线程不能保证立即运行。因此,线程可能要在休眠间隔过后的一段时间才能运行。

系统时钟以恒定速率“滴答”地运行。如果 dwMilliseconds 小于系统时钟的分辨率,则线程可能会休眠少于指定长度的时间。如果 dwMilliseconds 大于一个滴答但小于二个滴答,则等待时间可以在一到二个滴答之间,以此类推。

这里的“滴答”是“时间片”长度,在我的 Windows 上为 15ms(但在其他 Windows 版本上可能是 10ms)。

正如您从上面的文档中看到的那样,Sleep() 函数的精度为一“滴答”,因此 Sleep(1) 的行为从设计上来说是不稳定的。

2020-10-28 19:36:33