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>();
    		}
    		
    		......
    }
相关推荐
q5673152314 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
许野平39 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨42 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵2 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射
Troc_wangpeng2 小时前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的2 小时前
解析json导出csv或者直接入库
开发语言·python·json