更好的 Windows 鼠标灵敏度乘数控制?

Ale*_*lex 5 windows mouse operating-systems c# windows-10

(我知道这个问题之前已经发布过;我重新发布了有关情况的更详细解释,因为上一个问题没有得到解答并且有超过 6k 的浏览量。)

鼠标速度 Windows 乘数可以通过控制面板中的指针选项进行控制,也可以通过调用和更改SystemParametersInfo注册表值的更高级方式进行控制。

  • 显示鼠标速度及其乘数的详细列表来自Liquipedia
     1 speed: 0.03125 (1st tick)  |  11 speed: 1.25
     2 speed: 0.0625 (2nd tick)   |  12 speed: 1.5 (7th tick)
     3 speed: 0.125               |  13 speed: 1.75
     4 speed: 0.25 (3rd tick)     |  14 speed: 2 (8th tick)
     5 speed: 0.375               |  15 speed: 2.25
     6 speed: 0.5 (4th tick)      |  16 speed: 2.5 (9th tick)
     7 speed: 0.625               |  17 speed: 2.75
     8 speed: 0.75 (5th tick)     |  18 speed: 3 (10th tick)
     9 speed: 0.875               |  19 speed: 3.25
    10 speed: 1.0 (6th tick)      |  20 speed: 3.5 (11th tick)
    
    Run Code Online (Sandbox Code Playgroud) 这是控制面板勾选索引

有没有办法通过SystemParameterInfo或注册表设置速度,使用浮点数,允许更精确的乘数值,例如 x0.8(查看列表,它无法到达)?如果是这样,我该怎么做?

Ben*_*n N 4

当“增强指针精度”关闭时,无法设置任意速度倍增器。滑块控制MouseSensitivity注册表中的值,该值始终是 1 到 20 之间的整数。win32kbase.sys始终将灵敏度设置作为整数传递,并且许多功能包括范围检查。最相关的函数是UpdateMouseSensitivity,它将MouseSensitvity式整数转换为 24.8定点速度乘数。Ghidra将该函数反编译为(我的评论)...

\n
void __thiscall UpdateMouseSensitivity(MOUSE_SENSITIVITY_INFO *this,uint param_1)\n// param_1 is the MouseSensitivity value\n{\n  uint uVar1; // Temporary variable to store the Speed multiplier\n  \n  if (0x13 < param_1 - 1) { // If param_1 is zero, param_1 - 1 wraps around to a big number\n    // Fail if MouseSensitivity is less than 1 or greater than 20\n    MicrosoftTelemetryAssertTriggeredNoArgsKM();\n  }\n  *(uint *)this = param_1; // Store the raw MouseSensitivity value\n  if (param_1 < 3) {             // For MouseSensitivity 1-2,\n    uVar1 = (param_1 << 8) >> 5; // Speed = MouseSensitivity / 32\n  }\n  else {\n    if (param_1 < 0xb) {                    // For MouseSensitivity 3-10,\n      uVar1 = param_1 * 0x100 - 0x200 >> 3; // Speed = (MouseSensitivity - 2) / 8\n    }\n    else {                                  // For MouseSensitivity 11-20,\n      uVar1 = param_1 * 0x100 - 0x600 >> 2; // Speed = (MouseSensitivity - 6) / 4\n    }\n  }\n  *(uint *)(this + 4) = uVar1; // Store Speed in the MOUSE_SENSITIVITY_INFO structure,\n  return;                      // thereby making it available to the caller\n}\n
Run Code Online (Sandbox Code Playgroud)\n

...它生成您问题中列出的值。

\n

但是,还有另一种方法来设置鼠标灵敏度。当“增强指针精度”打开时,Windows 使用SmoothMouseXCurveSmoothMouseYCurve值\xe2\x80\x94 以及链接页面\xe2\x80\x94 中的另一行灵敏度乘数来确定速度乘数,作为您速度的函数\'重新移动鼠标。默认情况下,当您缓慢移动鼠标时,它会使指针变得特别慢,但可以将曲线更改为直线以禁用加速,但允许进行微调。此页面提供了一组注册表调整,即使在增强的指针精度打开的情况下,也可以为各种环境提供 1:1 的鼠标:指针响应。这将其提供在 Windows 10 上的第六个刻度线处:

\n
Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Mouse]\n"SmoothMouseXCurve"=hex:\\\n    00,00,00,00,00,00,00,00,\\\n    C0,CC,0C,00,00,00,00,00,\\\n    80,99,19,00,00,00,00,00,\\\n    40,66,26,00,00,00,00,00,\\\n    00,33,33,00,00,00,00,00\n"SmoothMouseYCurve"=hex:\\\n    00,00,00,00,00,00,00,00,\\\n    00,00,38,00,00,00,00,00,\\\n    00,00,70,00,00,00,00,00,\\\n    00,00,A8,00,00,00,00,00,\\\n    00,00,E0,00,00,00,00,00\n
Run Code Online (Sandbox Code Playgroud)\n

由于您所需的 0.8 速度是 EPP-on 乘数之一,因此您可以通过安装该调整(将其另存为文件.reg并双击)并调整滑块(在本例中为第五个刻度)来获得它。您可能需要注销并重新登录才能使曲线注册表更改生效。

\n

如果您所需的乘数不是 EPP 默认值之一,您可以更改曲线的斜率。在上面的每一行十六进制数字中,前四个逗号分隔的数字是Little-Endian中的坐标,因此 X 值的第三行是坐标0x00199980。当 Y/X 为 \xe2\x89\x884.375 时,您将获得标准的 100% 缩放;要获得不同的缩放比例,请将所有 Y 坐标相乘或将所有 X 坐标除以所需的比例因子。您可能会发现使用 PowerShell 混合十六进制和十进制数进行数学运算并以十六进制字符串形式获取结果会很有帮助...

\n
\'{0:x8}\' -f [int](MATH HERE)\n
Run Code Online (Sandbox Code Playgroud)\n

...例如...

\n
\'{0:x8}\' -f [int](0x00199980 / 0.8)\n
Run Code Online (Sandbox Code Playgroud)\n

...它产生001fffe0,这将是E0,FF,1F,00一个小端字节序列。

\n

例如,在启用 EPP 的情况下,这会在默认的第六个刻度线处产生 80% 的速度:

\n
Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Mouse]\n"SmoothMouseXCurve"=hex:\\\n    00,00,00,00,00,00,00,00,\\\n    F0,FF,0F,00,00,00,00,00,\\\n    E0,FF,1F,00,00,00,00,00,\\\n    D0,FF,2F,00,00,00,00,00,\\\n    C0,FF,3F,00,00,00,00,00\n"SmoothMouseYCurve"=hex:\\\n    00,00,00,00,00,00,00,00,\\\n    00,00,38,00,00,00,00,00,\\\n    00,00,70,00,00,00,00,00,\\\n    00,00,A8,00,00,00,00,00,\\\n    00,00,E0,00,00,00,00,00\n
Run Code Online (Sandbox Code Playgroud)\n