2011-06-07 72 views
0

我试图使用Application Scripting Bridge来发送我的Mac进入睡眠状态。 代码如下所示:Finder脚本桥关闭

#import "Finder.h" 
FinderApplication *Finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.finder"]; 
     [Finder sleep]; 

但它不起作用。任何想法,为什么它不工作?没有编译错误或警告,但它不工作...

回答

2

正如我张贴在this answer,我一直在使用下面的代码超过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,但分钟e重新使用AESendMessage()而不是AESend()AESend()位于HIToolbox.framework,位于Carbon.framework,因此无法用于64位应用程序。 (AESendMessage()CoreServices中的AE.framework的一部分)。

+0

太好了。发现苹果页面,但看到它使用碳... – Chris 2011-06-08 20:21:09

+0

它不适用于10.13。你有什么建议吗?我得到以下错误:AppleEvents:收到了msg,它不像getMemoryReference中预期的那样是复杂的类型。 – Tibidabo 2017-10-05 23:14:51