高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1134
Programmatically causing restart, shutdown and/or logout


Q: Mac OS 9 または Mac OS X が稼動するマシンのシステム終了、再起動、スリープ、ログアウトをプログラミングで行うにはどうしたらよいですか?

A: これらはすべて、特定のアップルイベントを Macintosh のシステムプロセスに送ることにより実行できます。システムプロセスは、アップルイベントを解釈して要求されたイベントを発生させます。Mac OS 9 では、Finder がシステムプロセスでした。Mac OS X では、ログインウインドウがシステムプロセスとなります。ターゲットアプリケーションの ProcessSerialNumber として定数 {0,kSystemProcess} を使って、アップルイベントのターゲットをシステムプロセスに設定できます。この方法で開始した再起動、システム終了、ログアウトのシーケンスは、アプリケーションを実行することによってキャンセルできます。アプリケーションによる再起動/システム終了/ログアウトのシーケンスをキャンセルするアプリケーションの詳細については、System Overview の 「Terminating Processes」を参照してください。

重要:
再起動、システム終了、スリープ、ログアウトのイベントの開始は、どうしても必要な場合に限り行うべきです。また、これらのアクションは、ユーザの同意を得た後に限り行う必要があります。

Mac OS 9 と Mac OS X では、システムの再起動とシステム終了は、アップルイベントの kAERestartkAEShutDown をそれぞれシステムプロセスに送ることによって開始できます。アップルイベントを送信することによって、再起動とシステム終了のシーケンスが開始します。

さらに Mac OS X では、ログアウトとスリープのイベントを利用できます。ログアウトとスリープは、kAEReallyLogOutkAESleep のイベントをシステムプロセスに送信することによって開始できます。Mac OS X 10.2 以前では、kAEReallyLogOut はアップルイベントヘッダでは定義されていませんが、サポートはされていました。Mac OS X の以前のバージョンでは、kAEReallyLogOut の代わりに、これに相当する文字コード 'rlgo' をコードで使用できます。

下記のコードでは、アップルイベントをシステムプロセスに送ることによってプログラミングによって再起動、シャットダウン、スリープ、ログアウトを発生させる方法を示しています。関数 SendAppleEventToSystemProcess は、アップルイベントをシステムプロセスに送る役割を果たします。下記のソースコードを使った完全なプロジェクトは、qa1134.sit ダウンロードに含まれています。


int main(void)
{
    const int bufferSize = 256;
    OSStatus error = noErr;
    char select [bufferSize];

    printf("1: Restart computer\n");
    printf("2: Shutdown computer\n");
    printf("3: Logout computer\n");
    printf("4: Sleep computer\n");
    printf("q: quit program\n");

    printf("please enter choice:\n");fflush(stdout);
    fgets(select, bufferSize, stdin);

    switch (select[0])
    {
         case '1':
            // 再起動イベントをシステムに送信
            error = SendAppleEventToSystemProcess(kAERestart);
            if (error == noErr)
                {printf("Computer is going to restart!\n");}
            else
                {printf("Computer wouldn't restart\n");}
         break;
         case '2':
            // システム終了イベントをシステムに送信
            error = SendAppleEventToSystemProcess(kAEShutDown);
            if (error == noErr)
                {printf("Computer is going to shutdown!\n");}
            else
                {printf("Computer wouldn't shutdown\n");}
         break;
         case '3':
            // ログアウトイベントをシステムに送信
            error = SendAppleEventToSystemProcess(kAEReallyLogOut);
            if (error == noErr)
                {printf("Computer is going to logout!\n");}
            else
                {printf("Computer wouldn't logout");}
         break;
         case '4':
            // スリープイベントをシステムに送信
            error = SendAppleEventToSystemProcess(kAESleep);
            if (error == noErr)
                {printf("Computer is going to sleep!\n");}
            else
                {printf("Computer wouldn't sleep");}
    };

    return(0);
}

OSStatus SendAppleEventToSystemProcess(AEEventID EventToSend)
{
    AEAddressDesc targetDesc;
    static const ProcessSerialNumber
         kPSNOfSystemProcess = { 0, kSystemProcess };
    AppleEvent eventReply = {typeNull, NULL};
    AppleEvent appleEventToSend = {typeNull, NULL};

    OSStatus error = noErr;

    error = AECreateDesc(typeProcessSerialNumber,
        &kPSNOfSystemProcess, sizeof(kPSNOfSystemProcess),
        &targetDesc);

    if (error != noErr)
    {
        return(error);
    }

    error = AECreateAppleEvent(kCoreEventClass, EventToSend,
                     &targetDesc, kAutoGenerateReturnID,
                     kAnyTransactionID, &appleEventToSend);

    AEDisposeDesc(&targetDesc);

    if (error != noErr)
    {
        return(error);
    }

    error = AESend(&appleEventToSend, &eventReply, kAENoReply,
             kAENormalPriority, kAEDefaultTimeout,
             NULL, NULL);

    AEDisposeDesc(&appleEventToSend);

    if (error != noErr)
    {
        return(error);
    }

    AEDisposeDesc(&eventReply);

    return(error); // これが noErr ならば正常終了
}

リスト 1. プログラムでシステムを再起動、システム終了、スリープ、ログアウトする方法


ダウンロード

qa1134.sit

コードリスト 1 のソースプロジェクト (8K)

ダウンロード



[2003 年 2 月 10 日]