2010-04-24 84 views
3

在我的Cocoa程序中,我想檢查哪些程序已註冊在啓動時運行,並根據需要修改該列表。爲了與Tiger兼容,似乎需要通過AppleScript進行工作。目前,我有以下代碼:通過AppleScript在Objective-C中編輯Mac OS X登錄項目

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's,這是非常糟糕的記錄。最好的參考就是在這裏: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]; 
} 

回答

2

蘋果有一些源代碼,可管理老虎登錄項目和更早版本。我相信你應該從ADC得到它,但我發現它在這裏浮動:

LoginItemAPI.h

LoginItemAPI.c