8

次の行を使用してシステムスリープを無効にする場合:

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);

それが機能したことをどのように知ることができますか?たとえば、私のコンピュータの1つでは、機能しません。コンピューターのスタイルはスリープ状態になりますが、例外はありません。例外がない場合、SetThreadExecutionSTateの呼び出しが失敗したことを知る他の方法はありますか?

4

2 に答える 2

14

の戻り値は、SetThreadExecutionState成功または失敗を示すために使用されます。これについては、ドキュメントで説明されています。

戻り値

関数が成功した場合、戻り値は前のスレッド実行状態です。

関数が失敗した場合、戻り値はNULLです。

の値NULLは単純な0ので、戻り値をと比較して成功を確認できます0。したがって、失敗しても例外はありません。戻り値は単純に0。WindowsAPI関数が失敗を通知するために例外を発生させることを期待しないでください。彼らは単にそれをしません。

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

于 2013-03-05T19:48:14.813 に答える
2

この関数は、操作が成功したかどうかを示す値を返します。戻り値が の場合NULL、操作は失敗しました。(ソース)

戻り値はNULLと同等0です。

したがって、戻り値を変数にキャプチャし、それがゼロかどうかを確認する必要があります。

uint result = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS |
                                      EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
if (result != 0)
{
    // Function failed...
}
于 2013-03-05T14:12:10.890 に答える