阻止电脑休眠,在win下是使用win api实现的,用Qt跨平台开发,实现Mac的阻止休眠,也需要Mac本身的api来实现。经过网上查资料,找到了一个能用的,链接如下。原生mac开发用的是Object-c,所以该实现用的是oc。
Object-c与C++混编
为了使用mac原生接口,需要使用Object-c进行调用。Mac提供了Object-c和C++混合使用的方法。在C++里,一般创建类,.h作为头文件,.cpp为实现文件,我们只需把.cpp改为.mm,.mm里既可以写C++,也可以写Object-c,我们可以把这种混合编程的语言称为Object-C++。
需要注意的是,在qmake工程中包含.mm文件需要使用OBJECTIVE_SOURCES
OBJECTIVE_SOURCES += \
$$PWD/myclass.mm
OBJECTIVE_HEADERS += \
$$PWD/myclass.h
阻止和启用休眠
使用该接口,需要使用IOKit模块
LIBS += -framework IOKit
.h中添加两个接口
bool preventSleep();
bool recoverSleep();
#import <IOKit/pwr_mgt/IOPMLib.h>
bool MacTools::preventSleep()
{
//限制不重复执行
if(isPrevent)
return true;
//官方例子用的文字说明
CFStringRef reasonForActivity = CFSTR("Mail Compacting Mailboxes");
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
kIOPMAssertionLevelOn, reasonForActivity, &assertionID);
qDebug() << __FUNCTION__ << "song" << success << assertionID;
isPrevent = success == kIOReturnSuccess;
return success == kIOReturnSuccess;
}
bool MacTools::recoverSleep()
{
//执行过才支持取消
if(!isPrevent)
return true;
IOReturn success = IOPMAssertionRelease(assertionID);
qDebug() << __FUNCTION__ << "song" << success << assertionID;
return success == kIOReturnSuccess;
}
代码量不多,基于官方的例子集成到项目中实现的,通过全局变量isPrevent防止重复执行,休眠类型有三种,可看接口文档
-
PreventSystemSleep---防止系统休眠
-
NoIdleSleepAssertion---防止空闲休眠
-
NoDisplaySleepAssertion---防止显示器休眠
reasonForActivity为激活原因,貌似不能随便设,我自定义了一个好像没生效,最后还是用的官方例子的文字说明
记录AssertionID,恢复休眠通过释放这个ID进行恢复
结语
代码量很少,关键是要了解怎么在C++中使用Object-C,再对官方例子进行调用封装。不过该实现只能防止电脑正常的息屏,不能阻止强制息屏,比如笔记本盖上盖子,低电量的息屏等