这篇文章介绍了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);
}
}
因此,要实现下载时阻止程序休眠,则有两种实现方式:
下载期间起计时器定期执行ResetSleepTimer函数
下载开始时执行PreventSleep函数,下载结束后执行RestoreSleep函数。
到此这篇关于C#运行程序时阻止关闭显示器和系统待机的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持得得之家。
本文标题为:C#运行程序时阻止关闭显示器和系统待机
基础教程推荐
- C#类和结构详解 2023-05-30
- C# windows语音识别与朗读实例 2023-04-27
- C# 调用WebService的方法 2023-03-09
- 一个读写csv文件的C#类 2022-11-06
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- unity实现动态排行榜 2023-04-27
- C# List实现行转列的通用方案 2022-11-02
- winform把Office转成PDF文件 2023-06-14
- C#控制台实现飞行棋小游戏 2023-04-22