¿Cómo evitar que Windows entre en estado inactivo?

Estoy trabajando en una aplicación C # que se ejecuta en segundo plano sin ningún control de Windows.

Deseo notificar a Windows que mi aplicación aún está activa para evitar que Windows entre en el estado inactivo.

¿Hay alguna API disponible para llamar desde mi aplicación que notifique al sistema operativo Windows que mi aplicación aún está activa?

Gracias por adelantado.

Debes usar la función SetThreadExecutionState . Algo como esto:

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

Tienes unas cuantas opciones:

  • Use SetThreadExecutionState , que:

    Permite que una aplicación informe al sistema que está en uso, lo que impide que el sistema entre en suspensión o apague la pantalla mientras se ejecuta la aplicación.

    Donde podría usar el indicador ES_SYSTEM_REQUIRED para

    Obliga al sistema a estar en el estado de trabajo reiniciando el temporizador de inactividad del sistema.

  • Utilice SendInput para simular una pulsación de tecla, el movimiento del mouse / clics

  • Otra alternativa sería cambiar tu aplicación para que sea un servicio de Windows.

Ejemplo de 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); 

Puede usar SetThreadExecutionState descrito aquí:

  • Función SetThreadExecutionState

Como se trata de una función API de Win32, para usarla desde C #, deberá invocarla. Los pasos se describen aquí, incluido un método de muestra PreventSleep para deshabilitar temporalmente el modo de suspensión:

  • PInvoke.net: setthreadexecutionstate (kernel32)

No creo que haya ninguna forma de hacerlo directamente en el código administrado.

Una búsqueda rápida revela esta publicación de hace 2 años. Básicamente, necesitarías hacer algo de interoperabilidad para llamar a una API de Windows sin procesar.

Aquí está la implementación de SetThreadExecutionState C #