的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
。
如果您再次調用它,則返回的值應包含您第一次設置的標誌。如果沒有,就會出現問題。 – 2013-03-05 21:21:18
只需以管理員身份運行'powercfg/requests'並查看結果。 – diversenok 2017-12-17 20:19:09