C#運行程序時阻止關(guān)閉顯示器和系統(tǒng)待機
最近寫了一個下載程序,發(fā)現(xiàn)有一個問題:掛機下載的時候,下載任務(wù)會因為系統(tǒng)休眠被終止掉。
最開始我的解決方法是關(guān)閉休眠,后來發(fā)現(xiàn)這種策略并不是很好:下載完成后,如果仍然繼續(xù)保持開機狀態(tài)浪費電。
因此,最好的方式是:在下載的時候阻止系統(tǒng)休眠。即不會因為休眠而終止下載任務(wù),下載完成后自動轉(zhuǎn)為休眠狀態(tài)省電,都不用做下載完成后自動關(guān)機功能了。
查了一下相關(guān)文章,可以通過這個SetThreadExecutionState API實現(xiàn)阻止系統(tǒng)休眠。它在C#中的聲明方式如下:
[DllImport("kernel32.dll")] static extern uint SetThreadExecutionState(ExecutionFlag flags); [Flags] enum ExecutionFlag : uint { System = 0x00000001, Display = 0x00000002, Continuous = 0x80000000, }
它就一個flags參數(shù),這個參數(shù)有三個選項,可以組合使用。主要說明如下:
只使用Continuous參數(shù)時,則是恢復(fù)系統(tǒng)休眠策略。
不使用Continuous參數(shù)時,實現(xiàn)阻止系統(tǒng)休眠或顯示器關(guān)閉一次
組合使用Continuous參數(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)休眠計時器 /// </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); } }
因此,要實現(xiàn)下載時阻止程序休眠,則有兩種實現(xiàn)方式:
下載期間起計時器定期執(zhí)行ResetSleepTimer函數(shù)
下載開始時執(zhí)行PreventSleep函數(shù),下載結(jié)束后執(zhí)行RestoreSleep函數(shù)。
到此這篇關(guān)于C#運行程序時阻止關(guān)閉顯示器和系統(tǒng)待機的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.
本篇文章,小編為大家介紹關(guān)于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介紹方法,有需要的朋友可以參考一下2013-04-04c# 調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用的方法
這篇文章主要介紹了c# 調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03Unity技術(shù)手冊之Slider滑動器使用實例詳解
這篇文章主要為大家介紹了Unity技術(shù)手冊之Slider滑動器使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11c#之用戶定義的數(shù)據(jù)類型轉(zhuǎn)換介紹
c#允許定義自己的數(shù)據(jù)類型,這意味著需要某些工具支持在自己的數(shù)據(jù)類型間進(jìn)行數(shù)據(jù)轉(zhuǎn)換。方法是把數(shù)據(jù)類型轉(zhuǎn)換定義為相關(guān)類的一個成員運算符,數(shù)據(jù)類型轉(zhuǎn)換必須聲明是隱式或者顯式,以說明怎么使用它2014-01-01