原文http://www.cnblogs.com/TianFang/archive/2012/10/12/2721883.html

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

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

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

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

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

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

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

  • 只使用Continus参数时,则是恢复系统休眠策略。
  • 不使用Continus参数时,实现阻止系统休眠或显示器关闭一次
  • 组合使用Continus参数时,实现阻止系统休眠或显示器关闭至线程终止

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

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

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

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

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

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

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

  1. 下载期间起计时器定期执行ResetSleepTimer函数
  2. 下载开始时执行PreventSleep函数,下载结束后执行ResotreSleep函数。

另外,和阻止系统休眠类似,有的程序还需要有阻止屏保功能。因为我的程序目前还用不到,这里就不多讲了。需要此功能的朋友可以参看下面两篇文章。

C#实现阻止关闭显示器和系统待机的更多相关文章

  1. 阻止屏保运行、显示器和系统待机(使用SystemParametersInfo和SetThreadExecutionState两种办法)

    最近看了下电脑管家里面修复漏洞时阻止系统进入待机模式的实现,其实很简单,哈哈.可以看一下这个MSDN上对这个API的说明:http://msdn.microsoft.com/en-us/library ...

  2. windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)

    /// <summary> /// 系统控制类,关机,关闭显示器,打开屏幕保存程序等 /// </summary> public class SystemPowerContro ...

  3. linux 关闭显示器命令

    首先要解释下DPMS的意思,dpms可以认为是一个显示能源管理系统,一般用于计算机功耗的管理.在linux中有几个选项:To control Energy Star (DPMS) features:  ...

  4. 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写

    /* 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写 在电脑桌面锁定时移动鼠标就会显示登录界面,此时即使超过电源设置的时间电脑也不会关闭显示器使得屏幕 ...

  5. C++ 关闭显示器

    好困,想躺一下,关灯.上床,笔记本的屏幕还亮着,好刺眼,睡不着! 脑子里出现一个疑问,怎么用C++写一个关闭屏幕的小程序呢? 参考了网上已有的例子,最简化: #include <windows. ...

  6. mac 关闭显示器 & 快捷键

    mac 关闭显示器 & 快捷键 https://support.apple.com/zh-cn/HT201236 https://support.apple.com/zh-cn/HT20705 ...

  7. C# 关闭显示器(显示)

    1.先引入DllImport所在的名称空间 using System.Runtime.InteropServices; 2.引入方法 [DllImport("user32.dll" ...

  8. ubuntu 关闭显示器的命令

    sleep 2s ; gnome-screensaver-command -a或sleep 2s ; xset dpms force off2秒后关闭显示器

  9. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

随机推荐

  1. svm评价指标公式

    在做svm分类试验时,对于结果的处理,仅用一种指标很难得到正确评估算法的效果.所以,一般要用到precision(精确率),recall(召回率),F-measure.accuracy(准确率)四个指 ...

  2. Html分组标签

    <fieldset>    <legend>权限种类</legend></fieldset>

  3. 错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。

    出现这种情况的原因,是因为在SQL语句的编写格式不正确. 事例展示: 错误: string sql = "insert into person ([name], sex, salary) v ...

  4. Java 方法调用疑问

    同一个类中同一个方法,实例化后,同时调用两次,内存分配如何?

  5. SQL Server 内存不足引起的并发症

    第一:cpu 1.内存不足就会有频繁的页面调入调出.这个过程是要有cpu的参与的.所以这个要影响cpu! 2.内存不足可能会引有用起执行计划被清除.当起次要执行时.这个就要重编译一次!

  6. Oracle SQL CPU占用高

    Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下.当然,引起严重性能低下的SQL语句 ...

  7. Select XML Nodes by Name [C#]

    原文 http://www.csharp-examples.net/xml-nodes-by-name/ To find nodes in an XML file you can use XPath ...

  8. VS2010 win32项目windows窗体程序 向导生成代码解析

    目录: 1.Win32项目的windows窗体程序的向导生成了如下代码 2.手工生成代码如下 3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务 1.Win32项目的window ...

  9. Struts 上下文

    Struts  上下文 ActionContext .ServletActionContext 是继承关系  ActionContext  ActionContext context = Action ...

  10. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197 在整个游戏开始之前,我们先看一下HelloWorld示例中CCSce ...