更好的 Windows 鼠标灵敏度倍增器控制?

更好的 Windows 鼠标灵敏度倍增器控制?

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

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

  • 详细列表显示鼠标速度及其乘数液体百科
     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)
    
    这是控制面板勾选索引

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

答案1

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

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

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

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

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Mouse]
"SmoothMouseXCurve"=hex:\
    00,00,00,00,00,00,00,00,\
    C0,CC,0C,00,00,00,00,00,\
    80,99,19,00,00,00,00,00,\
    40,66,26,00,00,00,00,00,\
    00,33,33,00,00,00,00,00
"SmoothMouseYCurve"=hex:\
    00,00,00,00,00,00,00,00,\
    00,00,38,00,00,00,00,00,\
    00,00,70,00,00,00,00,00,\
    00,00,A8,00,00,00,00,00,\
    00,00,E0,00,00,00,00,00

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

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

'{0:x8}' -f [int](MATH HERE)

...例如...

'{0:x8}' -f [int](0x00199980 / 0.8)

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

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

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Mouse]
"SmoothMouseXCurve"=hex:\
    00,00,00,00,00,00,00,00,\
    F0,FF,0F,00,00,00,00,00,\
    E0,FF,1F,00,00,00,00,00,\
    D0,FF,2F,00,00,00,00,00,\
    C0,FF,3F,00,00,00,00,00
"SmoothMouseYCurve"=hex:\
    00,00,00,00,00,00,00,00,\
    00,00,38,00,00,00,00,00,\
    00,00,70,00,00,00,00,00,\
    00,00,A8,00,00,00,00,00,\
    00,00,E0,00,00,00,00,00

答案2

必须登录并退出才能应用注册表调整,这非常麻烦。另一种方法是使用https://hcidesign.com/mousespeed/它提供 20 个步骤而不是 11 个,并且,如果启用低级访问,则提供无限分辨率。

截屏

相关内容