入門 - windows アプリ 開発 c#




Windowsがアイドル状態に入るのを防ぐ方法は? (4)

私はWindowsコントロールなしでバックグラウンドで実行されるC#アプリケーションの開発を進めています。

Windowsがアイドル状態にならないように、アプリケーションがまだ生きていることをWindowsに通知したい。

私のアプリケーションがまだ生きていることをWindows OSに通知するアプリケーションから呼び出せるAPIがありますか?

前もって感謝します。


SetThreadExecutionState関数を使用する必要があります。 このようなもの:

public partial class MyWinForm: Window
{
    private uint fPreviousExecutionState;

    public Window1()
    {
        InitializeComponent();

        // Set new state to prevent system sleep
        fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
            NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
        if (fPreviousExecutionState == 0)
        {
            Console.WriteLine("SetThreadExecutionState failed. Do something here...");
            Close();
        }
    }

    protected override void OnClosed(System.EventArgs e)
    {
        base.OnClosed(e);

        // Restore previous state
        if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0)
        {
            // No way to recover; already exiting
        }
    }
}

internal static class NativeMethods
{
    // Import SetThreadExecutionState Win32 API and necessary flags
    [DllImport("kernel32.dll")]
    public static extern uint SetThreadExecutionState(uint esFlags);
    public const uint ES_CONTINUOUS = 0x80000000;
    public const uint ES_SYSTEM_REQUIRED = 0x00000001;
}

いくつかのオプションがあります:

  • SetThreadExecutionState使用します。

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

    ES_SYSTEM_REQUIREDフラグを使用して

    システムアイドルタイマーをリセットして、システムを強制的に動作状態にします。

  • SendInputを使用してキーストローク、マウスの動き/クリックを偽造する

  • もう1つの選択肢は、あなたのアプリをWindowsサービスに変更することです。

SetThreadExecutionStateの例

// Television recording is beginning. Enable away mode and prevent
// the sleep idle time-out.
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED);

// Wait until recording is complete...
// Clear EXECUTION_STATE flags to disable away mode and allow the system
// to idle to sleep normally.
SetThreadExecutionState(ES_CONTINUOUS);

ここにSetThreadExecutionState C#の実装があります


私はマネージコードでこれを直接行う方法はないと思います。

クイック検索で2年前からthis投稿が表示されます。 基本的には、生のWindows APIを呼び出すためにいくつかのinteropを実行する必要があります。





windows