2009-03-10 16 views
33

Tengo que evitar que Windows se quede dormido cuando mi programa se está ejecutando.¿Evita que las ventanas entren en suspensión cuando mi programa se está ejecutando?

Y no solo quiero evitar el temporizador de reposo, también quiero cancelar el evento de reposo si presiono el botón de reposo o de cualquier otra manera le digo a la computadora que duerma. Por lo tanto, SetThreadExecutionState no es suficiente.

O ... en realidad no tengo que evitar que duerma completamente, solo lo demore 5-10 segundos para permitir que mi programa termine una tarea.

(sé que esto es el mal comportamiento del programa, pero es sólo para uso personal.)

Respuesta

21

Tuve un problema como este con un dispositivo de hardware conectado a través de USB. XP/Vista dormiría/hibernaría justo en el medio de ... Genial dices, cuando se reanuda puede continuar. Si el hardware todavía está conectado !!! Los usuarios tienen la costumbre de sacar los cables cuando les da la gana.

que necesita para manejar XP y Vista

Bajo trampa XP el WM_POWERBROADCAST y buscar la wparam PBT_APMQUERYSUSPEND.

// See if bit 1 is set, this means that you can send a deny while we are busy 
    if (message.LParam & 0x1) 
    { 
     // send the deny message 
     return BROADCAST_QUERY_DENY; 
    } // if 
    else 
    { 
     return TRUE; 
    } // else 

Bajo Vista utilizan SetThreadExecutionState como esto

// try this for vista, it will fail on XP 
if (SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED) == NULL) 
{ 
    // try XP variant as well just to make sure 
    SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); 
} // if 

y cuando la aplicación ha terminado de configurarlo de nuevo a normal

// set state back to normal 
SetThreadExecutionState(ES_CONTINUOUS); 
+1

Hmm, estaba equivocado, SetThreadExecutionState realmente funcionó, solo tuve que configurar ES_AWAYMODE_REQUIRED también. Lo extraño es que mi monitor se pone negro pero el sistema nunca se queda completamente dormido. –

+1

Eso es lo La idea es que la computadora normalmente estará durmiendo, por lo que está hecha para parecer que está durmiendo. Luego, cuando la tarea de fondo está lista (por ejemplo, grabar un programa de TV), la aplicación apaga el sistema requerido y lo aleja. bits de modo y la computadora en realidad se queda dormida. –

+0

> Lo extraño es que mi monitor se pone negro pero el sistema nunca se queda totalmente dormido --- tal vez ese es simplemente el protector de pantalla vacío predeterminado? – himself

0

¿Qué hay de despertar una copia de seguridad si se va a dormir?

http://www.enterprisenetworksandservers.com/monthly/art.php?1049

+0

no es posible, tengo que desactivar un dispositivo wifi-_antes_ el equipo se va a dormir.De lo contrario, el dispositivo quedará inutilizable cuando vuelva a encender la computadora. Intel es lento con drivers win7 :( –

17

Después de considerar la respuesta de vim

"Uso PowerCreateRequest, PowerSetRequest, y PowerClearRequest funciones es el método preferido."

con el AvailabilityRequests.docx vinculado en msdn que es agotador para entrar en ella (demasiado para leer), me han buscado en la web para un ejemplo concreto en que se basa en la PowerCreateRequest y se encontró http://go4answers.webhost4life.com/Example/problem-monitor-wakeup-service-windows7-12092.aspx [EDITAR 2016 - ya no está disponible]

copiado y adaptado a mis necesidades (PInvoke de CloseHandle copiado de msdn):

using System.Runtime.InteropServices; 

    #region prevent screensaver, display dimming and automatically sleeping 
    POWER_REQUEST_CONTEXT _PowerRequestContext; 
    IntPtr _PowerRequest; //HANDLE 

    // Availability Request Functions 
    [DllImport("kernel32.dll")] 
    static extern IntPtr PowerCreateRequest(ref POWER_REQUEST_CONTEXT Context); 

    [DllImport("kernel32.dll")] 
    static extern bool PowerSetRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType); 

    [DllImport("kernel32.dll")] 
    static extern bool PowerClearRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] 
    internal static extern int CloseHandle(IntPtr hObject); 

    // Availablity Request Enumerations and Constants 
    enum PowerRequestType 
    { 
     PowerRequestDisplayRequired = 0, 
     PowerRequestSystemRequired, 
     PowerRequestAwayModeRequired, 
     PowerRequestMaximum 
    } 

    const int POWER_REQUEST_CONTEXT_VERSION = 0; 
    const int POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x1; 
    const int POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x2; 

    // Availablity Request Structures 
    // Note: Windows defines the POWER_REQUEST_CONTEXT structure with an 
    // internal union of SimpleReasonString and Detailed information. 
    // To avoid runtime interop issues, this version of 
    // POWER_REQUEST_CONTEXT only supports SimpleReasonString. 
    // To use the detailed information, 
    // define the PowerCreateRequest function with the first 
    // parameter of type POWER_REQUEST_CONTEXT_DETAILED. 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct POWER_REQUEST_CONTEXT 
    { 
     public UInt32 Version; 
     public UInt32 Flags; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string 
      SimpleReasonString; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct PowerRequestContextDetailedInformation 
    { 
     public IntPtr LocalizedReasonModule; 
     public UInt32 LocalizedReasonId; 
     public UInt32 ReasonStringCount; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string[] ReasonStrings; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct POWER_REQUEST_CONTEXT_DETAILED 
    { 
     public UInt32 Version; 
     public UInt32 Flags; 
     public PowerRequestContextDetailedInformation DetailedInformation; 
    } 
    #endregion 



    /// <summary> 
    /// Prevent screensaver, display dimming and power saving. This function wraps PInvokes on Win32 API. 
    /// </summary> 
    /// <param name="enableConstantDisplayAndPower">True to get a constant display and power - False to clear the settings</param> 
    private void EnableConstantDisplayAndPower(bool enableConstantDisplayAndPower) 
    { 
     if (enableConstantDisplayAndPower) 
     { 
      // Set up the diagnostic string 
      _PowerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION; 
      _PowerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING; 
      _PowerRequestContext.SimpleReasonString = "Continuous measurement"; // your reason for changing the power settings; 

      // Create the request, get a handle 
      _PowerRequest = PowerCreateRequest(ref _PowerRequestContext); 

      // Set the request 
      PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired); 
      PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired); 
     } 
     else 
     { 
      // Clear the request 
      PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired); 
      PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired); 

      CloseHandle(_PowerRequest); 
     } 
    } 
+6

Este método es bueno porque las razones que da para que el sistema no duerma, etc. aparecerán cuando ejecute powercfg/requests. Esto ayudará a los usuarios a diagnosticar problemas de sueño – Schneider

Cuestiones relacionadas