Pergunta

Alguém sabe como eu poderia programaticamente ativar / desativar o modo de suspensão no Windows Mobile?

Obrigado!

Foi útil?

Solução

Se você quer que seu programa não pode ser posto para dormir enquanto ele está funcionando, a melhor maneira é criar uma função tipo KeepAlive que chama SystemIdleTimerReset, SHIdleTimerReset e simula um toque de tecla. Então você precisa chamá-lo muito, basicamente em todos os lugares.

#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 só funciona quando o usuário inicia o aplicativo manualmente.

Se o seu aplicativo é iniciado por uma notificação (ou seja, enquanto o dispositivo está suspenso), então você precisa de fazer mais ou então a sua aplicação será suspenso após um período muito curto de tempo até que os poderes do usuário do dispositivo para fora do modo de suspensão . Para lidar com isso, você precisa colocar o dispositivo no modo de energia autônoma.

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

// do long running process

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

Durante o uso modo automático, você ainda precisa chamar o KeepAlive muito, você pode usar um segmento separado que dorme por x milissegundos e chama a manter funcation vivo.

Por favor note que o modo autônomo não tirá-lo do modo de suspensão, ele coloca o dispositivo em um estado semi-acordado estranho.

Então, se você iniciar um modo automático quando o dispositivo em modo de suspensão, ele não irá ativar a tela ou qualquer coisa. Todos modo autônomo não é parada WM de suspender a sua aplicação. Além disso, o outro problema é que ele não funciona em todos os dispositivos, alguns gerenciamento de dispositivos de energia não é muito bom e vai suspendê-lo de qualquer maneira não importa o que você faz.

Outras dicas

configuração de registro Power Manager que afeta o sono específico condição que deseja (timeout, massa, energia AC, etc) eo SetEvent em um evento do sistema nomeado chamado "PowerManager / ReloadActivityTimeouts" para dizer ao sistema operacional para recarregar as configurações.

Provavelmente, modificando o "States Power System", como descrito aqui ( mas em c #)

Esse artigo também descreve uma forma de impedir que o dispositivo móvel para dormir (que não é exatamente o que você pode querer), chamando a função nativa SystemIdleTimerReset () periodicamente (para impedir que o dispositivo desligar).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top