Отключить спящий режим в Windows Mobile 6 - PullRequest
7 голосов
/ 29 октября 2008

Кто-нибудь знает, как можно программно отключить / включить спящий режим на Windows Mobile?

Спасибо!

Ответы [ 3 ]

8 голосов
/ 30 октября 2008

Если вы хотите, чтобы ваша программа не переводилась в спящий режим во время ее работы, лучше всего создать функцию типа KeepAlive, которая вызывает SystemIdleTimerReset, SHIdleTimerReset и имитирует касание клавиш. Тогда вам нужно называть это много, в основном везде.

#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;
    }
}

Этот метод работает только тогда, когда пользователь запускает приложение вручную.

Если ваше приложение запускается с помощью уведомления (то есть, когда устройство приостановлено), то вам нужно сделать больше, иначе ваше приложение будет приостановлено через очень короткий промежуток времени, пока пользователь не отключит питание устройства из приостановленного режима. , Для этого вам необходимо перевести устройство в режим автономного питания.

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

// do long running process

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

Во время использования в автоматическом режиме вам все равно нужно многократно вызывать KeepAlive, вы можете использовать отдельный поток, который спит в течение x миллисекунд и вызывает функцию keep alive.

Обратите внимание, что автоматический режим не выводит его из спящего режима, он переводит устройство в странное полусонное состояние.

Таким образом, если вы запустите автоматический режим, когда устройство находится в режиме ожидания, оно не разбудит экран или что-либо еще. Все, что делает без присмотра, - это не дает WM приостановить работу вашего приложения. Кроме того, другая проблема заключается в том, что он работает не на всех устройствах, управление питанием некоторых устройств не очень хорошее и оно в любом случае приостановит работу независимо от того, что вы делаете.

6 голосов
/ 29 октября 2008

Измените параметр реестра Power Manager , который влияет на конкретное требуемое состояние сна (тайм-аут, тесто, питание от сети переменного тока и т. Д.) И SetEvent для именованного системного события под названием "PowerManager / ReloadActivityTimeouts", чтобы сообщить ОС для перезагрузки настроек.

1 голос
/ 29 октября 2008

Возможно, изменив "Состояния питания системы" как , описанное здесь (но в c #)

В этой статье также описывается способ запретить мобильное устройство (что не совсем то, что вам может потребоваться), периодически вызывая встроенную функцию SystemIdleTimerReset () (для предотвращения выключения устройства).

...