Редактирование элементов входа в Mac OS X в Objective-C через AppleScript - PullRequest
3 голосов
/ 24 апреля 2010

В моей программе Какао я хочу проверить, какие программы зарегистрированы для запуска при запуске, и изменить этот список по своему усмотрению. Чтобы быть совместимым с 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 голосов
/ 24 апреля 2010

Apple имеет некоторый исходный код, который может управлять элементами входа для Tiger и более ранних версий. Я полагаю, что вы должны получить его от АЦП, но я нашел это здесь:

LoginItemAPI.h

LoginItemAPI.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...