2008-10-29 15 views

Respuesta

8

Si desea que su programa no se ponga en reposo mientras se está ejecutando, la mejor manera es crear una función de tipo KeepAlive que llame a SystemIdleTimerReset, SHIdleTimerReset y simule una pulsación de tecla. Entonces necesitas llamarlo mucho, básicamente en todas partes.

#include <windows.h> 
#include <commctrl.h> 

extern "C" 
{ 
    void WINAPI SHIdleTimerReset(); 
}; 

void KeepAlive() 
{ 
    static DWORD LastCallTime = 0; 
    DWORD TickCount = GetTickCount(); 
    if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound 
    { 
     SystemIdleTimerReset(); 
     SHIdleTimerReset(); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0); 
     keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0); 
     LastCallTime = TickCount; 
    } 
} 

Este método solo funciona cuando el usuario inicia la aplicación manualmente.

Si su aplicación se inicia con una notificación (es decir, mientras el dispositivo está suspendido), entonces necesita hacer más o su aplicación será suspendida después de un corto período de tiempo hasta que el usuario apague el dispositivo modo. Para manejar esto, debe poner el dispositivo en el modo de alimentación desatendida.

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE)) 
{ 
    // handle error 
} 

// do long running process 

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE)) 
{ 
    // handle error 
} 

Durante el uso modo desatendido, usted todavía tiene que llamar a la KeepAlive mucho, se puede utilizar un hilo separado que duerme durante x milisegundos y pide la funcation mantener viva.

Tenga en cuenta que el modo desatendido no lo pone fuera del modo de reposo, pone el dispositivo en un extraño estado semi-despierto.

Por lo tanto, si inicia un modo desatendido mientras el dispositivo está en modo suspendido, no se activará la pantalla ni nada. Todo el modo desatendido hace que WM deje de suspender su aplicación. Además, el otro problema es que no funciona en todos los dispositivos, algunos dispositivos de administración de energía no son muy buenos y te suspenderán de todos modos sin importar lo que hagas.

1

Probablemente mediante la modificación de los "Estados de alimentación del sistema", como described here (pero en C#)

Ese artículo también describe una manera de evitar que el dispositivo móvil para dormir (que no es exactamente lo que es posible que desee), llamando la función nativa SystemIdleTimerReset() periódicamente (para evitar que el dispositivo se apague).

6

Modifique the Power Manager registry setting que afecte a la condición de suspensión específica que desee (tiempo de espera, rebobinado, alimentación de CA, etc.) y el evento SetEvent en un evento del sistema denominado "PowerManager/ReloadActivityTimeouts" para indicar al SO que vuelva a cargar la configuración.

Cuestiones relacionadas