このエントリーをはてなブックマークに追加


スリープの抑止、モニター電源オフの抑止のサンプルコード

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

サンプルコードを使ったソースを公開

本サンプルコードを元に通知エリアに常駐する PreventZzz をオープンソースで公開していますので参考にしてください。

GitHub PreventZzz
https://github.com/oss-sakura/PreventZzz

Zzz.png

動作確認環境

  • Windows 10 ver.21H1
  • Visual Studio 2019
  • .NET Framework 4.7.2

サンプルコードの説明

C#, Visual Basic(VB)ともにSetThreadExecutionState APIを使った3つの関数(メソッド)を実装しています。

  1. PreventMonitorPowerOff
    モニターの電源オフを抑止します。
    モニターが電源オフされませんので、スリープももちろん抑止されます。
  2. PreventSleep
    スリープが抑止されます。
    モニターの電源オフは抑止されません。
  3. Reset
    PreventMonitorPowerOff, PreventSleep で設定した抑止を解除します。

使い方

起動すると以下のメッセージが表示されますので、対応する数字キーを押してください。

  • 1.スリープの抑止(モニターはオフされます)
  • 2.モニターオフの抑止(スリープも抑止されます)
  • 3.抑止の解除
  • 9.終了

サンプルコード

以下にC#, Visual Basic(VB)のサンプルコードを記します。

C#

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)

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 を使ってスリープ、モニタオフの抑止を行うサンプルコードでした。


添付ファイル: fileZzz.png 112件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-08 (水) 21:58:32