Ответ 1
IOCancelPowerChange
продолжает работать, но только для режима ожидания сна; он не будет работать для сна, вызванного пунктом меню Finder Sleep, запрограммированным программным путем или нажатием кнопки питания.
Apple Q & A1340 отвечает на вопрос "Q: Как мое приложение может быть уведомлено, когда компьютер будет спать или бодрствовать сна? Как предотвратить сон??"
Листинг 2 из Q & A1340:
#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. Эти функции позволяют другим приложениям и утилитам видеть, что ваше приложение желает не спать; это имеет решающее значение для бесперебойной работы с программным обеспечением для управления питанием сторонних производителей.