我在Mac上运行了AIR应用程序,当有人“关闭”应用程序时(例如点击红色的“x”按钮或cmd-w),我希望隐藏窗口的行为。但是,如果有人点击cmd-q或从停靠上下文菜单或顶级菜单中选择“退出”,我希望该应用实际关闭。
我可以阻止对应用程序发送的“关闭”事件的默认,但是,这会导致所有“关闭”方法只隐藏窗口。当时有人关闭应用程序的唯一方法是ForceQuit(或通过我提供的单独界面,如停靠栏图标上的上下文菜单选项)。
我还尝试手动捕获cmd-q keyDown事件,但它没有被发送。此外,当人们尝试使用菜单选项退出应用程序时,这无济于事。
此外,如果我阻止关闭方法的默认,它会导致我的应用程序立即取消关闭过程(这是一种糟糕的用户体验)。
有没有办法检测关闭AIR应用程序的不同方法?我希望能够分辨出这些结束方法之间的区别并做出适当的反应。
答案 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>