webentwicklung-frage-antwort-db.com.de

So verhindern Sie, dass Windows in den Ruhezustand wechselt?

Ich arbeite an einer C # -Anwendung, die im Hintergrund ohne Windows-Steuerung ausgeführt wird.

Ich möchte Windows darüber informieren, dass meine Anwendung noch aktiv ist, um zu verhindern, dass Windows in den Ruhezustand wechselt.

Gibt es APIs, die von meiner Anwendung aus aufgerufen werden können und die das Windows-Betriebssystem darüber informieren, dass meine Anwendung noch aktiv ist?

Danke im Voraus.

38
user724789

Sie müssen die Funktion SetThreadExecutionState verwenden. Etwas wie das:

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;
}
34
Joao

Sie haben mehrere Möglichkeiten:

  • Verwenden Sie SetThreadExecutionState , wobei:

    Ermöglicht einer Anwendung, das System über die Verwendung zu informieren, um zu verhindern, dass das System in den Ruhezustand wechselt oder die Anzeige deaktiviert, während die Anwendung ausgeführt wird.

    Wo könnte man das Flag ES_SYSTEM_REQUIRED verwenden?

    Zwingt das System in den Arbeitszustand, indem der Systemleerlaufzeitgeber zurückgesetzt wird.

  • Verwenden Sie SendInput , um Tastenanschläge, Mausbewegungen/Klicks zu fälschen

  • Eine andere Alternative wäre, Ihre App als Windows-Dienst zu ändern.

SetThreadExecutionState - Beispiel

// 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);
17
Gustavo Mori

Sie können die hier beschriebene SetThreadExecutionState verwenden:

Da es sich um eine Win32-API-Funktion handelt, müssen Sie sie von C # aus aktivieren, um sie zu verwenden. Die Schritte werden hier beschrieben, einschließlich einer Beispielmethode PreventSleep, um den Ruhemodus vorübergehend zu deaktivieren:

9
Rick Sladkey

Ich glaube nicht, dass dies direkt in verwaltetem Code möglich ist. 

Eine schnelle Suche enthüllt this post von vor 2 Jahren. Grundsätzlich müssten Sie etwas Interop machen, um eine unformatierte Windows-API aufzurufen. 

0
Tremmors

Hier ist SetThreadExecutionState C # -Implementierung

0
JDE