原文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. 用C++写一个简单的订阅者

    打开一个终端,进入到beginner_tutorials包下面: cd ~/catkin_ws/src/beginner_tutorials 建立文件src/listener.cpp: vim src ...

  2. codevs 1455 路径 计算m^n%p

    题目链接 题目描述 Description 小明从A1到An+1,他知道从A1到A2,从A2到A3,......,从An到An+1都有m条路,且从A1到An+1都只有这些路.小明想知道,从A1地到An ...

  3. halcon与C#混合编程进阶版

    这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片. 新手来这里:http://www.cnblogs.com/badguy518/p/55150 ...

  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">的含义

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/x ...

  5. 成为 Linux 内核高手的四个方法

    (之前我在 CUSEC 网站发表了关于内核并不可怕的一篇文章,本文是后续.) 我曾经问别人如何开始内核编程的学习,他们基本上都说:1. 如果你不需要了解内核是如何为你工作的,你为何要尝试呢?2. 你应 ...

  6. QT 一些非常常用的操作

    一   如果在窗体关闭前自行判断是否可关闭二   如何用打开和保存文件对话框  三   如何使用警告.信息等对话框  四   在Windows下Qt里为什么没有终端输出五   想在源代码中直接使用中文 ...

  7. eclipse及Java常用问题及解决办法汇总

    junit-test 我觉得这点比idea好用,可以直接选中要测试的方法名,右击run as即可 http://www.cnblogs.com/brolanda/p/4532779.html 打开您的 ...

  8. TCP/IP笔记 三.运输层(2)——TCP 流量控制与拥塞控制

    TCP 的流量控制与拥塞控制可以说是一体的.流量控制是通过滑动窗口实现的,拥塞避免主要包含以下2个内容: (1)慢开始,拥塞避免 (2)快重传,快恢复 1.流量控制——滑动窗口 TCP采用大小可变的滑 ...

  9. slave 成为master 时候执行的操作notify_master /etc/keepalived/send_master.sh

    slave:/root# cat /etc/keepalived/keepalived.conf global_defs { router_id MySQL-ha } vrrp_instance VI ...

  10. easyui使用总结

    (一)datagrid 1.jquery的easyui中的datagrid刷新时的问题 在你的页面里增加2个class样式:           .datagrid-mask{ opacity:0; ...