You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让WPF动画播放时阻止Windows屏幕保护程序启动?

阻止屏幕保护激活的正规方案(WPF环境)

核心API:SetThreadExecutionState

Windows系统原生提供的SetThreadExecutionState函数,正是媒体播放器阻止屏保激活的底层实现方式——通过向系统声明线程的活跃需求,而非模拟键鼠这类临时方案,完全符合系统电源管理规范。

函数作用说明

通过设置不同的状态标志,可精准控制系统行为:

  • ES_DISPLAY_REQUIRED:通知系统保持显示器开启,直接阻止屏幕保护启动
  • ES_SYSTEM_REQUIRED:额外阻止系统进入睡眠状态(按需选择)
  • ES_CONTINUOUS:让设置的状态持续生效,无需重复调用;若不添加此标志,状态会在函数调用后自动重置

WPF项目中的实现步骤

  1. 声明P/Invoke调用
    在项目中添加Win32 API的平台调用声明,因为这是非托管API:
using System.Runtime.InteropServices;

public static class SystemPowerHelper
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern uint SetThreadExecutionState(uint esFlags);

    private const uint ES_CONTINUOUS = 0x80000000;
    private const uint ES_DISPLAY_REQUIRED = 0x00000002;
    private const uint ES_SYSTEM_REQUIRED = 0x00000001;

    // 开启阻止屏保/保持显示器活跃
    public static void KeepDisplayActive()
    {
        // 若同时需要阻止睡眠,追加ES_SYSTEM_REQUIRED即可
        SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
    }

    // 恢复系统默认电源管理状态
    public static void RestoreDefaultPowerState()
    {
        SetThreadExecutionState(ES_CONTINUOUS);
    }
}
  1. 在动画生命周期中调用
  • 当WPF动画开始播放时,调用SystemPowerHelper.KeepDisplayActive()
  • 当动画结束、应用退出或需要恢复系统默认状态时,调用SystemPowerHelper.RestoreDefaultPowerState(),避免长期占用系统活跃资源

关键注意事项

  • 只需调用一次即可持续生效(因添加了ES_CONTINUOUS),无需定时重复触发
  • 该方案不依赖窗口状态,即使数字标牌窗口被意外最小化(非预期场景),仍能保持显示器活跃
  • 属于系统官方接口,无模拟键鼠带来的不稳定或误操作风险

场景化替代方案(仅限全屏窗口)

如果你的数字标牌始终保持全屏窗口状态,也可尝试设置WPF窗口的ScreenSaverEnabled属性,但兼容性和可靠性不如SetThreadExecutionState:

// 在窗口加载事件或构造函数中设置
this.ScreenSaverEnabled = false;

内容的提问来源于stack exchange,提问作者borealis-c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:33:12