用途与实际影响
这项功能怎样使用
为什么需要它
原生泡泡初始化可能撞上动态壁纸的过渡画面,窗口层级也可能让其他桌面层插进来。另一个主动黑罩有自己的显示目的,不能由泡泡抢回来;这些冲突需要在各自入口处理。
举个实际例子
“动态壁纸别换掉,我打开主屏黑罩时泡泡也别冒出来。”泡泡启动时短暂停止同会话的Wallpaper Engine播放,等专属背景和泡泡窗口就绪后恢复;黑罩持有暂停标记期间,当前泡泡收起,新的空闲显示和主动预览都会让位。
最后我会得到什么
保留 Wallpaper Engine 原来的图片和设置;泡泡显示时短暂协调当前播放,外部黑罩开启时让位。黑罩结束后仍按本来的空闲规则决定是否显示。
正常工作
能认准当前壁纸播放时,泡泡准备好后尝试恢复播放;没有运行 Wallpaper Engine 就跳过协调。
发现问题
播放进程不唯一或恢复失败时报告实际状态,不把泡泡出现当成原壁纸已续播。
暂不可用
外部黑罩正在保护屏幕时泡泡主动让位,静态图片恢复仍可独立使用。
从哪里开始
启用泡泡后,由现有会话程序与 Wallpaper Engine 协调;若外部黑罩标记存在,泡泡让位。独立雨幕仍只是浏览器实验。
需要准备什么
- 是否要显示泡泡
- 看到动态壁纸或外部黑罩冲突时描述现象
从开始到拿到结果
- 1
先检查占用
看到外部黑罩标记就不显示泡泡,静态壁纸恢复也不改 Wallpaper Engine。
- 2
短暂停播再显示
能唯一识别播放进程时暂停它,准备背景和原生泡泡。
- 3
结束时尝试续播
收起泡泡后恢复播放并回读;失败报告真实状态,不把独立雨幕实验写成现役屏保。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
实现已核对,本轮未触发共存实屏关键规则与设计选择
只识别当前会话唯一wallpaper64进程,通过同目录wallpaper32的-control stop/play临时控制,不改播放列表、壁纸选择或持久配置。
现实现对Wallpaper Engine停止后等待2秒,再完成背景渲染与DWM合成;不是“毫秒级毫无等待”。
外部黑罩用同会话命名句柄表示仍需保护,退出自动释放,避免一个忘记清理的文件让泡泡永久暂停。
青雨雨幕参数已认可,不等于猫抠图方案通过;不把未接受的分层草稿当成壁纸新功能。
本模块用到的名词
- DWM(桌面窗口合成器)
- 等待背景确实进入一轮桌面合成后再初始化原生泡泡,减少取到暂态画面的机会。
- ExternalProtectionPause(外部保护暂停)
- 黑罩存续时持有的命名句柄;泡泡只读检查存在性,最后句柄关闭后恢复策略。
- 动态雨幕实验
- experiments/verdant-rain中的独立浏览器预览;保留已接受雨幕参数,不作为Windows动态壁纸或泡泡渲染器。
专业定义
说明Wallpaper Engine初始化协调、外部暂停标记,以及雨幕实验和系统图片的区别。
解决什么
控制器缺失、进程不唯一、命令非零退出或超时会导致本轮初始化失败;本轮没有证明实际暂停/续播画面。
当前怎样实现
- WallpaperEngineQuiescence解析当前会话wallpaper64的路径,取同目录wallpaper32.exe发stop/play;每个控制客户端等待上限3秒。进程不唯一或路径不可读会报错,不猜目标。
- VeilWindow在停止播放后等待2秒,显示背景,完成WPF Render和DwmFlush,再启动Bubbles并等窗口就绪;finally尝试恢复播放。0.1.26起检查控制进程非零退出并报错,但没有播放状态回读,因此命令成功仍不是播放画面证据。
- Local\EmeraldVeil.ExternalProtectionPause以initiallyOwned=false创建,只持有句柄;50ms策略轮询及UI应用前都会检查,避免排队显示越过刚出现的黑罩。观察者立即关闭自己的探测句柄。
- 外部标记存在时隐藏空闲显示与预览;消失后按当前enabled和idle继续,不改变超时、启动项或显示拓扑,也不另造会话暂停状态。
- 青雨雨幕保留vivid0.5、rain0.75、wind0、haze0.5、depth0、rainStyle1。Windows实际使用选定PNG,未接受的猫分层文件不进入构建或展示。
执行流程
- 1
需要显示泡泡时,先检查外部黑罩标记。
- 2
有唯一Wallpaper Engine渲染器时,通过其控制客户端停止播放,等2秒。
- 3
显示项目背景并等待合成,启动原生泡泡并等待对应窗口就绪。
- 4
在finally中尝试恢复Wallpaper Engine播放;失败不能称续播已确认。
- 5
外部标记后来出现时立即让位;标记消失后按原策略继续。
边界
- 不改Wallpaper Engine持久配置,也不提供通用壁纸引擎适配框架;当前识别是wallpaper64及其wallpaper32控制客户端。
- 不识别ToDesk、Sunshine等远程产品来决定暂停;黑罩必须通过明确的标记合作。
- 猫分层视觉实验已停止,只有用户重新明确启动才重开;无需把失败草稿搬进网页作为能力。
失败与恢复
- 多个当前会话渲染器或控制客户端不存在
- 拒绝猜测并结束本轮显示尝试,不随意停止其他壁纸进程。
- 背景/原生窗口初始化或播放控制超时
- 隐藏背景,finally尝试续播;当前实现没有远端或WE播放状态验收,不承诺画面已恢复。
- 外部黑罩持有者崩溃
- 最后句柄关闭后标记自然消失,恢复已有空闲和暂停策略;不留下持久暂停文件。
真实入口
src/EmeraldVeil.App/WallpaperEngineQuiescence.cs当前会话识别、控制命令与超时。
src/EmeraldVeil.App/VeilWindow.cs / VeilController.cs两秒等待、背景合成与UI前重查。
src/EmeraldVeil.Core/ExternalProtectionPause.cs句柄存在性检查。
experiments/verdant-rain/ART_DIRECTION.md / assets/windows-background.json已接受画面参数和未接受方案边界。
如何验证
- 本轮源码核对确认2秒停止等待、3秒控制客户端超时、finally续播和外部标记双重检查。
- 外部暂停测试使用随机测试名称验证句柄生命周期,没有持有实际生产黑罩标记。
- Wallpaper Engine现场进程存在,不代表本轮已实测泡泡共存;没有启停它或触发泡泡。
与其他模块的关系
原生泡泡共存是一条运行机制;动态雨幕属于独立实验,Windows桌面与锁屏实际采用已保存的静帧。
