c# アプリ - Windowsがアイドル状態に入るのを防ぐ方法は?




開発 windowsフォーム (5)

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

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

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

前もって感謝します。


Answers

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

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


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を使用できます。

それはWin32 API関数なので、C#から使用するには、それをPInvokeする必要があります。 ここでは、Sleepモードを一時的に無効にするためのPreventSleepサンプルメソッドを含む手順について説明します。


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


上記の答えのどれも何らかの理由で助けられなかったので、彼らは敷物の下でエラーを掃除し、トラブルシューティングを困難にしているようです。 だから私はこのようなもので行くことになった、おそらくそれは他の誰かを助けるでしょう:

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\tf.exe",
        Arguments = "checkout AndroidManifest.xml",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = @"C:\MyAndroidApp\"
    }
};

proc.Start();






c# windows