2011-05-23 64 views
3

我想執行某些系統事件,Mac OS X的

  • 關機
  • 重啓
  • 註銷
  • 睡眠

我的系統通過我提出申請,我似乎無法找到任何本地的Objective C方式來做到這一點,這非常困難。

任何人都可以指導我做到這一點的最好辦法:

我曾嘗試:

NSString *scriptAction = @"restart"; // @"restart"/@"shut down"/@"sleep"/@"log out" 
NSString *scriptSource = [NSString stringWithFormat:@"tell application \"Finder\" to %@", scriptAction]; 
NSAppleScript *appleScript = [[[NSAppleScript alloc] initWithSource:scriptSource] autorelease]; 
NSDictionary *errDict = nil; 
if (![appleScript executeAndReturnError:&errDict]) { 
    // 
} 

那沒有運氣可言,也試過:

NSAppleScript* theScript = [[NSAppleScript alloc] initWithSource: 
          @"Tell application \"Finder\" to restart"]; 
if (theScript != NULL) 
{ 
    NSDictionary* errDict = NULL; 
    // execution of the following line ends with EXC 
    if (YES == [theScript compileAndReturnError: &errDict]) 
    { 
     [theScript executeAndReturnError: &errDict]; 
    } 
    [theScript release]; 
} 

由於沒有運氣

+1

可能重複[Shutdown Mac Objective C](http://stackoverflow.com/questions/4505632/shutdown-mac-objective-c) – 2011-05-23 23:03:56

+2

技術問答1134應該會有幫助:http://developer.apple.com /library/mac/#qa/qa1134/_index.html – 2011-05-23 23:08:44

+0

嗨喬希。我實際上發佈了第一個問題。完全忘了它。我已經嘗試了所有列出的方法,包括沒有運氣的q&a – 2011-05-23 23:19:11

回答

9

我已經使用超過8年以下的代碼,而問題:

MDRestartShutdownLogout.h:

#import <CoreServices/CoreServices.h> 
/* 
    * kAERestart  will cause system to restart 
    * kAEShutDown  will cause system to shutdown 
    * kAEReallyLogout will cause system to logout 
    * kAESleep   will cause system to sleep 
*/ 
extern OSStatus MDSendAppleEventToSystemProcess(AEEventID eventToSend); 

MDRestartShutdownLogout.m:

#import "MDRestartShutdownLogout.h" 

OSStatus MDSendAppleEventToSystemProcess(AEEventID eventToSendID) { 
    AEAddressDesc targetDesc; 
    static const ProcessSerialNumber kPSNOfSystemProcess = {0, kSystemProcess }; 
    AppleEvent eventReply = {typeNull, NULL}; 
    AppleEvent eventToSend = {typeNull, NULL}; 

    OSStatus status = AECreateDesc(typeProcessSerialNumber, 
     &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess), &targetDesc); 

    if (status != noErr) return status; 

    status = AECreateAppleEvent(kCoreEventClass, eventToSendID, 
      &targetDesc, kAutoGenerateReturnID, kAnyTransactionID, &eventToSend); 

    AEDisposeDesc(&targetDesc); 

    if (status != noErr) return status; 

    status = AESendMessage(&eventToSend, &eventReply, 
          kAENormalPriority, kAEDefaultTimeout); 

    AEDisposeDesc(&eventToSend); 
    if (status != noErr) return status; 
    AEDisposeDesc(&eventReply); 
    return status; 
} 

注意上面的代碼是基於Technical Q&A QA1134的代碼,但我的工作重新使用AESendMessage()而不是AESend()AESend()位於HIToolbox.framework,位於Carbon.framework,因此無法用於64位應用程序。 (AESendMessage()CoreServices中的AE.framework的一部分)。

+0

完美的作品!謝謝 – 2011-05-24 11:11:12

+0

它對我來說不起作用:(對任何操作使用此功能將在調用AESendMessage時爲-600'[「procNotFound」](「沒有指定描述符的合格進程」)提供狀態想法爲什麼? – Alex 2011-09-27 19:34:55

+0

這個工作完美無沙箱。但是一旦SandBoxing打開它不起作用。誰能告訴我哪些權利被啓用以使其工作。 – 2017-06-08 11:16:42

0

這絕對應該工作如果您從GUI會話登錄

如果您僅在沒有GUI的情況下從ssh會話等登錄,它將不起作用。

請更全面地描述你的情況,你得到了什麼樣的錯誤等,否則我們不能幫你。

+0

我根本沒有收到任何錯誤。我已經在界面構建器中正確連線了所有東西。分配方法和一切。但是涉及到代碼執行的部分。什麼都沒發生。是的,應用程序將運行在基於GUI的應用程序上。 – 2011-05-24 00:17:54

相關問題