2013-03-05 125 views
5

当使用以下行禁用系统睡眠:如何检查是否使用SetThreadExecutionState禁用睡眠失败?

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED); 

我怎样才能知道它的工作?例如,在我的一台电脑上,它不起作用。电脑stil进入睡眠状态,但没有例外。如果没有异常,是否有任何其他方式知道对SetThreadExecutionSTate的调用失败?

+0

如果您再次调用它,则返回的值应包含您第一次设置的标志。如果没有,就会出现问题。 – 2013-03-05 21:21:18

+0

只需以管理员身份运行'powercfg/requests'并查看结果。 – diversenok 2017-12-17 20:19:09

回答

9

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

0

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

返回值是NULL这相当于0

因此,应该捕捉一个变量的返回值,并检查它是否是零:

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

问题是此方法返回一个struct(EXECUTION_STATE)并且它永远不能为null:http://www.pinvoke.net/default.aspx/kernel32.setthreadexecutionstate – 2013-03-05 14:28:12

+0

要添加到我的答案中,“EXECUTION_STATE.ES_AWAYMODE_REQUIRED”不支持Windows XP或Windows Server 2003. – 2013-03-05 14:32:16

+0

那么,根据MSDN,如果该函数失败,则此函数返回NULL ... – 2013-03-05 14:32:58