如何检查使用SetThreadExecutionState禁用睡眠是否失败?

Lui*_*rao 6 c# windows pinvoke

使用以下行禁用系统睡眠时:

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
Run Code Online (Sandbox Code Playgroud)

我怎么知道它有效?例如,在我的一台计算机上,它不起作用.计算机stil进入睡眠状态但没有例外.如果没有异常,还有其他方法可以知道对SetThreadExecutionSTate的调用失败了吗?

Dav*_*nan 12

返回值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);
Run Code Online (Sandbox Code Playgroud)

然后你就可以这样称呼它

bool succeeded = (SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | 
    EXECUTION_STATE.ES_AWAYMODE_REQUIRED) != 0);
Run Code Online (Sandbox Code Playgroud)

如果调用失败,则引发如下异常:

if (!succeeded)
    throw new Win32Exception();
Run Code Online (Sandbox Code Playgroud)

很可能你的问题是你正在使用ES_AWAYMODE_REQUIRED.我想你应该用ES_SYSTEM_REQUIRED.