Windowsでスタンバイを抑止する方法

この作業中はスタンバイになって欲しくないとか、画面をずっと表示させて欲しいとかいう場面に出くわすことがあると思います。そんなときにはWin32APIのSetThreadExecutionStateを呼び出すとうまく行くようです。
当たり前ですが、Win32APIを用いるのでWindowsのみとなります。


宣言や書き方は下を御覧下さい。

宣言

まずkernel32.dllから次の様にネイティブ関数をインポートします

[DllImport("kernel32.dll")]
extern static ExecutionState SetThreadExecutionState(ExecutionState esFlags);

ここでExecutionStateという型*1は次のuint列挙型です。

[FlagsAttribute]
public enum ExecutionState : uint
{
	// 関数が失敗した時の戻り値
	Null = 0,
	// スタンバイを抑止
	SystemRequired = 1,
	// 画面OFFを抑止
	DisplayRequired = 2,
	// 効果を永続させる。ほかオプションと併用する。
	Continuous = 0x80000000,
}

使用例

スタンバイまでの時間をリセット

SetThreadExecutionState(ExecutionState.SystemRequired);

スタンバイをずっと抑止させる

SetThreadExecutionState(ExecutionState.SystemRequired | ExecutionState.Continuous);

抑止効果を解除

SetThreadExecutionState( ExecutionState.Continuous);

と言った感じです。

ちゃんとエラーを把握したい場合は

if (SetThreadExecutionState(ExecutionState.SystemRequired) == ExecutionState.Null)
	throw new Exception("SetThreadExecutionState Failed...");

のようにすると良いかも知れませんね。

*1:MSDNのそのままの宣言だとC#っぽくないと思い、宣言を若干変更しました。