2013-03-05 123 views
5

當使用以下行禁用系統睡眠:如何檢查是否使用SetThreadExecutionState禁用睡眠失敗?

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED); 

我怎樣才能知道它的工作?例如,在我的一臺電腦上,它不起作用。電腦stil進入睡眠狀態,但沒有例外。如果沒有異常,是否有任何其他方式知道對SetThreadExecutionSTate的調用失敗?

+0

如果您再次調用它,則返回的值應包含您第一次設置的標誌。如果沒有,就會出現問題。 – 2013-03-05 21:21:18

+0

只需以管理員身份運行'powercfg/requests'並查看結果。 – diversenok 2017-12-17 20:19:09

回答

9

SetThreadExecutionState返回值是用來指示成功或失敗。這在documentation中描述。

返回值

如果函數成功,返回值是 前一個線程執行狀態。

如果該功能失敗,則返回 的值爲NULL

NULL值就是0這樣你就可以返回值對0檢查比較成功的。所以在失敗時不會有例外。返回值將簡單地爲0。不要指望Windows API函數引發異常信號失敗。他們根本就不這樣做。

的的P/Invoke簽名,你需要從pinvoke.net獲得的是:

[FlagsAttribute] 
public enum EXECUTION_STATE : uint 
{ 
    ES_AWAYMODE_REQUIRED = 0x00000040, 
    ES_CONTINUOUS = 0x80000000, 
    ES_DISPLAY_REQUIRED = 0x00000002, 
    ES_SYSTEM_REQUIRED = 0x00000001 
    // Legacy flag, should not be used. 
    // ES_USER_PRESENT = 0x00000004 
} 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags); 

然後,你可以這樣調用

bool succeeded = (SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | 
    EXECUTION_STATE.ES_AWAYMODE_REQUIRED) != 0); 

而且如果調用失敗,然後擡起這樣一個異常:

if (!succeeded) 
    throw new Win32Exception(); 

最有可能您的問題是,你正在使用ES_AWAYMODE_REQUIRED。我認爲你應該使用ES_SYSTEM_REQUIRED

0

該函數返回一個值以指示操作是否成功。如果返回值爲NULL,則操作失敗。 (Source)

返回值是NULL這相當於0

因此,應該捕捉一個變量的返回值,並檢查它是否是零:

uint result = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | 
             EXECUTION_STATE.ES_AWAYMODE_REQUIRED); 
if (result != 0) 
{ 
    // Function failed... 
} 
+1

問題是此方法返回一個struct(EXECUTION_STATE)並且它永遠不能爲null:http://www.pinvoke.net/default.aspx/kernel32.setthreadexecutionstate – 2013-03-05 14:28:12

+0

要添加到我的答案中,「EXECUTION_STATE.ES_AWAYMODE_REQUIRED」不支持Windows XP或Windows Server 2003. – 2013-03-05 14:32:16

+0

那麼,根據MSDN,如果該函數失敗,則此函數返回NULL ... – 2013-03-05 14:32:58