有人突然靠近时,程序可能只需要遮挡当前窗口;用户已经离开时,同一程序又要处理登录会话和已打开的私密文件。超级看门狗 SuperWatchDog 是 Windows 本地隐私保护工具,使用用户预设的自动触发覆盖有人突然靠近、来不及操作电脑,以及离开后没有及时保护三类情况,并提供本地加密文件保险箱。
从系统设计看,电脑防窥不是单一动作,而是“事实采集—状态确认—暴露评估—计划执行”的数据流。各层职责混在一起,就会出现设备一抖动便重复锁屏、动作执行一半又读取新配置等问题。
暴露面与信号源必须解耦
暴露面描述保护对象:
VisibleContent 当前窗口或通知正在显示
AccessibleSession Windows 会话可继续操作
ReadableFiles 私密文件仍处于已打开边界
信号源描述观察渠道:
Manual / USB / Bluetooth / Vision
蓝牙断开不是“锁屏”的同义词,摄像头确认也不是“关闭窗口”的同义词。信号确认后,策略层才根据当前暴露和用户选择建立动作计划。
统一事件只保留稳定字段
record TriggerFact(
string Source,
string Subject,
string Kind,
long Revision,
DateTimeOffset ObservedAt);
原始回调只产生 TriggerFact。它不读取窗口列表,也不直接操作资源。这样来源确认逻辑可以独立测试,新增信号源也不会复制执行链。
状态确认使用可撤销候选
Observed
↓
Candidate(revision)
├─ 新事实相反 → Cancelled
└─ 规则满足 → Confirmed
async Task<TriggerFact?> ConfirmAsync(TriggerFact fact)
{
var revision = revisions.Advance(fact.Subject);
await rules.For(fact.Source).ObserveAsync(fact);
if (!revisions.IsCurrent(fact.Subject, revision))
return null;
return facts.StillMatch(fact) ? fact : null;
}
版本检查解决旧任务晚到的问题。不同来源的观察规则可以不同,但不需要让后续策略知道具体细节。
计划快照避免执行中漂移
ActionPlan CreatePlan(TriggerFact fact, Exposure exposure)
{
var selected = policy.Match(fact, exposure);
return ActionPlan.Freeze(
eventId: fact.Revision,
steps: selected.DistinctBy(x => x.StableId));
}
计划一旦进入执行,本次步骤就不再随设置界面变化。后续修改只影响下一次事件。
SingleFlight 与幂等不是一回事
SingleFlight 只保证同一时刻一条动作链运行;进程重试或迟到消息仍可能再次请求同一步骤。每一步执行前还要检查目标状态:
async Task<StepResult> RunStepAsync(ActionStep step)
{
if (await probe.IsSatisfiedAsync(step))
return StepResult.AlreadySatisfied(step);
return await executor.ExecuteAsync(step);
}
完整流程:
多来源原始变化
↓
统一 TriggerFact
↓
候选确认与撤销
↓
暴露评估 + 动作快照
↓
SingleFlight
↓
逐项幂等执行
↓
全部完成 / 部分完成 / 未完成
逐项结果比单个布尔值重要。某个显示动作失败,不应抹掉会话或文件保护已经完成的事实。
应用到电脑防窥
侧面视角主要由屏幕方向和防窥膜处理。软件适合处理当前内容、Windows 会话和本地文件:人在电脑前时可选择影响较小的窗口动作;确认离开后更需要锁屏;长期私密文件则应具有独立加密边界。
超级看门狗把手动、USB、蓝牙和可选视觉信号归入用户预设保护流程,同时提供本地加密文件保险箱。它不会把隐藏窗口写成文件加密,也不会因为某个自动信号存在就承诺绝对不会误判。真正可维护的电脑防窥系统,依赖的是分层、快照、幂等和可解释结果,而不是触发器数量。