Repository navigation
-
并发与定时器
- 将线程池定时器改为基于 SetTimer 的 UI 消息线程定时器。
- 避免工作线程直接访问 HWND、GDI/GDI+ 对象和全局 GUI 状态。
- 消除了退出阶段定时器回调访问已释放资源的主要风险。
- 禁止复制 CTimer,并修复定时器注册表容量不足时的失败处理。
-
指针、越界与内存
- 标签文本由共享裸指针缓冲区改为 std::wstring。
- 移除 textBuffer、内部指针移动、重叠覆盖和手工空间回收逻辑。
- 修复 labelCount - 1 在零值时下溢的问题。
- 修复 prepareLabels() 中零行时 offset 无符号下溢。
- 限制标签文本最大长度和标签数量。
- 增加标签索引、对象和画布有效性检查。
- 延迟鼠标标签改为 std::wstring,避免固定数组操作。
-
Hook 安全和逻辑
- 在解引用 Hook 的 lParam 之前检查 nCode 和空指针。
- 使用只读 Hook 数据视图。
- 修复键盘或鼠标 Hook 仅安装成功一个时状态不一致的问题。
- 重新启用 Hook 失败时回滚已安装的 Hook。
- 初始化点击动画类型,消除可能使用未初始化变量的问题。
- 修复有符号/无符号比较警告。
-
GDI/GDI+ 资源
- 检查 GetDC、CreateCompatibleDC、CreateCompatibleBitmap、
SelectObject、CreateFontIndirect 和 GDI+ 对象状态。 - 检查画布和窗口尺寸,防止向 UpdateLayeredWindow 传入无效参数。
- 修复部分失败路径上的 GDI 资源清理。
- Debug 日志文件现在仅在成功打开后关闭。
- 检查 GetDC、CreateCompatibleDC、CreateCompatibleBitmap、
-
设置窗口
- 修复 modeless dialog 错误使用 EndDialog 的问题。
- 保存、取消和关闭现在隐藏窗口,使句柄可安全复用。
- 关闭设置窗口时停止预览定时器。
- 修复设置窗口在负坐标和非主显示器工作区上的定位计算。
-
热键
- 新热键注册失败时恢复旧热键及旧配置。
- 避免新热键注册失败后程序永久失去切换热键。
-
初始化和错误处理
- 检查单实例互斥体创建失败。
- 使用当前用户会话范围的 Local\ 互斥体。
- 检查 GetModuleFileNameW 失败或路径截断。
- 检查 GdiplusStartup 返回状态。
- 正确处理 GetMessage 返回 -1。
- 检查设置写入结果,并在调试输出中报告保存失败。
-
DPI、权限与构建安全
- 改为 Per-Monitor DPI Awareness V2。
- Manifest 明确设置:
- asInvoker
- uiAccess=false
- 增加 MSVC 安全和兼容性选项:
- /W4
- /permissive-
- /sdl
- /DYNAMICBASE
- /HIGHENTROPYVA
- /NXCOMPAT
- /GUARD:CF