用途与实际影响
这项功能怎样使用
为什么需要它
睡眠或远程屏幕断接后,屏幕可能黑掉、壁纸停动,任务列表却显示程序还在。恢复前先确认主屏和两块副屏现在究竟是哪一个,避免一遍遍重启或把窗口搬错。
举个实际例子
远程虚拟屏断开再回来,水冷屏卡片仍在正确位置,背景却不动了。系统等显示器稳定,确认原壁纸确实连着这块屏后只让它重绑一次;条件不全就先留静态背景并告诉我缺什么。
最后我会得到什么
已实测的机箱屏异常退出后可由同一入口重新接回,人工停止不会自行反弹。水冷屏壁纸的自动重绑仍缺这轮真实实体观察;现在只报告是否符合条件、是否发出请求,不把“已请求”写成壁纸真的动了。
正常时
目标屏和原壁纸程序都确实吻合,变化稳定后只尝试一次,并以实体画面确认是否恢复。
发现问题时
屏幕还在变化或目标不健康时等待;一次尝试失败就停一段时间,不循环闪屏。
入口不可用或证据不足时
缺水冷屏、当前壁纸程序或交互桌面时不控制壁纸;静态背景保留,可能需要本人用原软件恢复。
从哪里开始
双副屏在登录、睡眠唤醒或远程显示器断接后出问题时,在已接入项目的本机 AI 对话中说明事件和哪块屏异常。
需要准备什么
- 异常发生的电源或显示事件
- 主屏、HS2 和虚拟屏现状
- 目前壁纸和浮层表现
从开始到拿到结果
- 1
定位本次变化
看门狗核对唯一进程、设备模式、主屏和 HS2 身份,先等待拓扑稳定。
- 2
只恢复匹配组件
旧串口写入者退出后恢复屏幕;符合条件时让现有 Wallpaper Engine 对现有场景重绑一次。
- 3
以实体画面收口
确认壁纸真的继续动、浮层仍在正确屏;命令已分派但肉眼未证时保留未验状态,不循环改显示设置。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
9月7日同VBS异常退出接回与明确停止已实测,本人确认TURZX正常刷新;睡眠、断电、HS2和壁纸拓扑恢复仍分别待验关键规则与设计选择
只有一个长期 watchdog 处理 resume;旧事件任务保持禁用。
同一隐藏VBS同步等待watchdog;非0退出等待30秒再启动,0退出结束。StopSideScreenStack -IncludeWatchdog同时停止精确VBS,人工停止不会触发自动接回;不增加任务、服务或并行看门狗。
普通窗口保护和完整浮层启动是两道门:前者在识别到 2288×1048 目标后即可执行,不等控制器、浮层进程或完整显示路径验证;后者仍要求 Secondary 模式与保存绑定连续两次健康,不能把已搬回窗口当成 HS2 Active。
登录启动的前 180 秒用独立 250 ms 窗口保护循环覆盖阻塞恢复期,循环随父 watchdog 退出;它只搬移普通窗口,无其他安全屏时先最小化,永不搬动 HS2 浮层、Wallpaper Engine 或桌面外壳。
已有 Secondary 绝不先降级,native 每 epoch 只尝试一次提升。
Secondary 提升失败只收起旧浮层并等待显示链恢复,保留当前或请求的 Secondary 模式;不发送 SetSecondaryScreen(false) 降回原生,也不重置本周期已经用过的一次尝试。
三次连续失败后 30 秒熔断,先证明旧 stream 释放 COM。
壁纸恢复只比较活动显示器 DeviceName 与 IsPrimary;HDR、坐标、分辨率以及没有改变这两类身份的 DXGI 波动不触发。首次健康观察只立基线,不重启渲染。
恢复门要求至少两块活动屏、唯一可用主屏与唯一非主2288×1048 HS2,并核对MONITOR\TUR0000身份及HS2 Secondary + 8091/AD23/MI_00/LED绑定。MTT1337只有参与活动桌面时才要求唯一且Root\MttVDD后端健康;物理主屏关闭或远程主屏变化不再因总屏数不是3而拒绝,身份歧义或相关设备异常仍等待。
背景进程身份来自当前 watchdog session 内 wallpaper64 的真实路径;只有推导出唯一同目录 wallpaper32.exe 且当前 session 至少有一个 explorer shell 时,才用 Shell.Application 在普通用户桌面分派控制命令。
默认 15 秒探测、30 秒稳定、900 秒冷却、stop/play 间隔 1500 ms;一次失败也消费该拓扑事件。它不从 Highest watchdog 启动常驻 wallpaper64、不打开 GUI、不写配置,也不自动反复重试同一事件。
绑定 LIAN LI 设备出现 Code 10 时立即失败关闭,只给出关机后检查 USB 排针、线缆和辅助供电的行动提示;不重启 Hub、不移除设备、不扫描 PnP。
A108 或端点缺失进入物理恢复:断电后只用主板 USB 2.0 9-pin 直连或官方 EDGE HUB,随附一分二 Hub 不承载 LCD;供电不足再接 SATA。
改变接线后,唯一 8091 + port 2 controller + port 3 LED 拓扑必须连续两次健康才允许换绑。
本模块从已经建立的本机安装态开始;clean clone、厂商文件、private(私有) config、首次双屏绑定和启动任务安装属于独立安装与换机模块。
普通恢复不重启 Hub、不删设备、不做 PnP scan,也不改物理主屏、远程虚拟屏、分辨率、刷新率、HDR、缩放或捕获目标。
本模块用到的名词
- epoch(一次启动/恢复周期)
- 每次正常启动或 resume 的一次机会;失败不会在同一周期无限重试模式。
- preserve-current-mode(保留当前模式)
- 先接受固件和 Windows 已成功枚举的模式,再决定是否需要切换。
- RunLevel Highest(最高用户运行级别)
- 交互用户任务的提升级别,不是 SYSTEM,也不扩大设备授权;壁纸控制仍经当前用户 shell 分派。
- topology baseline(拓扑基线)
- 第一次完整健康观察得到的活动设备名 + 主屏归属;建立基线本身不触发 Wallpaper Engine。
- stability window(稳定窗口)
- 新指纹必须连续保持 30 秒;任何再次变化会重新计时,避免插拔过程中反复恢复。
- cooldown(冷却)
- 每次真实分派无论成功或失败都留下 900 秒节流;同一事件被消费,避免 stop/play 循环。
专业定义
由一个长期 watchdog(看门狗)协调两块屏:保留已成功枚举的模式、证明旧 owner 退出、限制 Secondary 尝试;显示器身份或唯一主屏归属变化后,只有当前主屏、唯一HS2及参与桌面的MTT与背景进程身份都健康,才让既有 Wallpaper Engine 做一次有界渲染重绑。
解决什么
解决双恢复 Owner、显示模式抖动、串口竞争、任务假成功退出、睡眠后窗口乱跑、拓扑变化后 Wallpaper Engine 仍绑定旧渲染面、只看进程的假健康,以及过度 USB/PnP 修复。
当前怎样实现
- 计划任务由既有wscript无窗口父适配器启动长期PowerShell watchdog。StartSideScreenWatchdog-Hidden.vbs使用shell.Run(command, 0, True)同步等待,非0退出经WScript.Sleep 30000后再启动、0退出结束;替代watchdog仍先走原有旧sender退出与独占串口检查。
- StopSideScreenStack.ps1 对metrics agent停止错误如实传播,并等待目标PID退出与127.0.0.1:18765可独占绑定;超时返回残留PID/端口占用,不静默报告完成。
- 普通窗口的可见边界即使只部分跨入HS2,也由Get-HS2ExclusiveWindowGuardPlan移回安全主屏范围;非HS2归属的最小化或最大化窗口不按此交叠规则误搬,既有浮层/壁纸/外壳排除保持。
- StopSideScreenStack.ps1带-IncludeWatchdog时也结束精确的本项目隐藏VBS入口,避免人工停止在30秒后被接回;普通退出保持最终结束,不把任务计划程序的RestartOnFailure当作唯一兜底。
- Windows事件若把RTSSHooks64.dll标为原生崩溃模块,由PCConfig维护powershell.exe单个RTSS Profile:[Hooking] EnableHooking=0,并通过官方SDK回读AppDetectionLevel=0。此设置不更改游戏/壁纸配置,也不保证已经驻留的DLL立刻卸载。
- StartSideScreenWatchdog 在 Set-ActiveDisplayState 的阻塞恢复前先启动 `Invoke-HS2StartupWindowGuard.ps1` 并立即执行普通窗口保护。子循环绑定父 PID 与创建时间,默认 DurationSeconds=180、PollMilliseconds=250;父退出或时限到就结束,并输出有界 hs2-startup-window-guard.json 与启动错误证据。
- `Get-HS2ExclusiveWindowGuardPlan` 不要求已有浮层 PID:优先已知目标,再按 2288×1048 几何优先选择非主屏;安全落点优先已知安全屏/主屏,再取其他屏最大工作区,无可用落点才最小化。窗口按可见性、cloaked(隐藏合成状态)、有效尺寸和排除进程过滤,无激活迁移;这不是完整控制器拓扑认证。
- Get-VddWindowReturnPlan以EnumDisplayDevices报告的MONITOR\PHLC34B与MONITOR\MTT1337绑定当前活动输出,不持久依赖DISPLAY编号或Windows主屏标志。任一目标缺失、歧义或重合就返回具名状态、零动作。
- 窗口坐标使用Per-Monitor V2(逐显示器DPI感知);未最小化时优先DWM扩展可见边界,避免隐形边框触发误搬。整个窗口归VDD时映射回主屏;仍归主屏但可见框与VDD相交时,只做包含所需的位移和限宽高。最小化窗口使用保存位置。
- 沿用普通窗口排除:HS2浮层、Wallpaper Engine、Shell、隐藏或cloaked窗口等不参与。StartSideScreenWatchdog启动及维护循环调用既有保护函数;NoWindowPreservationPolicy可跳过,没有新增常驻组件。真实MoveWindowPlacement结果分别收为AppliedActions和FailedActions。
- WMI 电源订阅统一处理 suspend/resume,与 live process/COM owner 合并。
- HS2 模式按 actual enumerated state(实际已枚举状态)保留,绑定必须连续两次健康。
- TURZX suspend 停 stream 并用 command 123 亮度 0;恢复先还亮度再启动。
- WindowsDisplayWindowPolicy.ps1 通过 EnumDisplayMonitors/GetMonitorInfo 只读捕获活动屏 DeviceName、IsPrimary 和几何;Get-WallpaperEngineTopologyFingerprint 只保留前两项并排序,避免 HDR 或布局细节造成误触发。
- HS2ActiveRecoveryPolicy.ps1 仅在MTT参与活动桌面时用窄 PnP 查询核对唯一 DISPLAY\MTT1337\* 和 ROOT\DISPLAY\* 后端,并逐项读取 IsPresent、ProblemCode 与 HardwareIds=Root\MttVDD;HS2桌面身份和既有USB绑定分别核验。
- Get-WallpaperEngineRebindDecision 维护 baseline、pending fingerprint、pendingSince 与 lastRebind;状态机区分 WaitForTopology、Baseline、Healthy、Stabilizing、WaitForHealth、Cooldown 和 Rebind。
- Resolve-WallpaperEngineControlExecutable 只接受当前 session 的 wallpaper64,读取其真实路径并解析同目录唯一 wallpaper32.exe;Invoke-WallpaperEngineRenderRebind 要求当前 session 有 explorer,再通过 Shell.Application 隐藏分派 stop/play。
- 任何 probe(探测)或控制错误只写有界状态日志;失败分派也更新 baseline 与 lastRebind,因而不在同一拓扑上循环。没有持久配置变更可撤销;若 stop 后 play 未恢复,原场景/设置仍归 Wallpaper Engine,Windows 静态背景与其用户控制是回退面。
- 指标端点归属与旧进程退出分别核对,不用进程名称或端口存在冒充健康;旧端点死但进程还在时等待18765释放,再在单Owner条件下替换。重复流退出或心跳停滞进入30秒有界冷却,先证明旧COM占用已释放;重启失败作为回执留在长驻Owner中,不让异常直接把任务退成Ready。
- 现有共享窗口策略在显示身份明确时独立于HS2 secondary-mode与overlay readiness运行;空快照无动作。排除Bubbles、Emerald背景、blackout、instrument overlay、Wallpaper Engine及shell,防止当作普通窗口搬移或最小化,不修改显示拓扑。策略版本通过原启动入口受控重启加载,不增加周期脚本重载器。
执行流程
- 1
登录后由原隐藏VBS启动唯一watchdog,并同步等待它的退出结果;异常退出等30秒后进入同一启动流程,正常退出结束。
- 2
在控制器恢复可能阻塞前启动 250 ms / 180 秒的普通窗口保护并立即检查一次;即使浮层还不存在也能处理误入小屏的普通应用。
- 3
检查当前控制器模式、设备绑定和旧 owner。
- 4
已有 Secondary 原位验证;实际 native 稳定 30 秒后至多提升一次。完整模式/绑定双样本通过才启动浮层,失败则保留模式、停止旧浮层并等待,不主动降级。
- 5
每 15 秒只读捕获活动显示器身份、唯一主屏与 HS2 Secondary 绑定;只有MTT参与活动桌面才查询其PnP后端,首次完整健康只保存 baseline。
- 6
发现设备名或主屏归属变化后保存 pending 指纹;30 秒内又变化就重新计时,可用主屏或唯一HS2缺失、身份歧义、参与桌面的MTT/HS2不健康都停在 WaitForHealth。
- 7
变化稳定且距上次尝试满 900 秒时,从本会话 wallpaper64 解析同目录 wallpaper32,并经 explorer shell 分派 stop,等待 1500 ms,再分派 play。
- 8
分派成功后等待用户看到原动态壁纸在 HS2 浮层下恢复;主机状态只记为命令已分派,不冒充像素恢复。分派失败则记录 control-client-unavailable、user-shell-unavailable 或 control-dispatch-failed,消费本事件并停止重试。
- 9
若 A108 或显示端点缺失,停止软件恢复并正常关机、断开整机电源。
- 10
把 OLED USB 主线直连主板 USB 2.0 9-pin 排针或官方 EDGE HUB;不用随附一分二 Hub 承载 LCD,供电不足时接 SATA。
- 11
重新上电后核对唯一 8091、port 2 controller 和 port 3 LED,连续两次健康才更新绑定。
- 12
按实际状态启动两块屏。
- 13
持续检查 heartbeat、进程和电源事件。
- 14
故障时熔断并精确恢复。
- 15
睡眠/关机按各屏合同收口。
边界
- 修复入口会真实影响副屏,必须先核对精确目标;网站刷新只读。
- 壁纸恢复只作用于现有 Wallpaper Engine 控制接口:不切换 Windows 显示拓扑、不改主屏、不改分辨率/刷新率/HDR/缩放/捕获目标,不打开 Wallpaper GUI、不写场景或配置,也不创建服务、计划任务或高权限常驻渲染器。
- wallpaper64 存在只说明候选进程;必须同一 session、能读取真实路径、解析到唯一同目录 wallpaper32,并存在当前 session explorer shell,才有控制资格。
- stop/play 的 Dispatched=true 只证明 ShellExecute 已接受两次调用,不证明 Wallpaper Engine 完成渲染,更不证明 HS2 实体像素已经运动。
- 一次分派中 stop 成功而 play 失败没有自动 rollback(回滚)事务;产品以不改配置、Windows 静态背景和 Wallpaper Engine 自身用户控制保持可恢复,并用事件消费 + 长冷却避免更坏的自动循环。
- 内部 USB 排针不得带电插拔。
- 随附一分二 Hub 不支持 LCD;只能使用主板 USB 2.0 9-pin 直连或官方 EDGE HUB,供电不足时才补 SATA。
- 接线改变后的单次枚举不够;唯一 8091、port 2 controller、port 3 LED 拓扑必须连续两次健康才换绑。
- 9月7日曾重新启动TURZX软件链并实测watchdog异常退出接回,本人当时确认TURZX正常刷新。2026-09-14只读状态,没有重启软件、关机、拔插、改线或制造显示拓扑变化;上述接线、拓扑和壁纸重绑仍只有源码合同与各自历史证据。
- 这里处理已安装机器的运行期端点消失和接线修正,不代替 clean clone、换机或系统重装验收。
- 服务/进程回读不等于实体显示恢复。
失败与恢复
- 普通窗口进入已识别的 HS2,但完整控制器或浮层尚未就绪
- 前置窗口保护先把普通应用无激活地搬回安全屏;无其他落点时最小化。浮层、Wallpaper 和桌面外壳排除,完整 HS2 验证仍独立等待。
- 启动窗口保护子进程提前退出或父 watchdog 已退出
- 提前退出留明确错误证据,不把无窗口启动当成运行成功;父退出时子循环结束,不遗留第二个长期恢复 Owner。
- HDR、分辨率、坐标或 DXGI 波动没有改变活动显示器身份/主屏归属
- 指纹保持相同,返回 Healthy 或 WaitForHealth;不触发 Wallpaper Engine,避免普通画质变化造成闪屏。
- 活动屏少于两块、主屏或TUR0000目标不唯一、参与桌面的MTT1337/Root\MttVDD不健康、HS2 Secondary/绑定不健康
- 进入 WaitForTopology 或 WaitForHealth,保留 pending 状态但不分派 stop/play;健康恢复且指纹稳定后再评估。
- 当前会话没有可读 wallpaper64、出现多个控制目录、同目录 wallpaper32 缺失或 explorer shell 不存在
- 返回 control-client-unavailable 或 user-shell-unavailable;不猜安装路径、不跨 session 控制、不启动高权限 wallpaper64。
- Shell.Application 建立或 stop/play 分派失败
- 返回 control-dispatch-failed 并记有界日志;本次事件仍被消费、baseline 更新并进入 900 秒冷却,不对同一拓扑自动重试。原壁纸配置不变;若背景未恢复,保留 Windows 静态背景并由 Wallpaper Engine 自身用户控制恢复。
- 绑定的 LIAN LI Hub、显示、MI_00 或 LED 出现 Code 10
- 同一签名只提示一次并立即失败关闭;要求关机后检查 HS2 USB 排针、线缆和辅助供电,不自动重启 Hub、移除设备或扫描 PnP。
- A108 Boot ROM 或显示端点缺失
- 停止软件尝试;需要恢复时先关机断电,再按主板 USB 2.0 9-pin 直连或官方 EDGE HUB 的物理旅程处理,绝不带电拔插。
- 随附一分二 Hub 上看不到 LCD
- 不继续重试该 Hub;它不支持 LCD。改用主板 USB 2.0 9-pin 直连或官方 EDGE HUB,若供电不足再接 SATA。
- 改线后出现多个 8091 或端口角色不一致
- 保持旧绑定失效,不启动浮层;只在唯一 8091、port 2 controller、port 3 LED 连续两次健康后重新绑定。
- Secondary 提升失败
- 停止旧浮层、保留当前或请求的 Secondary 模式并等待自然显示链恢复;不发送原生模式命令,本 epoch 不再尝试提升。
- watchdog 子进程反复失败
- 保留长期循环,30 秒熔断后只启动一次新 stack。
- watchdog自身非0退出或原生崩溃
- 原隐藏VBS等30秒再启动替代watchdog;后者先确认旧sender退出,不依赖任务计划程序单独恢复,也不并发创建第二个写入者。
- 本人明确停止整条链或watchdog正常退出
- IncludeWatchdog连同精确VBS一起停止;0退出让VBS结束,不把人工停止解释为需要自动接回。
真实入口
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\StartSideScreenWatchdog-Hidden.vbs隐藏启动、同步等待退出、异常退出30秒后接回与正常退出结束
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\StopSideScreenStack.ps1IncludeWatchdog显式停止时同时结束精确隐藏入口
E:\Projects\Tools\TURZX-SideScreen\scripts\TestWatchdogLauncherRecovery.ps1真实VBS退出、恢复与停止行为的无硬件回归
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\StartSideScreenWatchdog.ps1长期进程、电源 Owner、Wallpaper Engine 进程身份解析、用户 shell 分派和有界恢复状态
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\Invoke-HS2StartupWindowGuard.ps1控制器验证前的 250 ms 窗口保护、180 秒寿命与父进程存活绑定
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\HS2ActiveRecoveryPolicy.ps1拓扑指纹、MTT/HS2 健康门、30 秒稳定、900 秒冷却、Code 10 失败关闭与重绑决策
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\WindowsDisplayWindowPolicy.ps1EnumDisplayMonitors 活动屏/主屏快照,以及浮层、Wallpaper Engine 和桌面外壳窗口排除
E:\Projects\Tools\TURZX-SideScreen\tools\turzx_side_screen\TestPowerWatchdog.ps1HDR-only、主屏/HS2路径与参与桌面的MTT健康、稳定/冷却、控制分派和停止结果回归
E:\Projects\Tools\TURZX-SideScreen\scripts\repair-panel.ps1冻结面板有界修复
E:\Projects\Tools\TURZX-SideScreen\scripts\install-startup-admin.ps1启动任务安装与旧任务禁用
E:\Projects\Tools\TURZX-SideScreen\docs\hs2-crystal-overlay.md原壁纸重绑、Code 10、设备操作禁区与实体边界;屏数资格以ad17182源码为准
E:\Projects\Tools\TURZX-SideScreen\docs\startup.md模式、电源、拓扑与恢复合同
E:\Projects\Tools\TURZX-SideScreen\scripts\TestRuntimeReliability.ps1恢复与假活回归
如何验证
- Source:9月7日a4d8e22219f304ec7d4540f4e7612510cc70bf8e的HEAD、origin/main与实时远端一致,源码工作树干净;修补VBS异常退出接回和IncludeWatchdog停止边界,原有窗口保护、模式保留与独占串口合同不变。
- Tests:a4d8e22的test.ps1 -SkipStreamWhenRunning通过,指标87、天气8,PowerWatchdog、刷新默认值、可靠性、节拍、4个真实VBS无硬件行为及公开ZIP通过;只跳过会占用生产串口的TestVideoStream。
- Installation / Runtime(运行环境):既有任务已重新启动;显式停止34.69秒未反弹,软件启动31.06秒恢复,强制结束watchdog后63.33秒由原VBS自动接回,旧sender退出;23:24心跳285/285、failed=0。RTSS单应用配置经官方SDK回读AppDetectionLevel=0,未另建任务或服务。
- Runtime(运行环境):没有制造显示器拔插、主屏切换、MTT 重枚举、Code 10、控制客户端缺失或 stop/play 半失败;没有看到真实 Rebind 日志或 Wallpaper Engine 渲染恢复。
- 接线选择、Hub 能力、SATA 供电与 8091 端口拓扑来自当前项目源码和启动合同;它们是可执行恢复说明,不是本轮物理观察结果。
- Physical:9月7日本人确认TURZX实体小屏正常刷新;脚本先前physical_pixels_verified=false与后续本人观察分开保留。HS2仅有8月30日本人历史确认,本轮睡眠、关机、断电、壁纸拓扑重绑和HS2实屏未验收。
- ac770044相关纯软件回归拒绝不完整窗口捕获与未知执行;本网页只消费已发布实现,不把单元结果、心跳或命令204写入当实体像素验证。
与其他模块的关系
接收安装与换机模块已经验证的本机配置和双屏绑定,监管运行期机箱屏传输、HS2 显示状态与既有 Wallpaper Engine 的渲染重绑;它不拥有 clean clone、首次安装、壁纸资产或场景设置,总览中的分层证据决定源码、测试、安装、运行事实能否升级为实体结论。
