Windows 鼠标速度是非线性的——如何转换为线性比例?
Windows mouse speed is non-linear -- how do I convert to a linear scale?
我正在编写一个 Windows 应用程序,它使用 SendInput 移动鼠标,而无需用户使用实际的鼠标。它所需的功能之一是无论用户的鼠标速度设置是什么,它都会创建相同的移动(假设他们没有检查 "Enhance pointer precision",所以我的应用程序不必考虑 "mouse acceleration").
我通过获取 Windows' 鼠标速度设置并将我的输出除以它来做到这一点。因此,如果用户将他们的鼠标速度设置加倍,我的应用程序将其输出减半,他们应该取消(如果鼠标速度设置实际上代表光标速度的乘数)。
我一直在使用 SystemParametersInfo(SPI_GETMOUSESPEED...) 获取鼠标速度设置,根据 Microsoft's documentation,它给出了 1 到 20 范围内的速度。
int result;
if (SystemParametersInfo(SPI_GETMOUSESPEED, 0, &result, 0)) {
return result;
}
问题是这个值与给定输入的实际鼠标速度不成线性比例。如果它是线性比例的,如果给定的鼠标移动将屏幕光标移动距离 X,则将鼠标速度设置加倍并执行相同的鼠标移动应该导致屏幕光标移动 2X 的距离。将设置减半应该会导致屏幕上移动 0.5 倍。
但不是这样的。
即使在我的应用程序将其鼠标速度除以 Windows' 鼠标速度设置后,非常低的鼠标速度设置也会产生低于预期的输出。
是否有文档说明如何将 Windows 鼠标速度映射到实际速度(无论单位是什么),适合取消此设置?或者有没有更好的方法让我考虑用户的鼠标速度设置,或者完全忽略用户的鼠标设置?
谢谢!
Liquipedia's Counter-Strike wiki 有答案。此 table 显示 Windows' 鼠标速度设置中的槽口如何对应于不同的乘数。逻辑似乎是中间的凹口是 1.0(没有变化),它右边的每一步都会将乘数增加 0.25,而向左则将灵敏度降低 1/8,直到达到 1/8。然后减半,再减半。
查看 table 本身更容易。我的应用程序只是将它放在一个数组中(中间一行,EPP 关闭,这似乎意味着这些数字在禁用增强指针精度时适用)。
我已经在此处转录了 table 的相关部分。左栏是使用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
到目前为止,这似乎在我的应用程序中运行良好。
我正在编写一个 Windows 应用程序,它使用 SendInput 移动鼠标,而无需用户使用实际的鼠标。它所需的功能之一是无论用户的鼠标速度设置是什么,它都会创建相同的移动(假设他们没有检查 "Enhance pointer precision",所以我的应用程序不必考虑 "mouse acceleration").
我通过获取 Windows' 鼠标速度设置并将我的输出除以它来做到这一点。因此,如果用户将他们的鼠标速度设置加倍,我的应用程序将其输出减半,他们应该取消(如果鼠标速度设置实际上代表光标速度的乘数)。
我一直在使用 SystemParametersInfo(SPI_GETMOUSESPEED...) 获取鼠标速度设置,根据 Microsoft's documentation,它给出了 1 到 20 范围内的速度。
int result;
if (SystemParametersInfo(SPI_GETMOUSESPEED, 0, &result, 0)) {
return result;
}
问题是这个值与给定输入的实际鼠标速度不成线性比例。如果它是线性比例的,如果给定的鼠标移动将屏幕光标移动距离 X,则将鼠标速度设置加倍并执行相同的鼠标移动应该导致屏幕光标移动 2X 的距离。将设置减半应该会导致屏幕上移动 0.5 倍。
但不是这样的。
即使在我的应用程序将其鼠标速度除以 Windows' 鼠标速度设置后,非常低的鼠标速度设置也会产生低于预期的输出。
是否有文档说明如何将 Windows 鼠标速度映射到实际速度(无论单位是什么),适合取消此设置?或者有没有更好的方法让我考虑用户的鼠标速度设置,或者完全忽略用户的鼠标设置?
谢谢!
Liquipedia's Counter-Strike wiki 有答案。此 table 显示 Windows' 鼠标速度设置中的槽口如何对应于不同的乘数。逻辑似乎是中间的凹口是 1.0(没有变化),它右边的每一步都会将乘数增加 0.25,而向左则将灵敏度降低 1/8,直到达到 1/8。然后减半,再减半。
查看 table 本身更容易。我的应用程序只是将它放在一个数组中(中间一行,EPP 关闭,这似乎意味着这些数字在禁用增强指针精度时适用)。
我已经在此处转录了 table 的相关部分。左栏是使用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
到目前为止,这似乎在我的应用程序中运行良好。