ProxiLock 是一个 WinUI 3 隐形锁工具:程序常驻系统托盘,按蓝牙、可移动磁盘或空闲时间条件锁定交互,并用 Ctrl+Shift+L 全局解锁。
在 Windows 10 2004(内部版本 19041)或更新版本上构建,安装 global.json 指定的 .NET SDK(当前为 10.0.302,允许同一功能区间的后续补丁)。Windows App SDK 通过 NuGet 还原。项目固定为 x64/win-x64,无需额外传入 -p:Platform=x64。
dotnet restore ProxiLock.csproj --locked-mode
dotnet build ProxiLock.csproj -c Release --no-restore
dotnet run --project tests/ProxiLock.Regression -c Release
dotnet publish ProxiLock.csproj -c Release -r win-x64 --self-contained true发布输出是一个目录,位于 bin\x64\Release\net10.0-windows10.0.19041.0\win-x64\publish。请保留整个目录并双击其中的 ProxiLock.exe;Windows App SDK 的原生 DLL、Bootstrap DLL 和 .pri 资源必须与 EXE 放在一起。单文件模式会让 WinUI 3 在 Application.Start 阶段无法激活 COM 工厂(0x80040111),项目已默认关闭该模式。回归入口是独立控制台项目,断言失败会以非零码结束;请执行上面的 dotnet run,不能用对主工程运行 dotnet test 作为回归验证。
NuGet 源固定在 NuGet.config,依赖版本和内容哈希记录在 packages.lock.json,正常还原启用锁定模式。更新 SDK 或依赖的步骤见修复记录。
配置位于 %LocalAppData%\ProxiLock\config.json。保存先写入唯一临时文件并刷盘,再替换主文件;已有配置正常替换时保留上一版 config.json.bak。单个配置文件限制为 64 KiB。
只有主文件和备份都不存在时,程序才按首次安装加载默认设置。主文件损坏、过大或无法读取时,会尝试读取备份,并在设置页显示恢复提示;二者均无法读取时,程序显示“自动锁定已停用”的提示并打开设置页,不会静默假装原策略仍在运行。检查设置后重新保存即可退出恢复状态。恢复后的首次保存会保留已知可读的备份,避免用损坏主文件覆盖它。
- 蓝牙监控结合 BLE 广播与 Windows 报告的已配对设备连接状态。RSSI 只在 4 秒内参与新的阈值判断,列表也不会继续显示过期读数;有 RSSI 的设备采用 5 dB 回滞区间减少临界值抖动。失去有效证据约 20 秒后判定缺席,还需缺席确认 5 秒才触发锁定。设置阈值且设备曾报告 RSSI 时,RSSI 过期 20 秒即判定缺席,即使连接状态仍在更新。连接读数 15 秒无成功更新即失效。经典蓝牙设备不提供 RSSI 时,阈值不适用,界面会提示以连接状态判断。
- 未配对且使用随机地址的蓝牙设备不能作为新选择保存。停止监控会清除当前扫描证据和设备句柄;重启后等待新观测,旧异步查询不能重新写入新会话。解除配对会在下一次成功的配对列表刷新后反映到界面。
- U 盘列表枚举可移动盘及由 WMI 识别为 USB 的固定盘,优先保存
PNPDeviceID,不可用时使用卷序列号。WMI 表缓存 5 秒;复用缓存时,必须确认当前卷序列号与缓存记录一致,不能仅凭相同盘符识别原设备。无法以序列号验证缓存关联时,会重新查询 WMI,避免只在缓存刷新时识别成功。没有硬件 ID 或卷序列号的设备可以出现在列表中,但不能选作凭证;旧的DRIVE:E:一类盘符配置会显示迁移提示并暂停该 USB 策略,直到重新选择设备。WMI 不可用且无法确认原标识时,设备可能被判定缺席。扫描在后台执行,一块盘在扫描中拔出不会中断其他盘的检查。 - 锁定覆盖层按显示器创建无激活、置顶、近乎完全透明的原生窗口;覆盖完整显示器矩形(含任务栏),不含标题栏/系统菜单。锁定期间约每秒校对一次:新增显示器会被补上,移除的显示器对应窗口会被回收,已有覆盖就地刷新。覆盖层建立或刷新失败时会尝试释放拦截资源,并提示当前未锁定。
- 首次启动会先加载配置并等待设置页完成初始化后再启用策略评估;重复启动会被单实例互斥体拒绝。
- 设置页采用
NavigationView+SettingsCard分区结构,托盘左键/双击打开设置,右键显示菜单。文本编辑使用 400 ms 防抖保存,正常退出前会提交尚未执行的有效编辑;保存失败的设备选择会回退到已保存值,相同值不会重复落盘。 - 锁定/解锁提示优先使用托盘气泡通知,未打包环境下 Toast 通常不可用,失败时回退到系统提示音。
- 空闲解锁后会自动重新开始计时;蓝牙与 U 盘的解锁会保留“手动解锁”状态,直到设备重新被检测到,避免反复锁定。
ProxiLock 是输入拦截便利工具,不是安全防护,请勿依赖它保护敏感数据:
- 覆盖层本身近乎全透明,屏幕内容始终可见,它锁的是输入而不是画面。
- 进程可以被任务管理器结束;
Ctrl+Alt+Del属于系统级安全序列,无法被拦截。 - 任何具有置顶权限的程序都可能短暂把窗口压到覆盖层之上,ProxiLock 通过每秒重新置顶来缩短这个窗口期,但无法根除。
- 键盘钩子或覆盖层初始化失败时不会报告锁定成功,会清理已创建的资源并提示失败。
- 蓝牙模式依赖广播地址和 RSSI,附近设备可以伪造这些信号;它不能证明设备持有配对密钥。
- USB 硬件 ID 和卷序列号也不构成密码学认证;能克隆相应标识的设备不在本工具的防护范围内。
- 解锁快捷键会拒绝
SendInput等注入事件,但具有足够权限的程序仍可结束 ProxiLock 或控制桌面。 - 发布物目前没有代码签名,Windows SmartScreen 可能提示未知发布者;签名需要发布者自己的证书。
本项目以 GNU General Public License v3.0 发布,SPDX 标识为 GPL-3.0-only。你可以自由使用、修改和分发本项目,但衍生作品必须同样以 GPL-3.0 开源,并提供完整源代码。