Skip to content

fix: pause dynamic video background when main window is minimized - #1932

Open
zzstar101 wants to merge 2 commits into
Scighost:mainfrom
zzstar101:fix/minimize-pause-video-background
Open

fix: pause dynamic video background when main window is minimized#1932
zzstar101 wants to merge 2 commits into
Scighost:mainfrom
zzstar101:fix/minimize-pause-video-background

Conversation

@zzstar101

@zzstar101 zzstar101 commented Aug 30, 2026

Copy link
Copy Markdown

问题

主窗口最小化后,动态视频背景仍然持续播放和解码。

MainWindow.WindowSubclassProc 此前只处理了 WM_ACTIVATEWM_WTSSESSION_CHANGE
等消息,没有处理 WM_SIZE。普通最小化(标题栏按钮、ShowWindow(SW_MINIMIZE)
启动游戏时的最小化动作)不会产生任何 MainWindowStateChangedMessage
AppBackground 无从得知窗口已最小化,MediaPlayer 继续解码。

实测:

状态 修复前 CPU
前台播放 ~105%(≈1 核)
最小化 ~105%(几乎不下降)

另外,现有的恢复逻辑本质是 event-toggle:Hide → PauseSessionLock → Pause
Activate → Play。单个恢复事件会无条件覆盖其他暂停条件,例如
最小化 → 锁屏 → 还原WM_ACTIVATE 会导致在锁屏期间错误恢复播放。

修改

不改动媒体管线(frame server / Win2D / 解码器均不动),只修窗口生命周期状态:

  1. MainWindowStateChangedMessage

    • 新增 bool? Minimizedtrue 进入最小化 / false 退出最小化 / null 与最小化无关
    • 新增 bool SessionUnlock:补上此前为空的 WTS_SESSION_UNLOCK 分支
  2. MainWindow.xaml.cs

    • WindowSubclassProc 新增 WM_SIZE 分支:SIZE_MINIMIZEDMinimized = true
      SIZE_RESTORED / SIZE_MAXIMIZEDMinimized = false(窗口本身
      IsMaximizable = false,MAXIMIZED 仅作防御)
    • _isMinimized 去抖,仅在状态翻转时发消息,避免 SIZE_RESTORED 噪音
      (DPI 变化、移动窗口等)流入其他消息消费者
    • WTS_SESSION_UNLOCK 发送 { SessionUnlock = true }
  3. AppBackground.xaml.cs

    • 以三个私有字段聚合 suspend reason:_windowHidden_windowMinimized_sessionLocked
    • 每个状态只由各自对应的窗口信号维护:
      Hide/Activate → hiddenWM_SIZE → minimizedWTS lock/unlock → sessionLocked
    • Activate 只清除 hidden,不再无条件恢复播放;暂停/恢复统一由
      ShouldPauseVideo = _windowHidden || _windowMinimized || _sessionLocked 决策
    • StartMediaPlayer 末尾检查 ShouldPauseVideo:若窗口此刻不可播放
      (如最小化期间背景下载完成),新建的播放器立即暂停,
      避免错过已发生的状态消息

用户手动暂停(封面右上角按钮)走 StopVideo → DisposeVideoResource
播放器被释放为 null,生命周期消息对 null 播放器无操作,因此
"手动暂停 → 最小化 → 还原" 仍保持静态背景,不会被生命周期恢复覆盖。

行为对照

场景 修复前 修复后
最小化 继续播放 暂停
最小化 → 还原 继续播放 恢复播放
最小化 → 锁屏 → 还原(锁屏未解除) 错误恢复播放 保持暂停
锁屏 → 解锁(窗口可见) 保持暂停,需点击窗口恢复 解锁即恢复
锁屏 → 最小化 → 解锁(仍最小化) 保持暂停 保持暂停
ESC 隐藏 → 重新显示 暂停 → 恢复(不变) 不变
手动暂停 → 最小化 → 还原 静态背景(不变) 不变
最小化期间背景下载完成 最小化状态下开始播放 创建后立即暂停,还原后播放

验证

  • dotnet build src/Starward/Starward.csproj -c Debug -p:Platform=x64:0 错误,
    触碰文件无新增警告
  • 字段实测(Debug 构建,webm 动态封面,CPU 为单核百分比):
场景 CPU
前台播放 90~118%
最小化 10s 2.0~2.9%
还原后 90~114%
ESC 隐藏 0.4~2.9%
  • 已确认消息的其他消费者(GameBannerAndPostGameLauncherPage
    GameSelectorMainView)语义不受影响

@zzstar101
zzstar101 marked this pull request as ready for review August 30, 2026 04:16
Copilot AI lite review requested due to automatic review settings August 30, 2026 04:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants