使用以下行禁用系统睡眠时:
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
我怎么能说它有效?例如,在我的一台计算机上,它不起作用。计算机仍然进入睡眠状态,但也不例外。如果没有异常,有没有其他方法可以知道调用 SetThreadExecutionSTate 失败了?
的返回值SetThreadExecutionState
用于指示成功或失败。这在文档中有所描述。
返回值
如果函数成功,则返回值为之前的线程执行状态。
如果函数失败,则返回值为
NULL
。
的值NULL
很简单0
,因此您可以通过将返回值与0
. 所以失败的时候不会有异常。返回值将只是0
. 不要指望 Windows API 函数会引发异常来表示失败。他们根本不这样做。
您需要的从pinvoke.net获得的 p/invoke 签名是:
[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
.
该函数返回一个值来指示操作是否成功。如果返回值为NULL
,则操作失败。(来源)
返回值NULL
等于0
.
因此,您应该在变量中捕获返回值并检查它是否为零:
uint result = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS |
EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
if (result != 0)
{
// Function failed...
}