在Qt程序中设置Mac软件的开机自启动,通过调用object-c代码来实现。
目前只测试过在非沙盒的环境下设置开机自启动,沙盒环境下没有测试过(设置方式不同,会比较复杂)
新建类,定义接口
void setAutoStart(QString appPath,bool isAutoStart);
类定义:
其中 appPath是软件当前的位置,调用方式:
ischecked为真时 打开,为false时关闭开机自启动
调用方式:OSXUtil::GetInstance()->setAutoStart(QCoreApplication::applicationFilePath(),ischecked);
// To convert a QString into NSString *
#define QStringToNSString(s) [NSString stringWithUTF8String:s.toUtf8().data()]
void OSXUtil::setAutoStart(QString appPath, bool isAutoStart)
{
if(isAutoStart)
{
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
//url为app所在的目录
CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:QStringToNSString(appPath)];
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemLast, NULL, NULL, url, NULL, NULL);
CFRelease(item);
CFRelease(loginItems);
}
else
{
UInt32 seedValue;
CFURLRef thePath;
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
CFArrayRef loginItemsArray = LSSharedFileListCopySnapshot(loginItems, &seedValue);
for (id item in (NSArray *)loginItemsArray) {
LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)item;
if (LSSharedFileListItemResolve(itemRef, 0, (CFURLRef*) &thePath, NULL) == noErr) {
//appPath目录为要取消开机启动app的路径
if ([[(NSURL *)thePath path] hasPrefix:QStringToNSString(appPath)])
{
LSSharedFileListItemRemove(loginItems, itemRef); // 删除指定的启动项
}
CFRelease(thePath);
}
}
CFRelease(loginItemsArray);
CFRelease(loginItems);
}
}