zoukankan      html  css  js  c++  java
  • 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);
            }
        }

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

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

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

  • 相关阅读:
    InstallShield2015制作安装包----------卸载前结束执行中的进程
    InstallShield2015制作安装包----------安装过程中修改文件内容
    InstallShield2015制作安装包----------卸载后删除安装目录和文件
    InstallShield2015制作安装包----------安装后实现自动运行
    snmp getTable demo :iftable ipAddresstable
    snmp
    Android Lazy url
    eclipse key
    demo16Toast
    demo15 AlertDialog
  • 原文地址:https://www.cnblogs.com/TianFang/p/2721883.html
Copyright © 2011-2022 走看看