2009-08-26 11 views
2

Mac上でAIRアプリケーションを実行していて、誰かがそのアプリケーションを「閉じる」(例えば、赤い「x」ボタンやcmdを押すなど) -w)。しかし、誰かがcmd-qを押すか、ドックのコンテキストメニューやトップレベルメニューから「Quit」を選択すると、アプリを実際に閉じることができます。Mac上のAIRアプリケーションで異なる終了オプションを検出する

私は、アプリケーションによって送信された "閉じる"イベントのデフォルトを防ぐことができますが、これによりすべての "閉じる"メソッドがウィンドウを隠すだけです。その時点で誰かがアプリケーションを閉じるための唯一の方法は、ForceQuit(またはドックアイコン上のコンテキストメニューオプションのように私が提供する別のインターフェースを通して)です。

私もcmd-q keyDownイベントを手動でキャプチャしようとしましたが、送信されません。また、メニューオプションを使用してアプリを終了しようとすると、これは役に立たないでしょう。

さらに、閉じるメソッドでDefaultDefaultを設定すると、アプリケーションでシャットダウンプロセスがすぐにキャンセルされる(これはひどいユーザーエクスペリエンスです)。

AIRアプリケーションを閉じるさまざまな方法を検出する方法はありますか?私はこれらの閉鎖方法の違いを知り、適切に反応することができるようにしたい。

+0

明らかに、ウィンドウを閉じることはアプリケーションを閉じることと同義ではない標準的なMacの動作を実装しようとしていますか?非表示はアプリに何かすることであり、アプリを閉じることやアプリのウィンドウとは異なります。 – user57368

答えて

6

私はあなたが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(); 
      } 
    }); 
+0

EXITINGとCLOSINGのイベントは非常に便利です(何らかの理由で、Flex BuilderはWindowedApplicationコンポーネントの自動補完で既存のオプションを表示しません)。これは私のために働いた。 –

+0

ありがとう!私は数ヶ月間この問題に苦しんできました!私はそれがアップデーターの問題であることを知らなかった。これは、それを言及するスレッドです:http://forums.adobe.com/thread/246228?tstart=0 – leolobato

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> 
+0

コードをありがとう - 私は実際に隠しウィンドウの部分を行う必要はありませんでした。なぜなら、CLOSINGイベントのpreventDefaultがそれを処理したからです。私が持っていた主な問題は、EXITINGイベントでした。 EXITINGイベントのすべてのウィンドウを閉じるループを追加するだけでした。なんらかの理由で、私がnativeApplication.exit()をEXITINGイベントで呼び出したときに、preventDefaultをCLOSINGイベントで呼び出すと、アプリケーションは開いたままになります。 –

関連する問題