48 votes

Comment empêcher Windows d'entrer en état d'inactivité ?

Je travaille sur une application C# qui s'exécute en arrière-plan sans aucun contrôle Windows.

Je souhaite informer Windows que mon application est toujours active pour empêcher Windows de passer à l'état inactif.

Existe-t-il des API disponibles à appeler depuis mon application qui informent le système d'exploitation Windows que mon application est toujours active ?

Merci d'avance.

44voto

Jota Points 3812

Vous devez utiliser la fonction SetThreadExecutionState. Quelque chose comme ça:

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

0voto

Tremmors Points 1690

Je ne pense pas qu'il existe un moyen de le faire directement dans le code managé.

Une recherche rapide révèle ce post d'il y a 2 ans. Fondamentalement, vous auriez besoin de faire de l'interopérabilité pour appeler une API Windows brute.

-3voto

JDE Points 160

Voici la mise en œuvre de SetThreadExecutionState C#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X