英文原文 http://www.cimgf.com/2009/10/14/the-journey-to-disabling-sleep-with-iokit/
如果你的软件是全屏模式运行的(比如游戏),并有长时间的视频或演示模式,那就需要像DVD播放器和Keynote那样禁用Mac休眠。关于这方面的官方文档有点乱,这里做一个总结吧。官方文档在这里:http://developer.apple.com/mac/library/qa/qa2004/qa1160.html
UpdateSystemActivity(OverallAct);
文档里说,每30秒启动一次这玩意儿,挺没意思的,我每30秒来一次虚拟的鼠标运动不就得了?这种方法太老土了,新方法是使用IOKit,苹果同样有个介绍这种方法的文档
--http://developer.apple.com/mac/library/qa/qa2004/qa1340.html
参考代码
#import <IOKit/pwr_mgt/IOPMLib.h>
...
// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreate(kIOPMAssertionTypeNoDisplaySleep,
kIOPMAssertionLevelOn, &assertionID);
if (success == kIOReturnSuccess)
{
//Add the work you need to do without
// the system sleeping here.
success = IOPMAssertionRelease(assertionID);
//The system will be able to sleep again.
}
这段代码搞得我很郁闷,因为此前对这玩意儿不熟。没办法只好到XCode文档里去查,却什么也没查到。查看IOPMLib.h代码发现这是个32位无符号整数型。然后查找IOPMAssertionCreate(),发现它只出现于Leopard系统里,雪豹系统更推荐用IOPMAssertionCreateWithName()这种方式。IOPMAssertionCreateWithName() 比多一项参数,废话少说,
IOPMAssertionCreate()IOPMAssertionCreateWithName()管用就行。
注意,IOPMAssertionCreateWithName()在Leopard系统下不能用,所以,要么在Xcode3.1/Leopard 下用IOPMAssertionCreate();或者在雪豹系统
XCode 3.2里用IOPMAssertionCreateWithName()。
从苹果官方文档给出的例子来看,你可以用kIOPMAssertionTypeNoDisplaySleep防止显示器休眠,用kIOPMAssertionTypeNoIdleSleep防止系统休眠。但我的测试结果是kIOPMAssertionTypeNoDisplaySleep既能防止显示器休眠又能防止系统休眠,就像放视频或做幻灯一样。kIOPMAssertionTypeNoIdleSleep会让显示器休眠,但系统不会。这样就可以运行一些长时间计算的大型项目而不用担心由于键盘鼠标没动做而使系统进入休眠。
最后,这里有个实例(http://www.cimgf.com/wp-content/uploads/2009/10/DisableSleep.zip),它用的是IOPMAssertionCreate()而不是IOPMAssertionCreateWithName()以便兼容Leoprd和雪豹系统。