返回首页
当前位置: 主页 > Mac开发 > Cocoa >

用IOKit阻止Mac进入睡眠模式

时间:2010-02-01 14:25来源:http://www.cimgf.com/2009/10/1 点击:
如果你的软件是全屏模式运行的(比如游戏),并有长时间的视频或演示模式,那就需要像DVD播放器和Keynote那样禁用Mac休眠。关于这方面的官方文档有点乱,这里做一个总结吧。
  作者  bmwmengwei

英文原文  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和雪豹系统。
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容