用途与实际影响
这项功能怎样使用
为什么需要它
远程软件或设备可能发出指针位置根本没变的消息,导致屏保永远等不到空闲,或刚出现就消失。这里判断事件而非软件名字,同时保留正常输入、可靠计时和故障退出路径。
举个实际例子
“我去倒杯水,六分钟后再显示泡泡,回来动鼠标就继续。”程序运行且启用时按这个规则等待;一条无位移消息不会打断计时。若主动点托盘的15秒预览,则让这段预览显示完,期间输入不会提前结束。
最后我会得到什么
显示原生泡泡及本次选定背景,正常输入后隐藏窗口并结束受管进程;主屏不可用时不显示。源码与配置可核对,实体像素、远控画面和自然开机需单独观察。
正常工作
本人离开六分钟且空闲判断可靠时显示泡泡,正常操作回来就收起。
发现问题
泡泡意外退出而本人仍不在时可以稍后再试;本人已回来就不重新盖住屏幕。
暂不可用
输入状态不可靠、本人暂停或系统泡泡组件缺失时不自动显示,也不抢已有实例。
从哪里开始
先运行 scripts/Install-EmeraldVeil.ps1 -Action Install,再运行 scripts/Set-NativeBubbles.ps1 -Action Enable;日常等六分钟空闲,也可用托盘“立即启动”或 15 秒预览。
需要准备什么
- 是否启用六分钟空闲泡泡
- 这次要立即启动还是只做 15 秒预览
从开始到拿到结果
- 1
启用并待机
程序观察可靠输入和实体屏,主屏关闭或状态不可信时保持待命。
- 2
空闲才显示
达到 360 秒并无外部暂停时,显示背景和系统原生泡泡。
- 3
输入即结束
活动输入或停止动作收起本轮画面;异常退出可在仍空闲时重试,不能把泡泡当安全锁屏。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
六分钟配置与常驻程序已恢复关键规则与设计选择
零位移WM_MOUSEMOVE被过滤;孤立的注入移动仍送给应用,只暂不计为空闲活动。250ms内出现第二次注入移动才确认连续活动。
物理移动、确认连续注入、按钮、滚轮和键盘都算活动;不记录按键内容、坐标历史或工具名单。
托盘预览15秒刻意不因输入结束;--show-now入口和自然空闲显示会因输入收起,不能把两种体验写成相同。
Windows主屏的物理矩形决定画面位置;泡泡大小由原生实现决定,显示/DPI(显示缩放)改变后先停止旧实例,再按当前状态重建。
本模块用到的名词
- GetLastInputInfo
- 系统最近一次输入时间,结合窄事件分类计算是否可靠空闲。
- Job Object(作业对象)
- 本次启动的泡泡归属一个关闭即杀子进程的系统对象,退出不靠寻找并接管别人的实例。
- Color-key(色键透明)
- 只把原生泡泡窗口的黑色设为透明,让紧贴其下的项目图片显露。
专业定义
六分钟输入判断、两层画面与原生进程恢复,保留Windows自己的泡泡材质和运动。
解决什么
本轮修复前发现注册表超时600与运行时360不一致,且常驻程序没有运行;现已恢复。不能由37项测试通过再推定实屏和远端画面也已通过。
当前怎样实现
- 50ms采样配合IdleTimeline处理输入时钟;原始tick先于分类到达时先挂起一轮,下一轮仍未分类则算活动,不无限忽略未知输入。
- 启用后以系统Bubbles.scr /s启动,不依赖Windows自动屏保触发。会话文件租约和同会话只读进程检查避免重复启动,已启动子进程归kill-on-close作业对象。
- Per-Monitor V2(每显示器DPI感知)在窗口创建前生效;Screen.PrimaryScreen.Bounds定位目标。选择交叠主屏的原生窗口,隐藏同进程其他可见窗口,不提供多屏任意排布配置器。
- WPF背景是不透明图片但输入穿透、不激活;原生泡泡加LAYERED、TRANSPARENT、NOACTIVATE、TOOLWINDOW和置顶。背景每100ms保持在所选泡泡HWND下,原生窗口每250ms维护边界与样式。
- 原生窗口连续8次、约2秒维护失败才结束渲染器;状态协调在仍应显示时按1秒退避恢复。输入先隐藏窗口,再完成进程收口,50ms是采样周期而非所有机器的绝对完成时限。
- Radius DWORD 1130000000解释约218.43;当前Windows原生/s钳制最大半径200,名义直径400物理像素。4K下原生公式约26颗,不写SphereDensity,缩放比例不用于计算泡泡大小。
- Ctrl+Win+E复用现有低级键盘观察器,由驻留进程唯一拥有;只消费该组合,全部松键并稳定约250ms后建立输入基线。托盘双击/立即启动是真屏保直到输入或禁用,preview才限15秒。正常输入继续交给应用,不另建全局热键服务。
执行流程
- 1
读取输入,形成可靠空闲或活动观察。
- 2
检查实际实体屏、enabled、明确启动/预览和外部保护标记;实体屏关闭则待命,不改投到VDD。
- 3
可靠空闲达到360秒后准备背景,取得本会话租约并启动系统泡泡。
- 4
维护两层位置和原生窗口,持续对照实际渲染器是否存在。
- 5
活动或停止时隐藏并收口;仍空闲但渲染器不在时按退避重试。
边界
- 使用Windows已安装的Bubbles.scr,不复制微软二进制或重画泡泡。
- 原生边缘、碰撞与数量由Windows决定;不承诺每颗泡泡始终完整在屏幕内。
- 不做屏幕捕获、网络或持久活动记录;泡泡也不能保证防止OLED烙印。电池模式先息屏是另一条系统策略。
失败与恢复
- 原生泡泡缺失或已有实例
- 缺失报错;重复实例拒绝启动且不接管它。仍满足显示条件时后续可重试。
- 输入分类没有及时给出结果
- 原始变化先挂起一轮,下一次仍未知就计为活动,保持可退出。
- 渲染器退出或显示/DPI(显示缩放)改变
- 停止旧实例;仍需显示则按状态与退避重新建立,不维持两个并存窗口。
真实入口
src/EmeraldVeil.Core空闲、分类、策略和状态协调。
src/EmeraldVeil.App/NativeBubblesLauncher.cs / VeilWindow.cs真实进程、Job Object(作业对象)及两层窗口。
src/EmeraldVeil.App/VeilController.cs / TrayIconHost.cs50ms循环、15秒预览与托盘控制。
docs/product-design.md显示、尺寸、输入和验收边界。
如何验证
- 9月8日37项测试通过,含原36项核心/源码约定与新增控制命令非零退出回归;这组记录不改称0.1.27新测试。
- 9月8日恢复后只有一个当前会话常驻程序,配置Verify通过;本轮未主动预览、改变空闲时间或注入输入。
- 真正的窗口层级、崩溃后无残留和退出延迟仍需对应实机验证,不从单元测试推定。
与其他模块的关系
泡泡背景优先来自VDD当前Wallpaper Engine材料的一次快照,缺失才用VDD的Windows壁纸;静态黑猫桌面/锁屏恢复是另一条独立能力,不再以固定嵌入图解释全部背景。
