WinAPIのSetThreadExecutionStateを使って、スリープの抑止(モニターの電源はオフされます)や
モニター電源オフの抑止をするコンソールアプリケーションのサンプルコードを以下に記します。
本サンプルコードを元に通知エリアに常駐する PreventZzz をオープンソースで公開していますので参考にしてください。
GitHub PreventZzz
https://github.com/oss-sakura/PreventZzz
C#, Visual Basic(VB)ともにSetThreadExecutionState APIを使った3つの関数(メソッド)を実装しています。
起動すると以下のメッセージが表示されますので、対応する数字キーを押してください。
以下にC#, Visual Basic(VB)のサンプルコードを記します。
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1.スリープの抑止(モニターはオフされます)");
Console.WriteLine("2.モニターオフの抑止(スリープも抑止されます)");
Console.WriteLine("3.抑止の解除");
Console.WriteLine("9.終了");
for (; ; )
{
Console.Write("> ");
ConsoleKeyInfo sel = Console.ReadKey();
if (sel.Key == ConsoleKey.D9)
break;
switch (sel.Key)
{
case ConsoleKey.D1:
Win32ApiExecutionState.PreventSleep();
break;
case ConsoleKey.D2:
Win32ApiExecutionState.PreventMonitorPowerOff();
break;
case ConsoleKey.D3:
Win32ApiExecutionState.Reset();
break;
default:
Console.Write(" <-?");
break;
}
Console.WriteLine();
if (ConsoleKey.D9 == sel.Key)
break; // exit for
}
}
}
public static class Win32ApiExecutionState
{
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
ES_SYSTEM_REQUIRED = 0x00000001,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
}
public static void PreventMonitorPowerOff()
{
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
}
public static void PreventSleep()
{
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
}
public static void Reset()
{
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
}
}
Imports System
Imports System.Runtime.InteropServices
Module Module1
<FlagsAttribute>
Public Enum EXECUTION_STATE As UInteger
ES_SYSTEM_REQUIRED = &H1
ES_DISPLAY_REQUIRED = &H2
ES_AWAYMODE_REQUIRED = &H40
ES_CONTINUOUS = &H80000000UI
End Enum
<DllImport("kernel32.dll")>
Function SetThreadExecutionState(esFlags As EXECUTION_STATE) As EXECUTION_STATE
End Function
Sub Main()
Console.WriteLine("1.スリープの抑止(モニターはオフされます)")
Console.WriteLine("2.モニターオフの抑止(スリープも抑止されます)")
Console.WriteLine("3.抑止の解除")
Console.WriteLine("9.終了")
While True
Console.Write("> ")
Dim sel As ConsoleKeyInfo = Console.ReadKey()
If sel.Key = ConsoleKey.D9 Then Exit While
Select Case sel.Key
Case ConsoleKey.D1
PreventSleep()
Case ConsoleKey.D2
PreventMonitorPowerOff()
Case ConsoleKey.D3
Reset()
Case Else
Console.Write(" <-?")
End Select
Console.WriteLine()
If ConsoleKey.D9 = sel.Key Then Exit While
End While
End Sub
Sub PreventMonitorPowerOff()
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS Or EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_SYSTEM_REQUIRED)
End Sub
Sub PreventSleep()
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS Or EXECUTION_STATE.ES_SYSTEM_REQUIRED)
End Sub
Sub Reset()
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)
End Sub
End Module
以上、SetThreadExecutionState API を使ってスリープ、モニタオフの抑止を行うサンプルコードでした。