Мост сценариев Finder для завершения работы

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

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

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


person Chris    schedule 07.06.2011    source источник


Ответы (2)


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

person NSGod    schedule 08.06.2011
comment
Здорово. Нашел и эту страницу Apple, но увидел, что в ней используется углерод… - person Chris; 09.06.2011
comment
На 10.13 не работает. У Вас есть какие-то предложения? Я получаю следующую ошибку: AppleEvents: получено сообщение mach, которое не было сложным типом, как ожидалось в getMemoryReference. - person Tibidabo; 06.10.2017

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

person Philip Regan    schedule 08.06.2011