原文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. JavaScript奇技淫巧45招

    JavaScript奇技淫巧45招 撰写于 2015年1月5日 修改于 2016年6月16日 分类 翻译 标签 JavaScript 本文是一篇翻译文章,原文信息如下: 原文:45 Useful Ja ...

  2. web - 清除浮动

    最理想的方式为 伪类 + content : 例如 div:after{content:"";display:block;clear:both;} div{zoom:1;} 另外, ...

  3. asp.net textbox keyup事件触发后台的textchange事件

    textbox文本框text_change事件,失去焦点才会执行. 通过keyup事件,js控制失去焦点. <asp:TextBox runat="server" ID=&q ...

  4. NXT项目准备资料

    聊天资源 http://www.cocoachina.com/ios/20150205/11116.html https://developer.layer.com/docs/ios/quick-st ...

  5. 大写String和小写string的区别

    1.string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) ; 2.c# string映射为.net Framework的String ; 3.如果用 ...

  6. 智能电视TV开发---直播视频客户端结构设计和实现

    在智能电视TV开发---客户端和服务器通信里面我们实现了客户端和服务端的简单通信,接下来我们做一个简单的客户端界面,来实现手机端来操控智能电视的TV端. 一.存储视频的结构设计 我们在做客户端的时候, ...

  7. MarkDown使用 (一)

    MarkDown的数学公式输入 MarkDown的数学公式输入 1.如何插入公式 LaTeX的数学公式有两种:行中公式和独立公式.行中公式放在文中与其它文字混编,独立公式单独成行. 行中公式可以用如下 ...

  8. MySQL 基础学习

    http://www.w3school.com.cn/sql/ 1.limit x,y 或 limit z  :选取从x开始的y条数据  或  选取最开始的 z条数据 , 2.like '%N%' : ...

  9. Win7下使用protel99se、protel99

    很多网友需要用的protel99se,由于该软件开发的时间比较就早,在现在笔记本普及,尤其是win7普及的情况下,用该软件着实让许多人头痛,有人选择安装XP系统,但这就牺牲了win7良好的操作体验.也 ...

  10. Pro/Engineer wildfire 5.0 野火版系列下载及安装方法

    三.PTC Pro/Engineer wildfire 5.0 M030 野火版最新版 DVD 下载(多国语言) 1.野火下载站下载32&64位下载:[32位] http://down.pro ...