通过AppleScript在Objective-C中编辑Mac OS X登录项

3

在我的Cocoa程序中,我想检查哪些程序已经注册为开机启动并根据需要修改该列表。为了与Tiger兼容,似乎我需要通过AppleScript来完成。我目前有以下代码:

NSDictionary* errorDict;
NSAppleEventDescriptor* returnDescriptor = NULL;

NSString *appleSource = @"tell application \"System Events\"\n\
get every login item\n\
end tell";
NSAppleScript *appleScript = [[NSAppleScript alloc] initWithSource: appleSource];

returnDescriptor = [appleScript executeAndReturnError: &errorDict];

如果我在AppleScript中运行该命令,我会得到一个登录项数组。然而,我无法弄清如何在Objective-C中遍历该数组。更具体地说,我想查看已注册为启动时运行的程序的名称和路径。
有任何想法吗?
编辑:我解决了这个问题。以下是一些示例代码。关键是使用AEKeyword,这些文档非常糟糕。最好的参考资料在这里:http://developer.apple.com/mac/library/releasenotes/AppleScript/ASTerminology_AppleEventCodes/TermsAndCodes.html
const AEKeyword aeName = 'pnam';
const AEKeyword aePath = 'ppth';

...

NSDictionary* errorDict;
NSAppleEventDescriptor* getLoginItemsRD = NULL;
NSString *getLoginItemsSrc = @"tell application \"System Events\"\n\
                               get properties of every login item\n\
                               end tell";
NSAppleScript *getLoginItemsScript = [[NSAppleScript alloc] initWithSource: getLoginItemsSrc];
getLoginItemsRD = [getLoginItemsScript executeAndReturnError: &errorDict];
[getLoginItemsScript release];

int i;
int numLoginItems = [getLoginItemsRD numberOfItems];
for (i = 1; i <= numLoginItems; i++)
{
    NSAppleEventDescriptor *loginItem = [getLoginItemsRD descriptorAtIndex:i];
    NSString *loginItemName = [[loginItem descriptorForKeyword:aeName] stringValue];
    NSString *loginItemPath = [[loginItem descriptorForKeyword:aePath] stringValue];
}
1个回答

2
苹果有一些源代码可以管理Tiger及更早版本的登录项。我认为你应该从ADC获取它,但我在这里找到了一些浮动的代码。

LoginItemAPI.h

LoginItemAPI.c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接