之前给集团写了个文件管理工具,发现有一个问题。在系统后台下载大文件的时候,下载任务会因为系统休眠被异常终止掉而不能恢复。那么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 日
免责声明:本站为个人博客,博客所发布的一切修改补丁、注册机和注册信息及软件的文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途。否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。访问和下载本站内容,说明您已同意上述条款。