我在玩SendInput()的鼠标运动,它需要INPUT结构。我使用的是相对运动,在关于这个结构的文档中,它在注释中说:
鼠标相对运动受鼠标速度和双鼠标阈值的影响.
所以我的问题是,这是如何计算的(公式是什么)?没有具体说明。
我试过寻找,但没有运气。希望有人知道。
我需要这些信息,因为我试图使鼠标运动独立于实际的Windows光标速度。在文档中,它清楚地表示这受到这些值的影响。
发布于 2020-03-02 03:48:55
鼠标相对运动受鼠标速度和双鼠标阈值的影响.所以我的问题是,这是如何计算的(公式是什么)?没有具体说明。
如何计算在结构文件中说明如下:
系统对指定的相对鼠标运动进行两次测试。如果指定的沿x或y轴的距离大于第一个鼠标阈值,且鼠标速度不是零,则系统会将距离加倍。如果沿x或y轴的指定距离大于第二个鼠标阈值,且鼠标速度等于2,则系统将应用第一个阈值测试产生的距离加倍。因此,系统可以将指定的相对鼠标沿x或y轴的运动乘以4倍。
例如,为了防止系统将指定的相对鼠标沿x或y轴的移动加倍或乘以指定的相对鼠标移动4倍,您可以使指定的相对鼠标移动小于或等于第一个鼠标阈值,并将鼠标速度设置为零。请测试这是否符合您的要求。
至于UIPI限制,因为您的应用程序已经作为管理员权限运行,所以它具有很高的强制级别,因此除非目标应用程序以系统完整性水平的形式运行,否则这不会是一个问题。
并且没有UIPI限制,您还可以使用绝对值,它不受鼠标速度和双鼠标阈值的影响。
发布于 2022-05-31 11:15:19
来自函数的文档
鼠标的相对运动取决于鼠标速度和加速度的设置。最终用户使用控制面板中的鼠标应用程序设置这些值。应用程序使用SystemParametersInfo函数获取并设置这些值。
我相信这些问题涉及以下两个问题:
SPI_GETMOUSE (= 0x0003)
检索两个鼠标阈值和鼠标加速。pvParam参数必须指向接收这些值的三个整数数组。这三个值是第一个阈值、第二个阈值和加速值。
SPI_GETMOUSESPEED ( = 0x0070)
检索当前鼠标速度。鼠标速度根据鼠标移动的距离决定指针移动的距离。pvParam参数必须指向一个整数,该整数接收的值介于1(最慢)到20 (最快)之间。默认值为10。这似乎遵循了一个有点奇怪的公式来扩展运动。
当应用加速度时,系统对指定的相对鼠标运动进行两次测试。如果指定的沿x或y轴的距离大于第一个鼠标阈值,且鼠标加速级别不是零,操作系统就会将距离加倍。如果沿x轴或y轴的指定距离大于第二个鼠标阈值,且鼠标加速级别等于2,操作系统将应用第一个阈值测试产生的距离加倍。因此,操作系统可以将相对指定的鼠标沿x轴或y轴的运动乘以4倍。
不幸的是,我无法破解这个问题(当在“鼠标属性”中启用“增强指针精度”时,它适用)。它显然并不仅仅是价值的两倍。
对于比阈值高三倍的值,缩放似乎是准确的(它使您的输入加倍),但除此之外,2的因子一直在增长。这些测试的鼠标速度为10:
更糟糕的是,速度为20 (假设后面描述的速度缩放是相同的):
一旦应用了加速,系统将按所需的鼠标速度缩放结果值。鼠标速度可以从1(最慢)到20 (最快)不等,并根据鼠标移动的距离来表示指针移动了多少。默认值为10,因此不会对鼠标运动进行任何额外的修改。
从我的测试,它看起来10个意味着没有缩放(刻度1)。每一个高于10的值似乎都会使比例尺因子增加1/4,而低于10的值则会降低1/8 (除了2的值达到0,因此标度为1/16,1单位的标度似乎为0/32)。如果禁用“增强指针精度”,下面的算法(Python)预测鼠标的结束位置:
import ctypes
speed = ctypes.c_int()
ctypes.windll.user32.SystemParametersInfoA(0x0070, 0, ctypes.byref(speed), 0) # SPI_GETMOUSESPEED
speed = out.value
# x is how much you want to move the mouse in the x axis (the same is true for the y axis)
if speed == 1:
predict_x = x // 32
elif speed == 2:
predict_x = x // 16
elif speed <= 10:
predict_x = (x * (speed - 2)) // 8
else:
predict_x = (x * (speed - 6)) // 4如果您想准确地移动鼠标x,则需要反向代码:
if speed == 1:
used_x = x * 32
elif speed == 2:
used_x = x * 16
elif speed <= 10:
used_x = int(round((x * 8) / (speed - 2)))
else:
used_x = int(round((x * 4) / (speed - 6)))我的结论是,用相对运动来精确地移动鼠标是不值得的。最好查询当前位置,添加增量,并设置绝对位置。否则,您必须查询鼠标的配置,可以随时更改,并设计为良好的感觉,而不是精确的一个动作。
https://stackoverflow.com/questions/60268940
复制相似问题