LUA的MouseMoveRelative上的Sleep函数有问题

问题描述

获得一个新的驱动器并安装了新的Windows。

在使用旧操作系统之前,我可以使用“睡眠”功能使“ MoveMouseRelative”正常工作。

我已经创建了一个函数,可以移动鼠标调用它多少次,让它“移动”

以及每次“移动”之间的毫秒数示例:(效果很好)

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

n

如果我在每个“ MoveMouseRelative”之间设置“ Sleep(1)”,它会像“ Sleep(50)”一样移动,我无法弄清楚为什么。

如果我以1ms的50次移动来调用它,则需要2.5秒而不是50ms的时间来完成

在装有旧操作系统安装(同一台PC)的旧驱动器上,我通常需要50毫秒才能使用

就像软件不会让我使用1毫秒这样的小毫秒。

尝试

LGHUB重新安装

停用AV

禁用Windows上的功能

从运行良好的操作系统中复制LGHUB文件

使用configs(LocalAppdata)复制LGHUB文件

我的鼠标是G502 SE

帮助?

解决方法

TL; DR:
Sleep(1)的行为不稳定,不应使用。
Sleep()的精度比您想象的要差得多。


长答案:

LGHUB脚本中的

Sleep()在内部调用WinAPI函数Sleep

文档摘录:

经过睡眠间隔后,线程即可运行。请注意,不能保证就绪线程可以立即运行。因此,线程可能要等到睡眠间隔过后的一段时间才能运行。

系统时钟以固定速率“滴答”。如果dwMilliseconds小于系统时钟的分辨率,则线程的睡眠时间可能少于指定的时间长度。如果dwMilliseconds大于1个刻度但小于2个刻度,则等待时间可以介于1个和2个刻度之间,依此类推。

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

从上面的文档中可以看到,Sleep()函数的精度为一个“滴答”,因此,Sleep(1)的行为在设计上是不稳定的。