鼠标轨迹控制器:数位板书写防漂移的 Windows 小工具

用手写板在 OneNote 上记笔记的人,大概都遇到过这一幕:低头写完一行,抬头发现指针不知道什么时候漂到了屏幕另一头,刚才那几个字全写空了。

Windows 其实自带”鼠标轨迹”功能,指针移动时拖一小串影子,眼神跟着影子走就不容易丢。但开关藏在”鼠标属性”里,每次要跳好几层菜单;更关键的是,系统只给了开和关,轨迹长度调不了。

从一个注册表值下手

翻了一遍,这个功能的实质就是注册表里的一个值:

1
2
3
4
HKEY_CURRENT_USER\Control Panel\Desktop
名称:MouseTrails
类型:REG_SZ
取值:0 = 关闭,1 ~ 7 = 轨迹长度

光改注册表还不够,改完必须再调一次 SystemParametersInfoW(SPI_SETMOUSETRAILS),设置才会立即生效。这一点是后来试出来的:一开始我只改了注册表,滑块拖了半天画面没反应,以为路径写错了,排查半天才发现少了一次 API 调用。

工具做了什么

想清楚原理后,写了个 tkinter 小工具,一个窗口解决三件事:开关、1-7 级长度滑块、当前状态显示。窗口 550x420,一个主框架加两个 LabelFrame,没上花里胡哨的东西。

几个实现上的细节:

  • 滑块拖动时,如果轨迹正处于开启状态,会直接应用新长度,不用再点”确定”。”设置立即生效”是需求,不是宣传语。
  • 背后有个监控线程,每 0.5 秒读一次注册表刷新界面状态。原因是这个值不止我一个程序在写,别的优化软件、组策略都可能动它,界面显示必须跟实际值保持一致,不能自己骗自己。
  • 读注册表失败时按”已关闭”处理。宁可不显示,也不能显示一个错状态。

核心代码其实就两段,读和写:

1
2
3
4
5
6
7
8
9
SPI_SETMOUSETRAILS = 0x005D

# 读:取当前档位,失败按 0(关闭)处理
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Control Panel\Desktop')
value, _ = winreg.QueryValueEx(key, 'MouseTrails')

# 写:先落注册表,再调 API 让设置立即生效
winreg.SetValueEx(key, 'MouseTrails', 0, winreg.REG_SZ, str(trail_length))
ctypes.windll.user32.SystemParametersInfoW(SPI_SETMOUSETRAILS, trail_length, 0, 0)

打包与使用

用 PyInstaller 打成单文件 exe,目标机器不用装 Python,双击即用。仓库里带了 build_exe.bat,一键打包,产物在 dist\鼠标轨迹控制器.exe。

  • 系统要求:Windows 10 / 11
  • Python 3.6+ 仅在打包时需要

界面长这样,一个滑块一个按钮,状态实时显示:

鼠标轨迹控制器界面

仓库地址:LuminDream/mouse_trail_controller,MIT License。