后来就有人问我这个是怎么实现的,想想也是,虽然很简单,但是找起来却是问题多多.
我先给出我推荐的方式,再说原因:
使用一个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分钟休眠的用户...
有用, 谢谢博主
ReplyDelete