Skip to content

Latest commit

 

History

History
145 lines (99 loc) · 10.5 KB

File metadata and controls

145 lines (99 loc) · 10.5 KB

更新日志

本项目遵循语义化版本

1.4.1 - 2026-07-30

新增

  • 双击托盘图标立即锁定:左键双击 BlackLock 托盘图标即可进入锁屏,行为与右键菜单“立即锁定”一致。

1.4.0 - 2026-07-18

新增

  • ARM64 原生构建与发布:新增 ARM64 架构,Windows on ARM 设备(Surface Pro X 等)可原生运行,不再走 x64 模拟。发布现产出 x64 / x86 / ARM64 三个架构。
  • 长路径支持(\\?\ 扩展路径):路径缓冲从 MAX_PATH(260) 提升到 32768,所有文件访问经 bl_file_api_path 转换为扩展长度形式,突破 260 字符限制且不依赖系统 LongPathsEnabled 策略。内嵌 manifest 的 longPathAware 声明现已名副其实。主要惠及 %APPDATA% 位于深层/重定向目录的用户。

修复

  • 启动失败回归\\?\ 前缀会关闭内核路径规范化,早期实现直接拼前缀,导致 %APPDATA% 带尾部反斜杠时拼出 ...Roaming\\BlackLock 双分隔符 → 路径非法 → 程序启动即失败。现改为先经 GetFullPathNameW 折叠重复分隔符、解析 . / .. 再加前缀。
  • 开机自启边界误删:Run 项长度上限误把外层两个引号也算进 MAX_PATH 预算,导致 259 字符这类本可启动的路径被误拒、并连带删除已有的 Run 值 → 开机自启被静默移除。改为只校验未加引号的 exe 路径长度。
  • 架构判定改用 CMAKE_VS_PLATFORM_NAME:原 CMAKE_SIZEOF_VOID_P 会把 ARM64(同为 8 字节)误判成 x64,产物进错目录。

测试

  • 新增 6 项路径规范化回归断言(折叠 \\、解析 . / ..、UNC、NULL/空串),配置层单元测试共 29 项断言。CI 三架构(x64/x86/arm64)编译 + ctest + 零依赖校验 + PE 架构校验全绿。

1.3.0 - 2026-07-17

清完代码审查中剩余的全部缺陷,并补上错误可见性与自动化测试。

新增

  • 托盘「立即锁定」:不依赖快捷键也能锁屏(快捷键被占用时尤其有用)。
  • 错误不再静默:快捷键注册失败、开机自启写注册表失败、配置保存失败、锁定失败、打开配置失败,全部通过托盘气泡明确告知。此前这些失败都悄无声息。
  • 密码错误蜂鸣提示:此前完全无反馈。不用气泡是因为锁定时黑窗全屏置顶,气泡要么被盖住、要么破坏纯黑观感。
  • 第二实例可恢复托盘:再次运行 exe 不再只是静默退出,而是让已运行实例重建托盘图标(图标意外丢失时的补救入口)。
  • 自动化测试:新增 ctest 配置层单元测试(18 项断言,覆盖密码校验/字符集/老配置迁移/写回),并新增 CI 工作流——每次推送/PR 都编译 x64+x86、跑测试、校验零依赖与 PE 架构;发版前同样门禁。

变更

  • 密码只允许英文字母和数字(区分大小写)。中文/输入法/emoji/空格/符号在锁屏的逐键翻译路径上无法可靠输入,此前设了这类密码会导致永远解不开锁。现在加载期即拒绝并提示,配置文件注释也已写明。
  • 托盘「开机自启」勾选态改为读取注册表真实状态,而非配置文件里写了什么——两者可能不一致(如写注册表失败)。顺带让此前从未被调用的 bl_autostart_is_enabled 派上用场。
  • 弹出菜单不再产生副作用:此前每次右键都会完整重载配置并顺带写注册表、重注册热键。现在只读配置刷新勾选态。
  • 配置监视改用 ReadDirectoryChangesW 并按文件名过滤:此前同目录任何无关文件变动都会触发完整重载 + 注册表同步 + 热键重注册。
  • 内嵌应用清单:asInvoker + Per-Monitor V2 DPI + supportedOS + longPathAware(此前 DPI 仅靠运行时 API 调用,且未声明受支持的 Windows 版本)。

修复

  • 锁定失败不再留下"半锁定"死局bl_lock_enter 改为分阶段初始化 + 失败回滚,黑窗/键盘钩子/置顶定时器任一失败都完整回滚并告知。此前钩子装不上会出现黑屏了却收不到键盘、密码打不进去,只能 Ctrl+Alt+Del。
  • 卸载键盘钩子失败不再丢弃句柄:此前失败仍清空句柄,残留钩子会继续吞掉整个桌面的键盘且程序再也管不到它。现在失败会重试,仍失败则维持锁定并蜂鸣(好过给出一个键盘全废的"正常"桌面)。
  • 配置写入改为原子替换(临时文件 + 写满 + FlushFileBuffers + MoveFileEx):此前 CREATE_ALWAYS 先截断再单次写,中途失败会把配置写成空/半截文件,下次加载退回无密码。
  • 取不到 exe 路径时不再回退相对路径:此前路径超长会去读当前工作目录下的 config.ini(快捷方式可任意指定工作目录)。%APPDATA% 改用 GetEnvironmentVariableW 并检查截断。
  • 配置变更通知先重新布防再处理:此前处理期间发生的保存会被漏掉。
  • 后备消息循环正确区分 GetMessage 返回 -1(出错)与 0(正常退出)。
  • 修正 DPI 函数指针原型(声明返回 HANDLE,实际为 BOOL),并在调用失败时正确回退。
  • CI 升级 actions/upload-artifactactions/download-artifact 至 v5,消除 Node 20 弃用告警。

1.2.0 - 2026-07-15

本版基于一轮完整代码审查,修复了 1 个安全缺陷与多项健壮性问题。

安全

  • 修复:超长/无效密码会静默退化为空密码password 超过缓冲容量(或非法 UTF-8)时,UTF-8→UTF-16 转换失败后被当成空值,配合 require_password = true 会导致空回车即可解锁。现在转换失败不再静默置空。
  • 禁止无有效密码时启用密码保护require_password = true 但密码为空/无效时,强制降级为「无需密码」并弹出托盘气泡告知,不再给出「已受保护」的错觉;托盘勾选「开启密码」时若密码为空,会拒绝并提示先设置密码。

变更

  • 改为静态 CRT(/MT),真正零运行时依赖:此前动态 CRT 会导入 VCRUNTIME140.dll(属于 VC++ Redistributable,不是 Windows 自带),干净系统上可能无法启动,与「单文件下载即用」不符。现在 exe 仅导入 6 个 Windows 系统 DLL。代价:体积 ~31 KB → ~172 KB (x64) / ~152 KB (x86)。
  • x64 / x86 分目录输出dist/x64dist/x86):此前共用 dist/,先后构建会互相覆盖,可能发布出错误架构的产物。CI 增加 PE Machine 校验。
  • 移除 /GS-,恢复默认栈保护(体积收益极小,安全收益明确)。

修复

  • Explorer 重启后托盘图标不再永久消失:处理 TaskbarCreated 广播并重建图标(此前图标丢失后无法暂停/配置/退出,且单实例互斥体使其无法重开)。
  • 键盘钩子中 GetKeyboardState 未初始化缓冲且未检查返回值,失败时会用栈上残留数据翻译按键;现已零初始化并在失败时跳过。
  • iniHasKey 查找 = 未限制在当前行,对无等号的行会一路扫到文件尾,构成 O(n²);现用 memchr 限界。
  • 文档漂移修正:版本菜单项描述(可点击)、设计文档状态、测试用例 T-01、体积与依赖声明。

1.1.2 - 2026-07-15

变更

  • 托盘图标悬浮提示改为三行:程序名 / 描述 + 快捷键 / 版本号;快捷键随配置实时更新

1.1.1 - 2026-07-15

修复

  • 托盘右键菜单的勾选状态(开机自启 / 开启密码 / 暂停)现在每次打开菜单都重新读取配置文件,确保与磁盘上的配置实时一致(此前在文件监视偶尔漏掉变更时,勾选态可能滞后)
  • 老配置自动升级:从 v1.0.x 升级时,旧 config.ini 缺少 require_password 键,工具会在加载时自动补上带注释的该配置项(此前升级用户在配置文件里找不到"开启密码"开关)

1.1.0 - 2026-07-14

新增

  • 密码可选:新增 require_password 配置项与托盘「开启密码」勾选项
    • 未启用(默认):按 回车再次按解锁快捷键 即可解锁,无需密码
    • 启用:需输入正确密码 + 回车
  • 「再按快捷键解锁」带防抖(arming),避免触发锁定那次按键的自动重复立即解锁

变更

  • 移除 ciqtek 兜底密码;默认密码为空、默认无需密码
  • 发布说明下载表格补齐 压缩包(zip) 下载角标(原先只有 exe)
  • 同步更新 README 与设计文档的解锁逻辑说明

1.0.1 - 2026-07-14

变更

  • 托盘右键菜单的版本号项改为可点击,点击直接打开 GitHub 发布页
  • 发布说明新增下载角标表格(x64 / x86 一键直达下载)
  • GitHub Actions 发布 x64 与 x86 两个架构

1.0.0 - 2026-07-14

首个正式版本。

功能

  • 全局快捷键 Alt + L(可配置)触发真黑屏锁定(覆盖全部显示器,而非息屏)
  • 输入密码回车解锁(默认 ciqtek,配置文件可改,明文)
  • 锁定期间阻止显示器息屏与系统睡眠
  • 配置文件热重载:密码 / 快捷键 / 开机自启改完保存即时生效
  • 配置双位置查找:exe 同目录 config.ini(便携优先)> %APPDATA%\BlackLock\config.ini
  • 无界面 + 系统托盘右键菜单:版本号 / 开机自启 / 暂停 / 配置 / 退出
  • 开机自启(注册表 Run,配置或托盘可开关)
  • 锁定期间拦截 Win / Alt+Tab / Alt+F4 / Ctrl+Esc 等切换热键
  • 多显示器与高 DPI 适配,分辨率变化 / 热插拔自动重铺
  • Ctrl + Alt + Del → 任务管理器 逃生口(黑窗自动让位,可鼠标结束进程)
  • 修复:用 Alt+L 触发时残留的修饰键“卡住”问题
  • 纯 C(C17)+ Win32,单文件、零第三方依赖,x64 约 30 KB / x86 约 26 KB
  • MSVC-only CMake 工程 + CMakePresets + GitHub Actions 标签自动发布(x64 & x86)