Отключить спящий режим в Windows Mobile 6
-
05-07-2019 - |
Вопрос
Кто-нибудь знает, как я мог бы программно отключить / включить спящий режим на 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() (чтобы предотвратить выключение устройства).