自学内容网 自学内容网

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

    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

    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>();
    }
    
    ......
    }
    

原文地址:https://blog.csdn.net/jjailsa/article/details/137740118

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!