C#实现阻止关闭显示器和系统待机

原文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函数。

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

    1. 阻止屏保运行、显示器和系统待机
    2. xp、win7下如何取消屏保、取消电源管理
时间: 2024-11-24 09:35:18

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

阻止屏保运行、显示器和系统待机

原文 http://blog.csdn.net/zjerryj/article/details/4618485    暴风影音在播放的时候会阻止屏幕保护程序的运行,并会防止系统关闭显示器和进入待机状态.以下就是用C#来实现这个功能. 1.阻止屏幕保护程序的运行     基本原理是播放时调用Windows API函数SystemParametersInfo()来关闭屏幕保护程序,播放结束后再重新打开.代码如下: [c-sharp] view plaincopy //定义API函数   [DllIm

如何关闭Win7系统老是弹出阻止关闭程序运行窗口

  有些用户在问道说Win7系统中如何才能设置关闭阻止程序运行提示的教程,64位win7旗舰版下载系统中我们运行一些使用程序的时候就会出现弹出提示的运行窗口,说这个运行的程序可能是病毒或者是存在一定的风险,总是需要我们进行选择才能够继续上我那个,而且可能经常都会弹出这个窗口,让人非常的不爽,出现这样的情况如何才能让窗口不弹出我们来看看具体的解决方法吧! 1.首先我们可以打开开始菜单,看到里面的控制面板选项选择点击弹出新的窗口,然后在选择用户与家庭安全这个选项点击打开. 2.在弹出的新窗口中我们选

Win7系统关闭显示器后又自动开启原因及解决方法

  一般情况下,如果要离开电脑或者长时间不使用电脑的情况下,会选择关闭显示器节省电源,一定程度上减少辐射.用户遇到很奇怪的问题,关闭显示器之后没过多久又自动开启.为什么会出现这样情况呢?主要原因是驱动没有安装好或不匹配所引起,怎么解决问题?只要我们更新正确的驱动程序即可轻松解决.下面为大家演示解决方法. 方法如下: 1.找到自己相匹配的电脑型号,下载相应的驱动备用; 2.下载的设备驱动程序分别是:主板芯片组驱动程序.网卡驱动程序.热键工具; 3.下载后先解压,先从热键工具更新; 4.鼠标点击"开

系统待机时让硬盘好好休息

无论什么类型的设备,如果它长时间超负荷工作的话,其使用寿命肯定会大幅度地缩短,这不,硬盘就是其中的一个很好代表.的确,如果硬盘始终不停地转动的话,硬盘要不了多长时间就可能被"报废",为此许多人在使用硬盘时常常不定期地让系统处于待机状态,以便让硬盘在这段时间能得到及时有效地"休息";可事实上,有时系统即使处于待机工作状态,硬盘仍然有可能受系统或其他软件的"逼迫",而得不到一丁点的"休息"时间,长期以往的话,硬盘命将休矣!为了延长

电脑关闭显示器就掉线怎么回事?

  故障分析:网络故障,可能晚上在中途网络出现故障,导致连接不上去就会掉线,其次就是你的计算机的电源选项设置有问题,或者可能是当你关闭显示器之后就自动切断了电脑硬盘的运作,导致游戏掉线的现象. 故障解决: 一.掉线的原因你可以先检查下你自己网络系统是否运行正常不,如果是天天到一个点的时间就掉线的话,那估计就不是网络的原因,如果只是偶尔一次或几次出现掉线的话,那可能就是网络的故障,这只能打电话给服务商来帮你解决故障. 二.如果是电源选项的问题.可能是你的电源设置了自动睡眠,或者自动关闭硬盘等等选项

win7怎么设定关闭显示器时间_DOS/BAT

使用windows 批处理实现 设置关闭显示的时间. 复制代码 代码如下: @echo off setlocal enabledelayedexpansion echo "请输入关闭显示器的时间,单位是分钟,默认1分钟" set /p "timeout=" if NOT DEFINED timeout (echo "你输入的时间是1分钟" && set "timeout=1" && goto s

XP系统待机不正常怎么回事

XP系统待机不正常怎么回事   WinXP待机不正常原因: 一般情况下,是应该可以待机的,既然自动恢复工作状态,则很可能是由于硬件允许计算机脱离待机状态,并不断周期性地唤醒计算机所致. 解决方法: 1. 要查看网卡.Modem等设备是否设置了允许windows脱离待机状态. 2. 在设备管理器窗口中,打开网卡属性对话框. 3. 切换到电源管理选项卡,取消选中的"允许这台设备使计算机脱离待机状态"复选框,就可以清除故障了. 用户需要注意一点,以上设置只有在windows xp profe

关闭Windows 8系统的十种实用方法

  大家有自己一贯的关机方式,比如都是从开始按钮下进行关机的,可是大家知道吗,其实关闭win 8有很多种方法的,现在就介绍下关闭Windows 8系统多方法教程. 使用windows 8系统总结出了不少win8技巧,下面向大家分享一下. 1.通过Charms超级栏关闭Windows 8 在Windows 8中,微软引入了Charms Bar超级栏,将鼠标悬停在任务栏右下角即可调出Charm栏,也可以通过快捷键Win+C打开它,点击"设置"即可出现关机.重启和休眠选项,或者使用快捷键Wi

如何关闭Windows 8系统

  大家有自己一贯的关机方式,比如都是从开始按钮下进行关机的,可是大家知道吗,其实关闭win 8有很多种方法的,现在就介绍下关闭Windows 8系统多方法教程. 使用windows 8系统总结出了不少win8技巧,下面向大家分享一下. 1.通过Charms超级栏关闭Windows 8 在Windows 8中,微软引入了Charms Bar超级栏,将鼠标悬停在任务栏右下角即可调出Charm栏,也可以通过快捷键Win+C打开它,点击"设置"即可出现关机.重启和休眠选项,或者使用快捷键Wi