A lightweight Windows mouse highlight overlay tool with halo circle and click ripple animations, built with C++17 and Win32 API.
MouseHighlighter
一个极轻量级的 Windows 桌面鼠标高亮工具,使用 C++17 + Win32 API 编写。通过全屏透明叠加层,在鼠标光标周围渲染半透明光晕圆圈和点击波纹动画,方便演示、录屏、教学等场景下突出显示鼠标操作。
功能特性
- 光晕圆圈 — 跟随鼠标光标,支持自定义颜色、大小、透明度、粗细、填充模式
- 点击波纹 — 鼠标左/右键点击时触发扩散波纹动画,可配置颜色、大小、速度、数量(最多 12 个并发)
- 全屏透明叠加层 — 点击穿透,不影响正常操作
- 多显示器 & DPI 感知 — 自动适配多屏环境和高分辨率显示器
- 系统托盘管理 — 右键托盘图标即可调整所有参数,支持开机自启
- 配置持久化 — 所有设置自动保存到 INI 文件,重启后保留
- 脏矩形优化 — 仅重绘变化区域,CPU 占用极低
- EMA 坐标平滑 — 可选的光标坐标指数移动平均平滑,减少抖动
截图示意
┌─────────────────────────────┐
│ │
│ ╭───────╮ │
│ ╱ 光晕圆圈 ╲ │
│ │ ◉ 鼠标 │ │
│ ╲ ╱ │
│ ╰───────╯ │
│ ╭ ─ ─ ─ ─ ─╮ │
│ ╭ 点击波纹 ╮ │
│ ╭ (扩散动画) ╮ │
│ │
└─────────────────────────────┘
透明叠加层,点击穿透
项目结构
MouseHighlighter/
├── include/
│ ├── MouseHighlighter.h # 主应用类声明
│ ├── SharedState.h # 无锁环形队列与线程间通信
│ ├── DataStructures.h # DIB 缓冲区、波纹状态、脏矩形追踪
│ └── Config.h # 配置结构体与 INI 读写
├── src/
│ ├── main.cpp # 程序入口、DPI 感知初始化
│ ├── MouseHighlighter.cpp # 核心实现:窗口、渲染、托盘、消息循环
│ └── Config.cpp # INI 文件解析器
├── res/ # 资源目录(预留)
├── CMakeLists.txt # CMake 构建脚本
├── BUILD.md # 详细构建指南
└── README.md # 本文件
快速开始
前提条件
- Windows 10+(Windows 7+ 理论支持)
- CMake 3.15+
- MSVC 2019+ 或 MinGW
编译
Visual Studio (推荐):
mkdir build && cd build
cmake -G "Visual Studio 17 2022" -A x64 ..
cmake --build . --config Release
编译产物位于 build/Release/MouseHighlighter.exe。
MinGW:
mkdir build && cd build
cmake -G "MinGW Makefiles" ..
cmake --build .
运行
双击 MouseHighlighter.exe 即可。程序启动后会在系统托盘显示图标,ESC 键可退出。
托盘菜单
右键托盘图标可调整以下设置:
| 菜单项 | 说明 |
|---|---|
| 光晕颜色 | 蓝色 / 黄色 |
| 光晕大小 | S / M / L / XL / XXL |
| 光晕透明度 | 低 / 中 / 高 |
| 光晕质量 | 普通 / 高 / 极高(SSAA 级别) |
| 实心填充 | 切换空心圆环 / 实心圆 |
| 波纹颜色 | 绿 / 蓝 / 粉 |
| 波纹大小 | S / M / L / XL / XXL |
| 波纹透明度 | 低 / 中 / 高 |
| 波纹速度 | 慢 / 中 / 快 |
| 启用波纹 | 开 / 关 |
| 开机自启 | 注册 / 取消 Windows 自启动 |
| 退出 | 关闭程序 |
配置文件
配置自动保存在 %APPDATA%\MouseHighlighter\config.ini,格式如下:
[Halo]
ColorARGB=0x660099FF
Radius=30.0
Thickness=1.5
[Ripple]
ColorARGB=0x3300FF99
MaxRadius=120.0
DurationMS=240
Thickness=2.5
[Smoothing]
Alpha=0.25
[Timing]
TargetFPS=60
UpdateIntervalMS=17
技术要点
| 项目 | 说明 |
|---|---|
| 叠加窗口 | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST,全屏覆盖且点击穿透 |
| 渲染方式 | 软件光栅化,逐像素 Porter-Duff Alpha 混合 |
| 抗锯齿 | 超级采样(1x / 2x2 / 3x3 SSAA) |
| 光标追踪 | GetCursorPos() 轮询 + 可选 EMA 平滑 |
| 点击检测 | GetAsyncKeyState() 异步按键状态查询 |
| 帧率控制 | MsgWaitForMultipleObjects 超时驱动,默认 ~60fps |
| 内存管理 | 空闲时 EmptyWorkingSet() 回收工作集 |
性能
- CPU:静止 < 1%,移动时 2-5%,多波纹并发 < 9%
- 内存:< 30 MB,24 小时运行无增长
- 渲染延迟:< 10ms (P95)
常见问题
Q: 窗口不显示? 确保 DWM 合成已启用(Windows 10/11 默认开启)。全屏独占应用下叠加层会被隐藏。
Q: 鼠标有延迟? 降低波纹并发数或检查是否有其他全局钩子程序冲突。
Q: 找不到 dwmapi.h?
安装 Windows SDK,可通过 Visual Studio Installer 添加。
License
MIT
Description
Languages
C++
97.1%
CMake
2.9%