![Windows 10 应用注册表鼠标设置](https://linux22.com/image/1468281/Windows%2010%20%E5%BA%94%E7%94%A8%E6%B3%A8%E5%86%8C%E8%A1%A8%E9%BC%A0%E6%A0%87%E8%AE%BE%E7%BD%AE.png)
当我使用 regedit 或 PowerShell(MouseSpeed、MouseThreshold1、MouseThreshold2 MouseTrails 等)在注册表中手动更改任何鼠标设置时,
HKEY_CURRENT_USER\控制面板\鼠标
除非重新启动 Windows,否则不会应用任何内容。例如,我将 MouseTrails 设置为 6。这应该会将 MouseTrails 设置变为第二高设置,但当我保存该值时它不会应用。我重新启动机器,然后我的光标后面出现了一条轨迹。
如何在不重启计算机的情况下应用这些手动鼠标注册表更改?这可能吗?我不是在问如何通过控制面板设置这些值;我知道这些设置通过控制面板就可以正常工作。
作为参考,我正在运行 Windows 10 并拥有 Logitech G602。Logitech 软件已安装在我的电脑上,但不会在启动时运行。
答案1
这些设置只能在正在运行的会话中通过SystemParametersInfo
功能。(这就是鼠标设置 UI 进行更改的方式。)如果您已经有将所需设置写入注册表的机制,则可以使用此 PowerShell 脚本来读取注册表项并应用它们SystemParametersInfo
:
Add-Type @"
using System.Runtime.InteropServices;
public class PInvoke {
[DllImport("user32.dll")] public static extern int SystemParametersInfo(int uiAction, int uiParam, int[] pvParam, int fWinIni);
[DllImport("user32.dll")] public static extern int SystemParametersInfo(int uiAction, int uiParam, System.IntPtr pvParam, int fWinIni);
}
"@
$mouse = Get-ItemProperty 'HKCU:\Control Panel\Mouse'
# DoubleClickHeight -> SPI_SETDOUBLECLKHEIGHT
[PInvoke]::SystemParametersInfo(0x001E, $mouse.DoubleClickHeight, $null, 0)
# DoubleClickSpeed -> SPI_SETDOUBLECLICKTIME
[PInvoke]::SystemParametersInfo(0x0020, $mouse.DoubleClickSpeed, $null, 0)
# DoubleClickWidth -> SPI_SETDOUBLECLKWIDTH
[PInvoke]::SystemParametersInfo(0x001D, $mouse.DoubleClickWidth, $null, 0)
# MouseHoverHeight -> SPI_SETMOUSEHOVERHEIGHT
[PInvoke]::SystemParametersInfo(0x0065, $mouse.MouseHoverHeight, $null, 0)
# MouseHoverTime -> SPI_SETMOUSEHOVERTIME
[PInvoke]::SystemParametersInfo(0x0067, $mouse.MouseHoverTime, $null, 0)
# MouseHoverWidth -> SPI_SETMOUSEHOVERWIDTH
[PInvoke]::SystemParametersInfo(0x0063, $mouse.MouseHoverWidth, $null, 0)
# MouseSensitivity -> SPI_SETMOUSESPEED
[PInvoke]::SystemParametersInfo(0x0071, 0, [IntPtr][int]$mouse.MouseSensitivity, 0)
# MouseThreshold1, MouseThreshold2, MouseSpeed -> SPI_SETMOUSE
[PInvoke]::SystemParametersInfo(0x0004, 0, [int[]]($mouse.MouseThreshold1, $mouse.MouseThreshold2, $mouse.MouseSpeed), 0)
# MouseTrails -> SPI_SETMOUSETRAILS
[PInvoke]::SystemParametersInfo(0x005D, $mouse.MouseTrails, $null, 0)
# SnapToDefaultButton -> SPI_SETSNAPTODEFBUTTON
[PInvoke]::SystemParametersInfo(0x0060, $mouse.SnapToDefaultButton, $null, 0)
# SwapMouseButtons -> SPI_SETMOUSEBUTTONSWAP
[PInvoke]::SystemParametersInfo(0x0021, $mouse.SwapMouseButtons, $null, 2)
首先,它声明SystemParametersInfo
本机函数——两次声明,签名略有不同,因为该函数在如何传递新设置方面存在奇怪的不一致。然后,脚本获取Mouse
注册表项的值。对于每个值(除了几个,主要是与声音相关的,似乎是残留的),脚本使用适当的操作/设置代码和输入格式调用系统参数函数如文档所列。每次调用如果成功则输出 1。更新最后一个设置时,SPIF_SENDCHANGE
将传递标志 (2) 以通知其他应用程序已进行更改。
由于脚本从注册表获取数据,我选择不让它冗余地更新注册表,但如果您决定调整脚本以设置特定的鼠标设置而不是从注册表获取它们,请通过将最后一个参数从 0 更改为 1 或从 2 更改为 3 来应用于SPIF_UPDATEINIFILE
每次调用。SystemParametersInfo
有趣的是,该ActiveWindowTracking
值也是残留的 - 该设置实际上存储为桌面的一部分UserPreferencesMask
- 但如果您现有的脚本尝试使用残留值,则此代码片段将真正应用它:
# ActiveWindowTracking -> SPI_SETACTIVEWINDOWTRACKING
[PInvoke]::SystemParametersInfo(0x1001, 0, [IntPtr][int]$mouse.ActiveWindowTracking, 1)
要使用该脚本,请将其保存为 PS1 文件,例如regmouse.ps1
,然后您可以从命令提示符中调用它,如下所示:
powershell -executionpolicy bypass -file regmouse.ps1
答案2
虽然注册表肯定需要重新启动,但这样尝试可能会有效。
就像您在注册表中做了一些更改一样,按 CTRl+Alt+Del 调用任务管理器。找到 Explorer 并单击“结束任务”。如果出现关机屏幕 - - > 单击“取消”。现在选择文件 - - > 新任务 - - > 进入 Explorer 并单击“确定”。
在那里您获得了新的 Explorer 和最新的注册表设置。希望这对您有所帮助。
答案3
许多注册表设置在不同的时间点加载。启动时、登录时、资源管理器启动时等。
我可能错了,但我认为 HKCU 条目至少需要一个注销、登录周期。