Обнаружение различных вариантов выхода из приложения AIR на Mac - PullRequest
2 голосов
/ 27 августа 2009

У меня есть приложение AIR, работающее на Mac, и я хочу скрыть окно, когда кто-то «закрывает» приложение (например, нажимает красную кнопку «x» или cmd-w). Однако, если кто-то нажмет cmd-q или выберет «Выход» из контекстного меню дока или меню верхнего уровня, я хочу, чтобы приложение действительно закрылось.

Я могу предотвратить дефолт по событию «закрытие», отправляемому приложением, однако это заставляет все методы «закрыть» просто скрывать окно. Единственный способ закрыть приложение в этот момент - это ForceQuit (или через отдельный интерфейс, который я предоставляю, как опция контекстного меню на значке дока).

Я также попытался захватить событие cmD-q keyDown вручную, но оно не отправляется. Кроме того, это не поможет в случае, когда люди пытаются выйти из приложения, используя опции меню.

Кроме того, если я предотвращаю использование по умолчанию метода закрытия, это приводит к тому, что мое приложение немедленно отменяет процесс завершения работы (что ужасно для пользователя).

Есть ли способ обнаружения различных методов закрытия приложения AIR? Я хочу быть в состоянии определить разницу между этими методами закрытия и правильно реагировать на них.

Ответы [ 2 ]

6 голосов
/ 27 августа 2009

Попробуйте это для закрытия, из того, что я понимаю, была / есть ошибка в фреймворке, так что если вы включаете средство обновления AIR, то это нарушает поддержку cmd-q, поток был здесь: http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=72&catid=670&threadid=1373568

Это может или не может быть применимо к вашей ситуации.

NativeApplication.nativeApplication.addEventListener(Event.EXITING, 
        function(e:Event):void {
            var opened:Array = NativeApplication.nativeApplication.openedWindows;
            for (var i:int = 0; i < opened.length; i ++) {
                opened[i].close();
            }
    });
1 голос
/ 27 августа 2009

Попробуйте, я уверен, что должен быть лучший способ справиться с этим, но это сработало для меня.

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete()">
    <mx:Script>
        <![CDATA[
            import mx.core.Application;
            import mx.events.AIREvent;
            import mx.core.Window;

            private function onCreationComplete():void {
                addMacSupport();
            }

            private var macsupport_allowExit:Boolean = false;

            private function addMacSupport():void {
                if ( Capabilities.os.indexOf("Mac") == 0 ) {
                    //open a hidden window that will prevent the application from
                    //exiting when the user presses Cmd+W
                    var win:Window = new Window();
                    win.visible = false;
                    win.open(false);

                    //add a closing listener on the hidden window, this event will only
                    //be fired when the user pressed Cmd+Q or selects quit from the menu
                    //then set macsupport_allowExit to true
                    win.addEventListener(Event.CLOSING, function(e:Event):void {
                        macsupport_allowExit = true;
                    });

                    //add an event listener to this window on closing
                    addEventListener(Event.CLOSING, function(e:Event):void {
                        //always preventDefault
                        e.preventDefault();

                        //wait one frame, then check the macsupport_allowExit variable
                        //if it is true, we nedd to exit the app, otherwise just hide
                        //the app window
                        callLater(function():void {
                            if ( macsupport_allowExit ) {
                                nativeApplication.exit();
                            }
                            else {
                                nativeWindow.visible = false;
                            }
                        });
                    });

                    //add an event listener for INVOKE to show our main app window
                    //when the dock icon is clicked.
                    addEventListener(InvokeEvent.INVOKE, function(e:InvokeEvent):void {
                        if ( nativeWindow && !nativeWindow.visible ) {
                            nativeWindow.visible = true;
                            nativeWindow.activate();
                        }
                    });
                }
            }
        ]]>
    </mx:Script>
</mx:WindowedApplication>
...