Вопрос

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

Спасибо!

Это было полезно?

Решение

Если вы хотите, чтобы ваша программа не переходила в спящий режим во время ее выполнения, лучший способ - создать функцию типа 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 миллисекунд и вызывает функцию keepalive.

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top