Skip to content

2.3.2 Fix

Latest

Choose a tag to compare

@Mikachu2333 Mikachu2333 released this 29 Jul 06:11
· 1 commit to dev since this release
  1. 并发与定时器

    • 将线程池定时器改为基于 SetTimer 的 UI 消息线程定时器。
    • 避免工作线程直接访问 HWND、GDI/GDI+ 对象和全局 GUI 状态。
    • 消除了退出阶段定时器回调访问已释放资源的主要风险。
    • 禁止复制 CTimer,并修复定时器注册表容量不足时的失败处理。
  2. 指针、越界与内存

    • 标签文本由共享裸指针缓冲区改为 std::wstring。
    • 移除 textBuffer、内部指针移动、重叠覆盖和手工空间回收逻辑。
    • 修复 labelCount - 1 在零值时下溢的问题。
    • 修复 prepareLabels() 中零行时 offset 无符号下溢。
    • 限制标签文本最大长度和标签数量。
    • 增加标签索引、对象和画布有效性检查。
    • 延迟鼠标标签改为 std::wstring,避免固定数组操作。
  3. Hook 安全和逻辑

    • 在解引用 Hook 的 lParam 之前检查 nCode 和空指针。
    • 使用只读 Hook 数据视图。
    • 修复键盘或鼠标 Hook 仅安装成功一个时状态不一致的问题。
    • 重新启用 Hook 失败时回滚已安装的 Hook。
    • 初始化点击动画类型,消除可能使用未初始化变量的问题。
    • 修复有符号/无符号比较警告。
  4. GDI/GDI+ 资源

    • 检查 GetDC、CreateCompatibleDC、CreateCompatibleBitmap、
      SelectObject、CreateFontIndirect 和 GDI+ 对象状态。
    • 检查画布和窗口尺寸,防止向 UpdateLayeredWindow 传入无效参数。
    • 修复部分失败路径上的 GDI 资源清理。
    • Debug 日志文件现在仅在成功打开后关闭。
  5. 设置窗口

    • 修复 modeless dialog 错误使用 EndDialog 的问题。
    • 保存、取消和关闭现在隐藏窗口,使句柄可安全复用。
    • 关闭设置窗口时停止预览定时器。
    • 修复设置窗口在负坐标和非主显示器工作区上的定位计算。
  6. 热键

    • 新热键注册失败时恢复旧热键及旧配置。
    • 避免新热键注册失败后程序永久失去切换热键。
  7. 初始化和错误处理

    • 检查单实例互斥体创建失败。
    • 使用当前用户会话范围的 Local\ 互斥体。
    • 检查 GetModuleFileNameW 失败或路径截断。
    • 检查 GdiplusStartup 返回状态。
    • 正确处理 GetMessage 返回 -1。
    • 检查设置写入结果,并在调试输出中报告保存失败。
  8. DPI、权限与构建安全

    • 改为 Per-Monitor DPI Awareness V2。
    • Manifest 明确设置:
      • asInvoker
      • uiAccess=false
    • 增加 MSVC 安全和兼容性选项:
      • /W4
      • /permissive-
      • /sdl
      • /DYNAMICBASE
      • /HIGHENTROPYVA
      • /NXCOMPAT
      • /GUARD:CF