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>();
    		}
    		
    		......
    }
相关推荐
.NET快速开发框架7 分钟前
一文搞懂flex(弹性盒布局)
c#·.netcore·web前端·开发技术·rdif·rdiframework.net
呆呆小雅8 分钟前
C# 结构体
android·java·c#
Heris9915 分钟前
零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu
linux·c语言·开发语言·ubuntu
生财24 分钟前
获取字 short WORD 上指定的位是否有效
java·服务器·c#
凡人的AI工具箱38 分钟前
40分钟学 Go 语言高并发:Pipeline模式(一)
开发语言·后端·缓存·架构·golang
achaoyang1 小时前
【Python中while循环】
开发语言·python
呆呆小雅1 小时前
C# 封装
java·开发语言·c#
蒜蓉大猩猩1 小时前
Vue.js - 组件化编程
开发语言·前端·javascript·vue.js·前端框架·ecmascript
南鸳6101 小时前
Scala:根据身份证号码,输出这个人的籍贯
开发语言·后端·scala
eclipsercp1 小时前
PyQt5:Python GUI开发的超级英雄
开发语言·python·qt