2011-06-10 404 views
36

我正在研究一個C#應用程序,它在沒有任何Windows控件的情況下在後臺運行。如何防止Windows進入閒置狀態?

我想通知Windows,我的應用程序仍處於活動狀態,以防止Windows進入空閒狀態。

是否有任何API可以從我的應用程序中調用,以通知Windows操作系統我的應用程序仍然存在?

在此先感謝。

+4

一定要讓你的用戶莫名其妙地知道,應用程序需要連續運行,並且它阻止Windows會閒置。這對於使用筆記本電腦的用戶尤其重要。 – 2011-06-10 05:31:56

回答

9

您可以使用此處描述SetThreadExecutionState

既然是一個Win32 API函數,用它從C#你需要的PInvoke它。這裏描述的步驟,包括樣品的方法PreventSleep暫時禁用休眠模式:

+1

這不適用於Windows 10(64位)。 – 2015-11-05 22:54:43

+0

有誰知道Windows 10的工作方法? – 2017-07-17 12:01:51

17

你有兩個選擇:

  • 使用SetThreadExecutionState,其中:

    使應用程序以通知系統它正在使用,從而防止系統在應用程序運行時進入睡眠狀態或關閉顯示器。

    在那裏你可以使用ES_SYSTEM_REQUIRED標誌

    強制系統復位系統空閒計時器是在工作狀態。

  • 使用SendInput假按鍵,鼠標移動/點擊

  • 另一種方法是改變你的應用程序是一個Windows服務。

SetThreadExecutionState例如

// Television recording is beginning. Enable away mode and prevent 
// the sleep idle time-out. 
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED); 

// Wait until recording is complete... 
// Clear EXECUTION_STATE flags to disable away mode and allow the system 
// to idle to sleep normally. 
SetThreadExecutionState(ES_CONTINUOUS); 
0

我不認爲有任何方式直接在託管代碼中做到這一點。

快速搜索顯示從2年前發佈this。基本上你需要做一些互操作來調用一個原始的Windows API。

31

您必須使用SetThreadExecutionState函數。事情是這樣的:

public partial class MyWinForm: Window 
{ 
    private uint fPreviousExecutionState; 

    public Window1() 
    { 
     InitializeComponent(); 

     // Set new state to prevent system sleep 
     fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
      NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); 
     if (fPreviousExecutionState == 0) 
     { 
      Console.WriteLine("SetThreadExecutionState failed. Do something here..."); 
      Close(); 
     } 
    } 

    protected override void OnClosed(System.EventArgs e) 
    { 
     base.OnClosed(e); 

     // Restore previous state 
     if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0) 
     { 
      // No way to recover; already exiting 
     } 
    } 
} 

internal static class NativeMethods 
{ 
    // Import SetThreadExecutionState Win32 API and necessary flags 
    [DllImport("kernel32.dll")] 
    public static extern uint SetThreadExecutionState(uint esFlags); 
    public const uint ES_CONTINUOUS = 0x80000000; 
    public const uint ES_SYSTEM_REQUIRED = 0x00000001; 
} 
+0

在我們的客戶端的一些Windows XP機器上,NativeMethods.SetThreadExecutionState永遠不會返回0,任何想法? – Alessio 2015-03-23 11:52:09

+4

@Alessio - 返回「0」表示該方法失敗。從'SetThreadExecutionState'的文檔中 - 如果函數成功,則返回值是前一個線程的執行狀態。 如果函數失敗,則返回值爲NULL。 (注意 - 我假設你可能已經想通了,但想要發佈一個完整答案並幫助任何可能會出現並查看你的評論的人) – pstrjds 2016-06-14 09:36:43

+0

在試圖解決循環並難以解決睡眠問題時一個運行Windows 8.1的Surface Pro 3,我可以清楚地說明這個解決方案很不幸在這個操作系統上無法解決這個問題。 – Redgum 2016-08-24 23:50:35

0

這裏是SetThreadExecutionState C#實現

相關問題