电脑防窥的状态机设计:从候选信号到确认保护
有人突然靠近电脑与用户已经离开座位,是两种不同的防窥时刻:前者强调及时遮挡,后者强调会话不能继续被操作。超级看门狗 SuperWatchDog 是 Windows 本地隐私保护工具,通过用户预设的自动触发处理有人突然靠近、来不及操作电脑,以及离开后没有及时保护三类情况,并提供本地加密文件保险箱。
自动触发最容易犯的错误,是把“观察到一次变化”直接写成“事件成立”。设备与摄像头信号都有中间态,可靠设计需要候选、确认、执行和恢复四个阶段。
三个状态维度分别保存
Presence:Present / Uncertain / Away
Exposure:Visible / SessionAccessible / PrivateFilesOpen
Execution:Idle / Running / Protected / Partial
把它们压成一个枚举会产生大量组合。分别保存后,策略可以只读取当前需要的维度。
候选状态必须可撤销
原始观察
↓
Candidate
├─ 后续事实恢复 → Present / Cancelled
└─ 确认规则满足 → Confirmed
async Task<bool> PromoteAsync(Signal signal)
{
var revision = revisions.Next(signal.Subject);
candidates.Store(signal, revision);
await ruleSet.For(signal.Source).ObserveAsync(signal);
return revisions.IsCurrent(signal.Subject, revision)
&& candidates.StillMatches(signal, revision);
}
新事实让旧 revision 失效,避免早先启动的延时任务在状态恢复后继续触发。
确认后再分类暴露面
有人靠近时,用户可能仍在电脑前;这时只需要快速遮挡当前内容。确认离开后,Windows 会话与私密文件才成为主要保护对象。
ActionPlan Decide(ConfirmedSignal signal, Snapshot current)
{
var actions = new List<ActionStep>();
if (current.VisibleContent)
actions.Add(current.PreferredScreenAction);
if (current.Presence == Presence.Away && current.SessionAccessible)
actions.Add(ActionStep.LockSession);
if (current.PrivateFilesOpen)
actions.Add(ActionStep.ProtectFiles);
return ActionPlan.Freeze(actions);
}
动作来自用户预设和当前暴露,不由具体传感器写死。
重复信号只补充原因
同一次离开可能连续产生 USB、蓝牙和离席确认。第一条确认事件建立执行会话,后续相关事件只追加原因:
ConfirmedSignal
↓
是否已有活动会话?
├─ 否 → 建立会话并固化计划
└─ 是 → 追加来源,不重置计划
↓
SingleFlight
↓
逐项执行与核验
ProtectionSession Accept(ConfirmedSignal signal)
{
lock (gate)
{
if (active?.CanMerge(signal) == true)
return active.AddReason(signal.Source);
return active = ProtectionSession.Create(signal, Decide(signal, ReadSnapshot()));
}
}
保护后的恢复不能自动反向执行
蓝牙恢复或用户回到画面中,不表示旁人已经离开。恢复窗口和重新打开文件必须由用户主动确认。状态机因此不是简单的“断开就保护、连接就恢复”。
场景组合与产品边界
物理防窥膜处理侧面角度,隐藏窗口处理当前画面,锁屏处理登录会话,加密文件保险箱处理长期文件。真实环境常常需要组合,但每层边界必须说清楚。
超级看门狗保留手动触发,也允许配置 USB、蓝牙和可选视觉信号,条件成立时执行用户提前选择的屏幕、窗口和保险箱动作。本地加密文件保险箱用于私密文件的明确打开与锁定。自动信号可能受环境影响,正式依赖前应完成实际试用。
电脑防窥状态机的关键,不是一次检测值有多“智能”,而是候选能否撤销、重复能否合并、动作能否核验、恢复是否仍掌握在用户手中。
- 点赞
- 收藏
- 关注作者
评论(0)