本项目遵循语义化版本。
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-artifact、actions/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/x64、dist/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)