[CF.Skills]防止Smartphone进入休眠状态

之前我有一篇随笔提到了如何编程在Pocket PC上以预定的时间运行你的程序,也提到了使用OpennetCF实现长时间间隔定时运行程序。文章在这里:
http://www.cnblogs.com/fox23/archive/2008/02/03/AtTime.html
其实还有一种另一种有趣的方式,在Smartphone上面通过简单的注册表设置来防止手机进入休眠状态。

首先,最容易想到的办法就是不断地给OS发送空(键盘)消息:
keybd_event(VK_NONAME, 0, KEYEVENTF_SILENT, 0);
不过这样会把背光也一直开着,这有些浪费哦。于是我们设想要是注册表里面有相关的设置就好了,简单的查阅了一下注册表之后,果然有相应的一些键,可以设置为不让WM设备休眠。
打开VS2008的Remote Registry Editor,连接到我们的Smartphone,这里以WM6.1 Standard为例,浏览到以下目录:


在HKCU/ControlPanel/Power目录下,找到这个display的键,把这个DWORD值(默认为60),改为-1,这样就相当于禁用了系统定时休眠的功能。
接下来,为了让这个改动立即生效,我们得广播一个消息让OS知道初始化时的某个键值发生了改变:
PostMessage(HWND_BROADCAST, WM_WININICHANGE, 00);

在Pocket PC上也有相应的设置:


说到这里,顺便推荐一篇园子里的文章:
http://www.cnblogs.com/Endink/archive/2006/07/18/sharping.html
文中介绍了在托管代码中控制背光和周期性的调用SystemIdleTimerReset()函数来复位休眠定时器的方法,值得一看。
最后,提示一下,对程序中所有对注册表的改动,都别忘了在退出程序的时候将它们还原成原来的设置,以免影响用户的使用。

Enjoy it !

黄季冬



posted on 2008-05-02 14:52 J.D Huang 阅读(...) 评论(...) 编辑 收藏

统计