Wince禁止自动关机/suspend

转自:http://www.proarm.net/wince-disable-auto-suspend.html
本文描述禁止wince自动关机或者suspend再resume后出现自动关机的情况。
wince的注册表有如下内容:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]
“ACUserIdle”=dword:3c ; in seconds
“ACSystemIdle”=dword:12c ; in seconds
“ACSuspend”=dword:0 ; in seconds
“BattUserIdle”=dword:3c ; in seconds
“BattSystemIdle”=dword:b4 ; in seconds
“BattSuspend”=dword:12c ; in seconds
如果想禁自动关机,也就是suspend的功能,可以分别设置ACSuspend和BattSuspend为0,分别表示外部供电和电池供电的suspend时间。
是否外部供电需要电池驱动中对于SYSTEM_POWER_STATUS_EX2结构体中的ACLineStatus 是 AC_LINE_ONLINE或者AC_LINE_OFFLINE。
(这部分可以查看本站另一篇文章:WinCE获取电池电量函数)
WINCE 5.0直接设置以上ACSuspend和BattSuspend即可,WINCE 6.0可能会存在设置此值无效,原因是pm.dll加载的时候保存此段信息的注册表还不能访问,所以pm.dll使用了默认值,导致注册表设置的值没有被采用,这样设备还是会进入suspend状态。
此时如果查看电源管理中的设置,suspend时间与注册表中的值却是一样的,实际上是因为电源管理程序此时读了注册表。而电源管理模块却仍然使用的默认值。
解决此问题的方法是在某个驱动中(此时需要已经可以访问这段注册表的情况下)调用以下函数,让电池管理模块重新获取配置值。

HANDLE hevReloadActivityTimeouts = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ReloadActivityTimeouts"));    
if (hevReloadActivityTimeouts)    {        
    SetEvent(hevReloadActivityTimeouts);        
    CloseHandle(hevReloadActivityTimeouts);    
} 

另外有一种不太常见的情况,如果注册中设置以下值:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power]
“DisableGwesPowerOff”=dword:0
虽然第一次开机不会自动进入suspend/关机,但是系统在suspend并唤醒后,如果不点击触摸屏或者向系统发送按键消息,则过一会机器可能仍然进入suspend状态。
此时将DisableGwesPowerOff设置成1即可,WINCE默认的值也是1。


另外两篇:
http://www.cnblogs.com/we-hjb/archive/2010/01/27/1657973.html
http://www.360doc.com/content/12/0208/13/8354145_185023839.shtml

你可能感兴趣的:(Wince禁止自动关机/suspend)