程序中的一个终端窗口多数时间处于无人值守状态,并实时联网工作,为避免系统休眠、显示器关屏等情况,可调用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
中,重写CreateShell
和OnExit
通过调用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>(); } ...... }