适用于 WinCE.NET 4.2 的休眠终结者





4.00/5 (6投票s)
WinCE 系统挂起
引言
你是否尝试过在 WinCE.NET 上运行的设备在观看视频时保持不进入休眠状态?这里介绍一种无需手动更改电源设置的方法。
背景
我正在为 WinCE.NET 4.2 开发一个视频播放模块,遇到一个问题:系统会在观看视频时根据注册表中的设置进入休眠模式。首先,背光会关闭,然后系统会进入休眠模式。通常的做法是更改电源管理器的设置,但这每次都不可行。
使用代码
我尝试通过调用 SystemIdleTimerReset()
来阻止它,但有时无法阻止设备进入休眠状态。因为,我们需要在电源管理器事件触发时检查超时时间,并在其之前调用 SystemIdleTimerReset()
。在线程或计时器中调用 SystemIdleTimerReset()
可以工作。但我们需要考虑到性能,因为这是一个移动设备。
因此,我尝试通过向应用程序消息循环发送键盘事件来完成它。键盘事件在计时器进程中生成,并按以下方式进行:
//Define the constants to generate key board event #define VK_NONAME 0xFC #define KEYEVENTF_KEYUP 0x2 //in the timer process added the following line keybd_event(VK_NONAME, 0, KEYEVENTF_KEYUP, 0);
它工作正常。设备没有进入休眠模式。但是应用程序会收到额外的消息,并且由于这是一个移动设备,我认为最好摆脱这个额外的进程,并找到一个不会影响应用程序性能的解决方案。最终,我能够开发出一个很好且健壮的类,它可以按我想要的方式完成任务。所以我称它为 SuspendKiller
。SuspendKiller
使用注册表、电源管理器通知调用和背光电源请求调用来完成任务。
休眠终结者按以下顺序工作
- 从注册表中加载设置,并将其保存在数组中以供将来参考。
- 将新的设置设置为相关注册表键中的
永不 (0)
。 - 通知电源管理器事件以重新从注册表中加载设置。
- 以最大功率打开背光。
- 当调用该函数并带有
FALSE
参数时,它会反转所有操作。(设置原始值,释放背光电源。)
它不会影响应用程序性能,因为我们只在媒体即将播放和停止时执行一次。
为了完成这项任务,我尝试了许多方法,还尝试了中断。但我认为这个解决方案很好而且干净。还使用 iMX21 ADS 和 WinCE.NET 4.2 进行测试,观看视频一个多小时后工作正常。