通过AppleScript在Objective

通过AppleScript在Objective

本文介绍了通过AppleScript在Objective-C中编辑Mac OS X登录项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Cocoa程序中,我想检查注册在启动时运行的程序,并根据我的需要修改该列表。为了与Tiger兼容,似乎我需要通过AppleScript工作。我目前有以下代码:

In my Cocoa program, I want to examine what programs are registered to run at startup and modify that list as I feel appropriate. In order to be compatible with Tiger it seems like I need to work through AppleScript. I currently have the following code:

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中迭代这个数组。

If I run that command in AppleScript, I get back an array of login items. However, I can't figure out how to iterate through this array in Objective-C. More specifically, I want to examine the names and paths of the programs registered to run at startup.

任何想法?

编辑:我想出了这一点。这里是一些示例代码。关键是使用AEKeyword的,这是非常缺乏文件。最佳参考在这里:

I figured this out. Here is some sample code. The key is using AEKeyword's, which are very poorly documented. The best reference is here: 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];
}


推荐答案

可以管理Tiger和更早的登录项。我相信你应该从ADC得到它,但我发现它浮在这里:

Apple has some source code which can manage login items for Tiger and earlier. I believe you're supposed to get it from ADC but I found it floating around here:

这篇关于通过AppleScript在Objective-C中编辑Mac OS X登录项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 06:25