什么是防止OS X睡眠的正确方法?

时间:2011-12-10 21:30:53

标签: cocoa osx-lion

  

可能重复:
  How to programmatically prevent a Mac from going to sleep?

当前版本的OS X(10.7)在应用程序或进程运行时防止睡眠的正确方法是什么?

特别是,IOCancelPowerChange仍然(或曾经)曾为此目的服务吗?我致电IOCancelPowerChange以回复kIOMessageCanSystemSleep,但这并不能解决问题。


基本上same question作为这一部分的第一部分之前已被问过,但它指出的documentation已经很老了,答案从未被接受过。

2 个答案:

答案 0 :(得分:12)

IOCancelPowerChange继续工作,但仅用于空闲触发的睡眠;它不适用于Finder的Sleep菜单项,以编程方式请求或按下电源按钮触发的睡眠。

Apple的Q&A1340回答了问题“问:当计算机进入睡眠状态或从睡眠中醒来时,我的应用程序如何得到通知?如何防止睡眠?”

Q&A1340的清单2:

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep

//reasonForActivity is a descriptive string used by the system whenever it needs 
//  to tell the user why the system is not sleeping. For example, 
//  "Mail Compacting Mailboxes" would be a useful string.

//  NOTE: IOPMAssertionCreateWithName limits the string to 128 characters. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
                                    kIOPMAssertionLevelOn, reasonForActivity, &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. 
}

请注意,您只能停止空闲时间睡眠,而不能停止用户触发睡眠。

对于支持Mac OS X 10.6及更高版本的应用程序,请使用新的 IOPMAssertion 系列函数。这些功能允许其他应用程序和实用程序看到您的应用程序不想睡觉的愿望;这对于与第三方电源管理软件无缝协作至关重要。

答案 1 :(得分:0)

您可以每隔30秒调用一次updatesystemActivity(OverallAct),以防止显示屏暂停。