- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-09-08T21:43:10+09:00","","")
#author("2021-09-08T21:58:32+09:00","","")
#navi(../)
* スリープの抑止、モニター電源オフの抑止のサンプルコード [#c143832d]
WinAPIの''SetThreadExecutionState''を使って、スリープの抑止(モニターの電源はオフされます)やモニター電源オフの抑止をするサンプルコードを以下に記します。
WinAPIの''SetThreadExecutionState''を使って、スリープの抑止(モニターの電源はオフされます)や~
モニター電源オフの抑止をするコンソールアプリケーションのサンプルコードを以下に記します。
また、本サンプルコードを元に通知エリアに常駐する [[PreventZzz>https://github.com/oss-sakura/PreventZzz]] をオープンソースで公開していますので参考にしてください。~
#contents
#htmlinsert(windev-top.html)
* サンプルコードを使ったソースを公開 [#z22bda3a]
本サンプルコードを元に通知エリアに常駐する [[PreventZzz>https://github.com/oss-sakura/PreventZzz]] をオープンソースで公開していますので参考にしてください。~
>''GitHub PreventZzz''~
https://github.com/oss-sakura/PreventZzz
#ref(Zzz.png)
* 動作確認環境 [#x517bb60]
-Windows 10 ver.21H1
-Visual Studio 2019
-.NET Framework 4.7.2
* サンプルコードの説明 [#q3e1826a]
C#, Visual Basic(VB)ともにSetThreadExecutionState APIを使った3つの関数(メソッド)を実装しています。
+ PreventMonitorPowerOff~
モニターの電源オフを抑止します。~
モニターが電源オフされませんので、スリープももちろん抑止されます。
+ PreventSleep~
スリープが抑止されます。~
モニターの電源オフは抑止されません。
+ Reset~
PreventMonitorPowerOff, PreventSleep で設定した抑止を解除します。
** 使い方 [#n9f95156]
起動すると以下のメッセージが表示されますので、対応する数字キーを押してください。
- 1.スリープの抑止(モニターはオフされます)
- 2.モニターオフの抑止(スリープも抑止されます)
- 3.抑止の解除
- 9.終了
* サンプルコード [#pef5cb18]
以下にC#, Visual Basic(VB)のサンプルコードを記します。
** C# [#u7e24a99]
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);
}
}
** Visual Basic(VB) [#d634fefb]
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 を使ってスリープ、モニタオフの抑止を行うサンプルコードでした。
#htmlinsert(windev-btm.html)