之前给集团写了个文件管理工具,发现有一个问题。在系统后台下载大文件的时候,下载任务会因为系统休眠被异常终止掉而不能恢复。那么c#怎么防止系统休眠息屏?成了当时最大的问题。最初的做法是告知使用用户把系统休眠设置手动关掉,但是这样不太人性化,极度影响用户体验。那么在c#中如何阻止系统休眠关闭显示器呢?带着这个疑问就去找了一下win32api相关函数,最终找到了一个可以阻止系统休眠的api函数SetThreadExecutionState。这个函数参数很简单,只一个枚举类型的flags参数,有三个枚举值,可以组合使用。
- 只使用Continuous枚举时,则是恢复系统休眠策略。
- 不使用Continuous枚举时,实现阻止系统休眠或显示器关闭一次
- 组合使用Continuous枚举时,实现阻止系统休眠或显示器关闭至线程终止
public class SysSleepMag
{
//定义win32函数
[DllImport("kernel32.dll")]
private static extern uint SetThreadExecutionState(ExecutionState flags);
[Flags]
private enum ExecutionState : uint
{
System = 0x00000001,
Display = 0x00000002,
Continuous = 0x80000000,
}
/// <summary>
///阻止系统休眠
/// </summary>
/// <param name="includeDisplay">是否阻止关闭显示器</param>
public static void PreventSleep(bool includeDisplay = false)
{
if (includeDisplay)
SetThreadExecutionState(ExecutionState.System | ExecutionState.Display | ExecutionState.Continuous);
else
SetThreadExecutionState(ExecutionState.System | ExecutionState.Continuous);
}
/// <summary>
///恢复系统休眠策略
/// </summary>
public static void RestoreSleep()
{
SetThreadExecutionState(ExecutionState.Continuous);
}
/// <summary>
///重置系统休眠计时器
/// </summary>
/// <param name="includeDisplay">是否阻止关闭显示器</param>
public static void ResetSleepTimer(bool includeDisplay = false)
{
if (includeDisplay)
SetThreadExecutionState(ExecutionState.System | ExecutionState.Display);
else
SetThreadExecutionState(ExecutionState.System);
}
}