Отключить спящий режим в Windows Mobile 6
кто-нибудь знает, как я могу программно отключить/включить спящий режим на Windows Mobile?
спасибо!
3 ответов
Если вы хотите, чтобы ваша программа не засыпала во время ее работы, лучший способ-создать функцию типа 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 от приостановки приложения. Также другая проблема заключается в том, что он не работает на всех устройствах, некоторые устройства управления питанием не очень хорошо, и он будет приостанавливать вас в любом случае, что бы вы ни делали.
изменить параметр реестра Power Manager это влияет на конкретное состояние сна, которое вы хотите (тайм-аут, тесто, мощность переменного тока и т. д.), И SetEvent на именованном системном событии под названием "PowerManager/ReloadActivityTimeouts", чтобы сообщить ОС перезагрузить настройки.
вероятно, путем изменения "состояния питания системы" как описано здесь (но в C#)
в этой статье также описывается способ предотвращения спящего режима мобильного устройства (что не совсем то, что вы можете захотеть), периодически вызывая собственную функцию SystemIdleTimerReset () (для предотвращения выключения устройства).