3

Dock から非表示にする必要がある Java アプリケーションがあり、中断できるようにする必要もあります。これは私がシャットダウンを処理する方法です:

import com.apple.eawt.AppEvent.QuitEvent;
import com.apple.eawt.QuitHandler;
import com.apple.eawt.QuitResponse;
import com.apple.eawt.Application;

public class MacOSXCustomizer {
    public void init() {
        Application application = Application.getApplication();
        application.setQuitHandler(new QuitHandler() {
            public void handleQuitRequestWith(QuitEvent qe, QuitResponse qr) {
                if(Main.prepareForExit()) {
                    qr.performQuit();
                } else {
                    qr.cancelQuit();
                }
            }
        });
    }
}

私は独自の Java ランチャーを使用しており、アプリケーション バンドルと独自の Java ランチャー バイナリを使用しています。LSUIElement を YES に設定して Dock アイコンの問題を解決しましたが、シャットダウン フックが機能しなくなりました。私のメソッドはシャットダウン中に呼び出されますが (ログに記録できます)、qr.cancelQuit() が呼び出されてもアプリケーションは終了します。システムが応答を待っていないようです。いくつかの操作 (2 秒間) が実行されていても、完了していません。データ損失の原因となります。

LSUIElement を NO に戻そうとすると、qr.cancelQuit() が呼び出されるとシステムがシャットダウンをキャンセルします。他の変更は行われませんでした。

また、メソッドを 1 つだけ実装する単純な Cocoa アプリケーションを作成しようとしました。

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    return NSTerminateCancel;
}

「アプリケーションのShutdownTestがログアウトをキャンセルしました」というダイアログが表示されます。とにかくユーザーセッションはログアウトされます。

私の質問は、Dock とメニュー バーにアイコンを表示せず、シャットダウン シーケンスをキャンセル/中断できるようにするにはどうすればよいですか?

編集: Javaアプリケーションかどうかは関係ありません。ネイティブ アプリケーションの動作は同じです。

4

1 に答える 1

4

Apple テクニカル サポートと話し合いましたが、要求された動作は不可能です。エージェントとして設計されたアプリケーション (たとえば、LSUIElement を YES に設定することによって) は、シャットダウンまたはログアウト シーケンスを中断することはできません。システムは単に応答を待たず、戻り値を読み取って尊重することを気にしません。

バックグラウンド アプリケーション (Dock アイコンとメニュー バーがない) は、ユーザーと対話したり、シャットダウン シーケンスをキャンセルしたりすることはできません。

Apple テクニカル サポートによると、Dock アイコンとメニュー バーを非表示にしてフォアグラウンド アプリケーションになる可能性はありません。

于 2013-03-19T22:01:01.490 に答える