Logitech Lua 脚本实现高精度 Sleep

这是我尝试制作 Logitech 高精度延迟的过程,精度可以到 1ms。

为什么需要高精度延迟?因为从 Win10 版本 2004 开始,Logitech 的 Sleep(1) 实际上会延迟 15.6ms,因此您可能需要更精确的 Sleep() 来保留旧脚本的原始行为(Win10 1909)。

function Sleep3(time)
    local a = GetRunningTime()
    while GetRunningTime()-a < time do
    end
end

Sleep3() 的精度是否真的等于 1ms?

原文链接 https://stackoverflow.com/questions/70795608

点赞
stackoverflow用户1847592
stackoverflow用户1847592

Logitech的GetRunningTime()函数只是调用了WinAPI函数GetTickCount

从文档中可以看到:

GetTickCount 函数的分辨率受到系统计时器分辨率的限制,这通常在10毫秒到16毫秒之间。

换句话说,GetRunningTime()返回的数值不是连续的整数。

当您在循环中调用GetRunningTime()时,您将收到以下类似的结果:

0,0,0,...,0,15,15,15,...,15,31,31,..,31,46,46,...

这意味着它不能使用GetRunningTime()来实现1毫秒的精度延迟。

Sleep3()的实际精度是15毫秒,就像通常的Sleep()一样。

2022-01-21 09:05:59
stackoverflow用户17989086
stackoverflow用户17989086
# 函数
function OnEvent(event,arg)
    # 如果鼠标按键按下并且是滚轮向上滚动
    if event == "MOUSE_BUTTON_PRESSED" and arg == 4 then
        a = GetRunningTime()  # 记录当前时间
        for i = 1,1000,1 do
            Sleep(1)  # 使程序休眠1毫秒
        end
        OutputLogMessage((GetRunningTime() - a) / 1000)  # 输出执行时间
    end
end
2022-01-25 08:00:38