web-dev-qa-db-fra.com

Comment empêcher Windows d'entrer en mode veille?

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 avertissent le système d'exploitation Windows que mon application est toujours active?

Merci d'avance.

38
user724789

Vous devez utiliser SetThreadExecutionState function. 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;
}
34
Joao

Vous avez plusieurs options:

  • Utilisez SetThreadExecutionState , qui:

    Permet à une application d'informer le système de son utilisation, empêchant ainsi le système de passer en mode veille ou d'éteindre l'écran pendant l'exécution de l'application.

    Où vous pouvez utiliser le drapeau ES_SYSTEM_REQUIRED pour

    Force le système à fonctionner en réinitialisant la minuterie d'inactivité du système.

  • Utilisez SendInput pour simuler une frappe, un mouvement de souris/des clics

  • Une autre alternative serait de changer votre application pour qu’elle soit un service Windows.

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

Vous pouvez utiliser SetThreadExecutionState décrit ici:

Comme il s’agit d’une fonction API Win32, pour l’utiliser à partir de C #, vous devez l’invoquer. Les étapes sont décrites ici, y compris un exemple de méthode PreventSleep pour désactiver temporairement le mode veille:

9
Rick Sladkey

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

Une recherche rapide révèle this post il y a 2 ans. Fondamentalement, vous devrez faire quelques interop pour appeler une API Windows brute. 

0
Tremmors

Voici SetThreadExecutionState C # implementation

0
JDE