在Qt程序中设置Mac软件的开机自启动,通过调用object-c代码来实现。
目前只测试过在非沙盒的环境下设置开机自启动,沙盒环境下没有测试过(设置方式不同,会比较复杂)
新建类,定义接口
voidsetAutoStart(QStringappPath,boolisAutoStart);
类定义: 其中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);}}