正如我张贴在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
的一部分)。
太好了。发现苹果页面,但看到它使用碳... – Chris 2011-06-08 20:21:09
它不适用于10.13。你有什么建议吗?我得到以下错误:AppleEvents:收到了msg,它不像getMemoryReference中预期的那样是复杂的类型。 – Tibidabo 2017-10-05 23:14:51