Finder Scripting Bridge для выключения - PullRequest
0 голосов
/ 08 июня 2011

Я пытался использовать Application Scripting Bridge для отправки моего Mac в спящий режим.Код выглядит следующим образом:

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

Но он не работает.Есть идеи, почему это не работает?Нет ошибок или предупреждений при компиляции, но это не работает…

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Как я написал в этом ответе , я использую следующий код более 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;
}

Обратите внимание, что приведенный выше код основан на коде из Технические вопросы и ответы QA1134 , но мой переработан для использования AESendMessage() вместо AESend(). AESend() находится в HIToolbox.framework, то есть в Carbon.framework и поэтому недоступно для 64-битных приложений. (AESendMessage() является частью AE.framework в CoreServices).

0 голосов
/ 08 июня 2011

Если Scripting Bridge недостаточно для того, чтобы сделать что-то не зависящее от приложения, например, закрыть Mac, тогда у вас есть возможность перейти на другие фреймворки, к которым у Applescript (и, соответственно, Scripting Bridge) нет прямого доступа к , Для выключения Mac см. Основные службы: Технические вопросы и ответы QA1134: программно вызывает перезагрузку, завершение работы и / или выход из системы

...