Pregunta

¿Alguien sabe cómo podría deshabilitar / habilitar programáticamente el modo de suspensión en Windows Mobile?

¡Gracias!

¿Fue útil?

Solución

Si desea que su programa no se suspenda mientras se ejecuta, la mejor manera es crear una función de tipo KeepAlive que llame a SystemIdleTimerReset, SHIdleTimerReset y simule un toque de tecla. Entonces debes 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 mediante una notificación (es decir, mientras el dispositivo está suspendido), entonces debe hacer más o su aplicación se suspenderá después de un período de tiempo muy corto hasta que el usuario apague el dispositivo del modo suspendido . Para manejar esto, debe poner el dispositivo en modo de energía desatendido.

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

// do long running process

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

Durante el uso en modo desatendido, aún necesita llamar mucho a KeepAlive, puede usar un hilo separado que duerme durante x milisegundos y llama a la función de mantener vivo.

Tenga en cuenta que el modo desatendido no lo saca del modo de suspensión, sino que coloca el dispositivo en un extraño estado medio despierto.

Entonces, si inicia un modo desatendido mientras el dispositivo está en modo suspendido, no activará la pantalla ni nada. Todo lo que hace el modo desatendido es evitar que WM suspenda su aplicación. Además, el otro problema es que no funciona en todos los dispositivos, la administración de energía de algunos dispositivos no es muy buena y lo suspenderá de todos modos sin importar lo que haga.

Otros consejos

Modifique la configuración del registro de Power Manager que afecta el sueño específico Condición que desea (tiempo de espera, batería, alimentación de CA, etc.) y SetEvent en un evento del sistema con nombre llamado "PowerManager / ReloadActivityTimeouts" para decirle al sistema operativo que vuelva a cargar la configuración.

Probablemente modificando los "Estados de energía del sistema" como se describe aquí (pero en c #)

Ese artículo también describe una forma de evitar que el dispositivo móvil se duerma (lo que no es exactamente lo que usted desea), llamando periódicamente a la función nativa SystemIdleTimerReset () (para evitar que el dispositivo se apague).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top