C#运行程序时阻止关闭显示器和系统待机

 更新时间:2022年06月18日 10:51:47   作者:天方  
这篇文章介绍了C#运行程序时阻止关闭显示器和系统待机的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

最近写了一个下载程序,发现有一个问题:挂机下载的时候,下载任务会因为系统休眠被终止掉。

最开始我的解决方法是关闭休眠,后来发现这种策略并不是很好:下载完成后,如果仍然继续保持开机状态浪费电。

因此,最好的方式是:在下载的时候阻止系统休眠。即不会因为休眠而终止下载任务,下载完成后自动转为休眠状态省电,都不用做下载完成后自动关机功能了。

查了一下相关文章,可以通过这个SetThreadExecutionState API实现阻止系统休眠。它在C#中的声明方式如下:

    [DllImport("kernel32.dll")]
    static extern uint SetThreadExecutionState(ExecutionFlag flags);

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

它就一个flags参数,这个参数有三个选项,可以组合使用。主要说明如下:

  • 只使用Continuous参数时,则是恢复系统休眠策略。

  • 不使用Continuous参数时,实现阻止系统休眠或显示器关闭一次

  • 组合使用Continuous参数时,实现阻止系统休眠或显示器关闭至线程终止

因此,它一共有三种使用方式,这里我就封装了一下:

    class SystemSleepManagement
    {
        //定义API函数
        [DllImport("kernel32.dll")]
        static extern uint SetThreadExecutionState(ExecutionFlag flags);

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

        /// <summary>
        ///阻止系统休眠,直到线程结束恢复休眠策略
        /// </summary>
        /// <param name="includeDisplay">是否阻止关闭显示器</param>
        public static void PreventSleep(bool includeDisplay = false)
        {
            if (includeDisplay)
                SetThreadExecutionState(ExecutionFlag.System | ExecutionFlag.Display | ExecutionFlag.Continuous);
            else
                SetThreadExecutionState(ExecutionFlag.System | ExecutionFlag.Continuous);
        }

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

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

因此,要实现下载时阻止程序休眠,则有两种实现方式:

  • 下载期间起计时器定期执行ResetSleepTimer函数

  • 下载开始时执行PreventSleep函数,下载结束后执行RestoreSleep函数。

到此这篇关于C#运行程序时阻止关闭显示器和系统待机的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#检查远程或本地磁盘使用率

    C#检查远程或本地磁盘使用率

    要检查磁盘的使用情况确定程序放哪个服务器和清理垃圾,所以写个小程序帮忙检查。本文给大家介绍C#检查远程或本地磁盘使用率的相关知识,感兴趣的朋友一起学习吧
    2016-04-04
  • C#实现导入CSV文件到Excel工作簿的方法

    C#实现导入CSV文件到Excel工作簿的方法

    这篇文章主要介绍了C#实现导入CSV文件到Excel工作簿的方法,涉及C#针对office组件的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • c# 获取数据库中所有表名称的方法

    c# 获取数据库中所有表名称的方法

    在很多情况下我们需要将指定的数据库中的所有表都列出来。在使用c#进行软件开发时,我们有哪些方法可是实现这个目的呢?本人对此进行概要的总结,有以下6中方式可以实现这个目的。
    2010-02-02
  • C#基于UDP进行异步通信的方法

    C#基于UDP进行异步通信的方法

    这篇文章主要介绍了C#基于UDP进行异步通信的方法,实例分析了C#基于UDP实现异步通信的相关技巧,需要的朋友可以参考下
    2015-04-04
  • c#用for语句输出一个三角形的方法

    c#用for语句输出一个三角形的方法

    这篇文章主要介绍了c#用for语句输出一个三角形的方法,可实现只用一个for语句来输出三角形的功能,需要的朋友可以参考下
    2015-06-06
  • C#中委托和事件在观察者模式中的应用实例

    C#中委托和事件在观察者模式中的应用实例

    这篇文章主要介绍了C#中委托和事件在观察者模式中的应用,需要的朋友可以参考下
    2014-08-08
  • C#简单爬虫案例分享

    C#简单爬虫案例分享

    这篇文章主要为大家分享了C#简单爬虫案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • WPF拖动DataGrid滚动条时内容混乱的解决方法

    WPF拖动DataGrid滚动条时内容混乱的解决方法

    这篇文章主要介绍了WPF拖动DataGrid滚动条时内容混乱的解决方法
    2016-10-10
  • C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    C#中如何将MongoDB->RunCommand结果映射到业务类的方法总结

    这篇文章主要给大家总结介绍了关于C#中如何将MongoDB->RunCommand结果映射到业务类的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • C#实现添加多行文本水印到Word文档

    C#实现添加多行文本水印到Word文档

    一般情况下,在Word中添加文字水印仅支持添加一个文本字样的水印,由于对不同文档的设计要求,需要在Word文档中添加平铺水印效果。本文将介绍如何来实现该水印效果的方法,感兴趣的可以了解一下
    2022-07-07

最新评论