Freitag, 14. Februar 2014

Standby Modus verhindern

Hört man zum Beispiel Musik oder schaut einen Film, bleibt der Windows Computer an und geht trotz fehlender Benutzereingabe nicht in den Energiesparmodus / Standby Modus über. Bei laufenden C# Anwendungen tut er dies allerdings.
Heute möchte ich zeigen, wie man dieses verhindert. Dafür müssen wir über P/Invoke die Funktion SetThreadExecutionState() einbinden, über welche man dem System mitteilen kann, dass das Programm es zur Zeit benötigt.
Gesetzt werden können unter anderem die folgenden 2 Status:

  • ES_DISPLAY_REQUIRED: Dieser Modus verhindert das Ausschalten des Displays.
  • ES_SYSTEM_REQUIRED: Dieser Modus verhindert das Abschalten des ganzen Systems.
Ruft man die Funktion nur mit einem dieser Status einzeln auf, wird lediglich der Timer für das jeweilige Event zurückgesetzt, das heißt ab dem Zeitpunkt des Aufrufs zählt das System wieder als unbenutzt und nach Ablauf der eingestellten Zeit schaltet sich der Bildschirm / das System aus.
Um das Abschalten komplett zu verhindern muss die Funktion entweder periodisch aufgerufen werden oder man verodert den Status beim Aufruf mit ES_CONTINOUS, so reicht ein einmaliger Aufruf.
Das folgende Beispielprogramm teilt beim Start dem Betriebssystem mit, dass es nie in den Standby Modus übergehen soll:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public enum EXECUTION_STATE : uint
        {
            ES_AWAYMODE_REQUIRED = 0x00000040,
            ES_CONTINUOUS = 0x80000000,
            ES_DISPLAY_REQUIRED = 0x00000002,
            ES_SYSTEM_REQUIRED = 0x00000001
        }

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

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
        }
    }
}

Keine Kommentare:

Kommentar veröffentlichen