Wednesday, February 25, 2009

C++ Windows API 实现避免屏幕保护和待机,休眠.

昨天贴出正在开发的BinPlayer配置窗口的截图.上面有一个"Prevent Standby and Screen Saver"的check box. 中文也就是"避免系统待机和屏幕保护程序".
后来就有人问我这个是怎么实现的,想想也是,虽然很简单,但是找起来却是问题多多.

我先给出我推荐的方式,再说原因:
使用一个Timer,使用较短的时间定时运行下面这个函数.

void resetSystemIdleTime () {
SetThreadExecutionState(ES_DISPLAY_REQUIRED);
SetThreadExecutionState(ES_SYSTEM_REQUIRED);
}

实际上这个函数作用就是重置两个系统参数,这个不是唯一的方法.在我看来,是比较好的方法.

在csdn上其他方法也很多,有模拟事件的,有激活窗口的.什么都有,一句话:不择手段.

唯独见到的正规一点的方法是:使用

SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);


来临时关闭和开启屏幕保护.类似的方法可以实现避免待机.不过这有个问题,那就是如果程序中途中断出错关闭,会造成重新启动前,系统的屏幕保护不能运行. 这虽然问题不大,但是我还是不希望BinPlayer有这样的"隐患".

至于我在上面说的resetSystemIdleTime方法,只有一个问题:这个Timer的时间怎么定.
不过我要说明的是,这两个函数运行的代价非常低,因为任何鼠标事件,键盘事件,都会"运行"这两个函数.所以如果时间设的非常短,也不会影响性能,只是给人一种没有必要的感觉.

一般来说,1分钟内是合适的,因为屏幕保护和待机的最短激活时间也就是1分钟.我也见过有BT到1分钟休眠的用户...

1 comment: