在Mac上检测AIR应用程序中的不同退出选项

时间:2009-08-26 23:40:50

标签: flex macos air

我在Mac上运行了AIR应用程序,当有人“关闭”应用程序时(例如点击红色的“x”按钮或cmd-w),我希望隐藏窗口的行为。但是,如果有人点击cmd-q或从停靠上下文菜单或顶级菜单中选择“退出”,我希望该应用实际关闭。

我可以阻止对应用程序发送的“关闭”事件的默认,但是,这会导致所有“关闭”方法只隐藏窗口。当时有人关闭应用程序的唯一方法是ForceQuit(或通过我提供的单独界面,如停靠栏图标上的上下文菜单选项)。

我还尝试手动捕获cmd-q keyDown事件,但它没有被发送。此外,当人们尝试使用菜单选项退出应用程序时,这无济于事。

此外,如果我阻止关闭方法的默认,它会导致我的应用程序立即取消关闭过程(这是一种糟糕的用户体验)。

有没有办法检测关闭AIR应用程序的不同方法?我希望能够分辨出这些结束方法之间的区别并做出适当的反应。

2 个答案:

答案 0 :(得分:6)

尝试使用此结束,根据我的理解,框架中存在/是一个错误,因此如果您包含AIR更新程序,它会破坏cmd-q支持,以前的线程是:http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=72&catid=670&threadid=1373568 < / p>

这可能适用于您的情况,也可能不适用。

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 :(得分:1)

试试这个,我相信必须有一个更好的方法来解决这个问题,但这对我有用。

<?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>