web-dev-qa-db-ja.com

画面が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);
    }
}
7
Klicker

SetThreadExecutionState を利用できます

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

備考

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

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

DllImport

[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);
}

14
Michael Randall