的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