WPF常用技巧-防止系统休眠

程序中的一个终端窗口多数时间处于无人值守状态,并实时联网工作,为避免系统休眠、显示器关屏等情况,可调用kernel32.dll的SetThreadExecutionState函数,此函数的作用是通知操作系统本程序正在使用中,不得进入睡眠状态或关闭显示器。

SetThreadExecutionState(ExecutionFlag flags):使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。

  • ExecutionFlag: 参数枚举,常用的几个成员如下:
    • ES_SYSTEM_REQUIRED = 0x00000001:通过重置系统空闲计时器强制系统处于工作状态。
    • ES_DISPLAY_REQUIRED = 0x00000002:通过重置显示空闲计时器强制显示处于打开状态。
    • ES_CONTINUOUS = 0x80000000:通知系统正在设置的状态应保持有效,直到使用**ES_CONTINUOUS**的下一次调用和清除其他状态标志之一。
    • 以上三个参数在程序调用SetThreadExecutionState时,必须通过|来组合使用。
    • 在程序关闭时,最好单独使用ES_CONTINUOUS参数再调用一次SetThreadExecutionState函数,以告知系统可以按原计划休眠或关闭显示器。

以WPF为例子,可以在App.xaml.cs中,重写CreateShellOnExit通过调用SetThreadExecutionState来防止系统休眠和恢复休眠。

  • SystemSleepTool.cs

    csharp 复制代码
    public static class SystemSleepTool
    {
        //定义API函数
        [DllImport("kernel32.dll")]
        static extern uint SetThreadExecutionState(ExecutionFlag flags);
    
        [Flags]
        enum ExecutionFlag : uint
        {
            ES_SYSTEM_REQUIRED = 0x00000001,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_CONTINUOUS = 0x80000000,
        }
    
        /// <summary>
        ///阻止系统休眠
        /// </summary>
        public static void PreventSleep()
        {
            SetThreadExecutionState(ExecutionFlag.ES_SYSTEM_REQUIRED | ExecutionFlag.ES_DISPLAY_REQUIRED | ExecutionFlag.ES_CONTINUOUS);
        }
        
        /// <summary>
        ///恢复系统休眠
        /// </summary>
        public static void RestoreSleep()
        {
    		    SetThreadExecutionState(ExecutionFlag.ES_CONTINUOUS);
        }
    }
  • App.xaml.cs

    csharp 复制代码
    public partial class App : PrismApplication
    {
        protected override void OnExit(ExitEventArgs e)
        {
            ......
            SystemSleepTool.RestoreSleep();
            base.OnExit(e);
        }
    
    		protected override Window CreateShell()
    		{
    				......
    				SystemSleepTool.PreventSleep();
    				return Container.Resolve<MainWindow>();
    		}
    		
    		......
    }
相关推荐
Fairy要carry2 分钟前
面试-GRPO强化学习
开发语言·人工智能
Liekkas Kono14 分钟前
RapidOCR Python 贡献指南
开发语言·python·rapidocr
张张努力变强20 分钟前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
xyq202423 分钟前
Matplotlib 绘图线
开发语言
m0_6948455726 分钟前
tinylisp 是什么?超轻量 Lisp 解释器编译与运行教程
服务器·开发语言·云计算·github·lisp
春日见31 分钟前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
C++ 老炮儿的技术栈35 分钟前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
心疼你的一切40 分钟前
Unity异步编程神器:Unitask库深度解析(功能+实战案例+API全指南)
深度学习·unity·c#·游戏引擎·unitask
派葛穆41 分钟前
Python-批量安装依赖
开发语言·python
MSTcheng.1 小时前
【C++】C++11新特性(二)
java·开发语言·c++·c++11