2011-06-10 19 views
36

Estoy trabajando en una aplicación C# que se ejecuta en segundo plano sin ningún control de Windows.¿Cómo evitar que Windows entre en estado inactivo?

Quiero notificar a Windows que mi aplicación todavía 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 todavía está activa?

Gracias de antemano.

+4

Asegúrese de que sus usuarios puedan de alguna manera saben que la aplicación necesita ser ejecutado de manera continua y que impide que Windows se va inactivo. Esto es especialmente importante para los usuarios con computadoras portátiles. –

Respuesta

9

Puede utilizar SetThreadExecutionState describe aquí:

Dado que es una función de la API de Win32, para usarlo desde C# que necesita para PInvoke ella. se describen los pasos aquí, incluyendo un método de muestreo PreventSleep para desactivar temporalmente el modo de suspensión:

+1

Esto no funciona en Windows 10 (64 bit). –

+0

¿Alguien sabe un método de trabajo para Windows 10? –

17

Usted tiene un par de opciones:

  • Uso SetThreadExecutionState, que:

    Habilita una aplicación para informar 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.

    Cuando usted podría utilizar la bandera ES_SYSTEM_REQUIRED a

    obliga al sistema a estar en el estado de trabajo restableciendo el sistema de temporizador de inactividad.

  • Uso SendInput a golpe de teclado falso, el movimiento del ratón/clics

  • Otra alternativa sería cambiar su aplicación como un servicio de Windows.

ejemplo 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); 
0

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

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

31

Tiene que 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; 
} 
+0

en algunas máquinas con Windows XP de nuestros clientes, NativeMethods.SetThreadExecutionState nunca devuelve 0, ¿alguna idea? – Alessio

+4

@Alessio - un retorno de '0 'significa que el método falló. De la documentación de 'SetThreadExecutionState' -" Si la función tiene éxito, el valor de retorno es el estado de ejecución del hilo anterior. Si la función falla, el valor de retorno es NULL. " (Nota: supongo que probablemente ya se haya dado cuenta, pero quería publicar una respuesta para que esté completa y para ayudar a cualquier otra persona que pueda venir y ver su comentario) – pstrjds

+0

Al tratar de resolver un problema de sueño recurrente y difícil de resolver con un Surface Pro 3 corriendo Windows 8.1, puedo afirmar con claridad que esta solución desafortunadamente no funciona para este problema en este sistema operativo. – Redgum

0

Aquí es SetThreadExecutionState C# aplicación

Cuestiones relacionadas