C#運(yùn)行程序時(shí)阻止關(guān)閉顯示器和系統(tǒng)待機(jī)
最近寫了一個(gè)下載程序,發(fā)現(xiàn)有一個(gè)問(wèn)題:掛機(jī)下載的時(shí)候,下載任務(wù)會(huì)因?yàn)橄到y(tǒng)休眠被終止掉。
最開(kāi)始我的解決方法是關(guān)閉休眠,后來(lái)發(fā)現(xiàn)這種策略并不是很好:下載完成后,如果仍然繼續(xù)保持開(kāi)機(jī)狀態(tài)浪費(fèi)電。
因此,最好的方式是:在下載的時(shí)候阻止系統(tǒng)休眠。即不會(huì)因?yàn)樾菝叨K止下載任務(wù),下載完成后自動(dòng)轉(zhuǎn)為休眠狀態(tài)省電,都不用做下載完成后自動(dòng)關(guān)機(jī)功能了。
查了一下相關(guān)文章,可以通過(guò)這個(gè)SetThreadExecutionState API實(shí)現(xiàn)阻止系統(tǒng)休眠。它在C#中的聲明方式如下:
[DllImport("kernel32.dll")]
static extern uint SetThreadExecutionState(ExecutionFlag flags);
[Flags]
enum ExecutionFlag : uint
{
System = 0x00000001,
Display = 0x00000002,
Continuous = 0x80000000,
}它就一個(gè)flags參數(shù),這個(gè)參數(shù)有三個(gè)選項(xiàng),可以組合使用。主要說(shuō)明如下:
只使用Continuous參數(shù)時(shí),則是恢復(fù)系統(tǒng)休眠策略。
不使用Continuous參數(shù)時(shí),實(shí)現(xiàn)阻止系統(tǒng)休眠或顯示器關(guān)閉一次
組合使用Continuous參數(shù)時(shí),實(shí)現(xiàn)阻止系統(tǒng)休眠或顯示器關(guān)閉至線程終止
因此,它一共有三種使用方式,這里我就封裝了一下:
class SystemSleepManagement
{
//定義API函數(shù)
[DllImport("kernel32.dll")]
static extern uint SetThreadExecutionState(ExecutionFlag flags);
[Flags]
enum ExecutionFlag : uint
{
System = 0x00000001,
Display = 0x00000002,
Continuous = 0x80000000,
}
/// <summary>
///阻止系統(tǒng)休眠,直到線程結(jié)束恢復(fù)休眠策略
/// </summary>
/// <param name="includeDisplay">是否阻止關(guān)閉顯示器</param>
public static void PreventSleep(bool includeDisplay = false)
{
if (includeDisplay)
SetThreadExecutionState(ExecutionFlag.System | ExecutionFlag.Display | ExecutionFlag.Continuous);
else
SetThreadExecutionState(ExecutionFlag.System | ExecutionFlag.Continuous);
}
/// <summary>
///恢復(fù)系統(tǒng)休眠策略
/// </summary>
public static void RestoreSleep()
{
SetThreadExecutionState(ExecutionFlag.Continuous);
}
/// <summary>
///重置系統(tǒng)休眠計(jì)時(shí)器
/// </summary>
/// <param name="includeDisplay">是否阻止關(guān)閉顯示器</param>
public static void ResetSleepTimer(bool includeDisplay = false)
{
if (includeDisplay)
SetThreadExecutionState(ExecutionFlag.System | ExecutionFlag.Display);
else
SetThreadExecutionState(ExecutionFlag.System);
}
}因此,要實(shí)現(xiàn)下載時(shí)阻止程序休眠,則有兩種實(shí)現(xiàn)方式:
下載期間起計(jì)時(shí)器定期執(zhí)行ResetSleepTimer函數(shù)
下載開(kāi)始時(shí)執(zhí)行PreventSleep函數(shù),下載結(jié)束后執(zhí)行RestoreSleep函數(shù)。
到此這篇關(guān)于C#運(yùn)行程序時(shí)阻止關(guān)閉顯示器和系統(tǒng)待機(jī)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net core mvc權(quán)限控制:在視圖中控制操作權(quán)限
本文主要介紹了asp.net core mvc權(quán)限控制:在視圖中控制操作權(quán)限。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
Unity UGUI實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Unity UGUI實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
總結(jié)C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動(dòng)態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對(duì)應(yīng)的方式,下面來(lái)一起看看。2016-09-09

