有人知道如何在Windows Mobile上以编程方式禁用/启用睡眠模式吗?
谢谢!
发布于 2008-10-29 22:32:52
如果你不想让你的程序在运行时处于睡眠状态,最好的方法是创建一个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挂起您的应用程序。另一个问题是,它并不能在所有设备上工作,一些设备的电源管理不是很好,无论你做什么,它都会暂停你的工作。
发布于 2008-10-29 13:31:31
在名为“PowerManager/ReloadActivityTimeout”的命名系统事件上,修改影响所需特定睡眠条件(超时、电池、交流电源等)的the Power Manager registry setting和SetEvent,以告知操作系统重新加载设置。
发布于 2008-10-29 11:06:50
可能是通过将“系统电源状态”修改为described here (但在c#中)
该文章还描述了一种通过定期调用本机函数SystemIdleTimerReset()来防止移动设备休眠(这并不完全是您想要的)的方法(以防止设备断电)。
https://stackoverflow.com/questions/246407
复制相似问题