有谁知道如何在Windows Mobile上以编程方式禁用/启用睡眠模式?
谢谢!
答案 0 :(得分:8)
如果您希望程序在运行时不进入休眠状态,最好的方法是创建一个调用SystemIdleTimerReset,SHIdleTimerReset并模拟按键触摸的KeepAlive类型函数。然后你需要调用它,基本上无处不在。
#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 funcation。
请注意,无人值守模式不会使其退出睡眠模式,它会使设备处于奇怪的半清醒状态。
因此,如果您在设备处于挂起模式时启动无人值守模式,它将不会唤醒屏幕或任何其他内容。所有无人值守模式都会阻止WM暂停您的应用程序。另一个问题是它不适用于所有设备,某些设备电源管理不是很好,无论你做什么,它都会暂停你。
答案 1 :(得分:6)
修改影响所需特定睡眠条件的the Power Manager registry setting(超时,电池,交流电源等)和名为“PowerManager / ReloadActivityTimeouts”的命名系统事件上的SetEvent,告诉操作系统重新加载设置。
答案 2 :(得分:1)
可能将“系统电源状态”修改为described here(但在c#中)
该文章还描述了一种通过定期调用本机函数SystemIdleTimerReset()来防止移动设备进入睡眠状态(这不是您可能想要的)的方法(以防止设备断电)。