Windows鼠标速度是非线性的-如何转换为线性比例?

时间:2018-10-27 09:30:13

标签: c++ windows mouse

我正在编写一个Windows应用程序,该应用程序使用SendInput移动鼠标,而用户不必使用实际的鼠标。其所需的功能之一是,无论用户的“鼠标速度”设置是什么,它都将创建相同的运动(假设他们没有选中“增强指针精度”,因此我的应用程序不必考虑“鼠标加速” “)。

我通过获取Windows的鼠标速度设置并除以我的输出来完成此操作。因此,如果用户将鼠标速度设置加倍,则我的应用程序将其输出减半,并且应该取消(如果鼠标速度设置实际上表示光标速度的倍数)。

我一直在使用SystemParametersInfo(SPI_GETMOUSESPEED ...)获得鼠标速度设置,根据Microsoft's documentation,该速度范围为1到20。

int result;
if (SystemParametersInfo(SPI_GETMOUSESPEED, 0, &result, 0)) {
    return result;
}

问题是在给定输入下,该值与实际鼠标速度不成线性比例。如果它是线性比例,那么如果给定的鼠标移动将屏幕上的光标移动了距离X,则将鼠标速度设置加倍并执行相同的鼠标移动应导致屏幕上的光标移动2倍。将设置减半将导致屏幕上出现0.5倍的移动。

但是它不能那样工作。

即使我的应用程序将其鼠标速度除以Windows的鼠标速度设置后,非常低的鼠标速度设置也会产生比预期的慢的输出。

是否有任何文档显示如何将Windows鼠标速度映射到实际速度(无论单位),适合于取消此设置?还是我有更好的方法来考虑用户的鼠标速度设置,或者完全忽略用户的鼠标设置?

谢谢!

1 个答案:

答案 0 :(得分:0)

Liquipedia's Counter-Strike wiki有答案。下表显示Windows的“鼠标速度”设置中的槽口如何对应于不同的乘数。逻辑似乎是中间凹口为1.0(无变化),其中间的每一步将乘数提高0.25,而左侧的灵敏度则降低1/8,直到达到1/8。然后将其减半,然后再减半。

看表本身更容易。我的应用程序只是将其放在一个数组中(中间行,EPP关闭,这似乎表示禁用增强指针精度时这些数字适用)。

我已经在此处转录了表格的相关部分。左列是使用SystemParametersInfo(SPI_GETMOUSESPEED ...)获得的数字,右列是相应的乘数:

1    1/32
2    1/16
3    1/8
4    2/8
5    3/8
6    4/8
7    5/8
8    6/8
9    7/8
10   1.0
11   1.25
12   1.5
13   1.75
14   2.0
15   2.25
16   2.5
17   2.75
18   3.0
19   3.25
20   3.5

到目前为止,这似乎在我的应用程序中效果很好。