之前给集团写了个文件管理工具,发现有一个问题。在系统后台下载大文件的时候,下载任务会因为系统休眠被异常终止掉而不能恢复。那么c#怎么防止系统休眠息屏?成了当时最大的问题。最初的做法是告知使用用户把系统休眠设置手动关掉,但是这样不太人性化,极度影响用户体验。那么在c#中如何阻止系统休眠关闭显示器呢?带着这个疑问就去找了一下win32api相关函数,最终找到了一个可以阻止系统休眠的api函数SetThreadExecutionState。这个函数参数很简单,只一个枚举类型的flags参数,有三个枚举值,可以组合使用。

  • 只使用Continuous枚举时,则是恢复系统休眠策略。
  • 不使用Continuous枚举时,实现阻止系统休眠或显示器关闭一次
  • 组合使用Continuous枚举时,实现阻止系统休眠或显示器关闭至线程终止
public class SysSleepMag
    {
        //定义win32函数
        [DllImport("kernel32.dll")]
        private static extern uint SetThreadExecutionState(ExecutionState flags);

        [Flags]
        private enum ExecutionState : uint
        {
            System = 0x00000001,
            Display = 0x00000002,
            Continuous = 0x80000000,
        }

        /// <summary>
        ///阻止系统休眠
        /// </summary>
        /// <param name="includeDisplay">是否阻止关闭显示器</param>
        public static void PreventSleep(bool includeDisplay = false)
        {
            if (includeDisplay)
                SetThreadExecutionState(ExecutionState.System | ExecutionState.Display | ExecutionState.Continuous);
            else
                SetThreadExecutionState(ExecutionState.System | ExecutionState.Continuous);
        }

        /// <summary>
        ///恢复系统休眠策略
        /// </summary>
        public static void RestoreSleep()
        {
            SetThreadExecutionState(ExecutionState.Continuous);
        }

        /// <summary>
        ///重置系统休眠计时器
        /// </summary>
        /// <param name="includeDisplay">是否阻止关闭显示器</param>
        public static void ResetSleepTimer(bool includeDisplay = false)
        {
            if (includeDisplay)
                SetThreadExecutionState(ExecutionState.System | ExecutionState.Display);
            else
                SetThreadExecutionState(ExecutionState.System);
        }
    }
最后修改:2022 年 09 月 30 日
如果觉得我的文章对你有用,请随意赞赏