C# で画面がスリープしないようにする 質問する

C# で画面がスリープしないようにする 質問する

数分後に画面がスリープ状態になったりロック状態になったりしないように、画面上でポインターを移動するための小さな C# コンソール アプリを作成しました。残念ながら、数分後に画面はスリープ状態になります。

ユーザー入力 (マウスまたはキーボード) のように動作し、画面が自動的にスリープ/ロックされるのを防ぐものを C# で実際に記述できるかどうか知っている人はいますか?

私が持っているもので、うまくいくかもしれないと思ったものは次のとおりです。

class Program
{
    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);

    static Random rnd = new Random();

    static void Main(string[] args)
    {

        Rectangle screenRes = Screen.PrimaryScreen.Bounds;
        int widtMax = screenRes.Width;
        int heighMax = screenRes.Height;

        int w;
        int h;

        do
        {
            while (!Console.KeyAvailable)
            {
                w = rnd.Next(1, widtMax);
                h = rnd.Next(1, heighMax);

                SetCursorPos(w, h);
                System.Threading.Thread.Sleep(1000);
            }
        } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
    }
}

ベストアンサー1

活用できるSetThreadExecutionState

アプリケーションが使用中であることをシステムに通知できるようにすることで、アプリケーションの実行中にシステムがスリープ状態になったりディスプレイがオフになったりするのを防ぎます。

備考

なしで呼び出すと、アイドル タイマーがリセットされるSetThreadExecutionStateだけですES_CONTINUOUS。ディスプレイまたはシステムを動作状態に保つには、スレッドがSetThreadExecutionState定期的に呼び出す必要があります。

電源管理されたコンピュータで適切に実行するには、FAX サーバー、留守番電話、バックアップ エージェント、ネットワーク管理アプリケーションなどのアプリケーションは、イベントを処理するときにES_SYSTEM_REQUIREDと の両方を使用ES_CONTINUOUSする必要があります。ビデオ プレーヤーやプレゼンテーション アプリケーションなどのマルチメディア アプリケーションは、ES_DISPLAY_REQUIREDユーザー入力がない状態で長時間ビデオを表示するときに を使用する必要があります。ワード プロセッサ、スプレッドシート、ブラウザー、ゲームなどのアプリケーションは、 を呼び出す必要はありませんSetThreadExecutionState

DLLインポート

[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);

列挙型

[FlagsAttribute]
public enum EXECUTION_STATE :uint
{
     ES_AWAYMODE_REQUIRED = 0x00000040,
     ES_CONTINUOUS = 0x80000000,
     ES_DISPLAY_REQUIRED = 0x00000002,
     ES_SYSTEM_REQUIRED = 0x00000001
     // Legacy flag, should not be used.
     // ES_USER_PRESENT = 0x00000004
}

使用法

void PreventSleep ()
{
    // Prevent Idle-to-Sleep (monitor not affected) (see note above)
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
}

2021年2月8日更新:

完全な例を探している人のために、これを実装したプロジェクトを github で見つけました。https://github.com/pedrolcl/スクリーンセーバー

おすすめ記事