#author("2021-09-08T21:57:21+09:00","","")
#author("2021-09-08T21:58:32+09:00","","")
#navi(../)

* スリープの抑止、モニター電源オフの抑止のサンプルコード [#c143832d]
WinAPIの''SetThreadExecutionState''を使って、スリープの抑止(モニターの電源はオフされます)や~
モニター電源オフの抑止をするコンソールアプリケーションのサンプルコードを以下に記します。

#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)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS