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

时间:2013-03-05 14:09:30

标签: c# windows pinvoke

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

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);

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

2 个答案:

答案 0 :(得分:11)

SetThreadExecutionState的返回值用于表示成功或失败。这在documentation

中有所描述
  

返回值

     

如果函数成功,则返回值为   先前的线程执行状态。

     

如果函数失败,则返回   值为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

答案 1 :(得分:1)

该函数返回一个值以指示操作是否成功。如果返回值为NULL,则操作失败。 (Source)

返回值为NULL,相当于0

因此,您应该捕获变量中的返回值并检查它是否为零:

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