2011-09-02 68 views
2

如果有人能夠幫助我,或者指引我走向正確的方向,我將不勝感激。空氣應用 - 在系統托盤中啓動?

我一直試圖讓系統托盤中啓動一個Adobe AIR應用程序,到目前爲止我已經使用了這個代碼片段:http://www.swamicharan.com/blog/air/minimizing-an-air-app-to-systemtray/,其工作原理與上述相同,但無論我做了什麼,我似乎都無法啓動它,最小化,在系統托盤中。這是我到目前爲止的代碼:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         width="300" height="100" creationComplete="initApp()" layout="horizontal"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.events.CloseEvent; 

      private var trayIcon:BitmapData; 

      public function initApp():void{ 
       loadTrayIcon(); 

       this.addEventListener(Event.CLOSING, minToTray); 
      } 

      public function loadTrayIcon():void{ 
       var loader:Loader = new Loader(); 
       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, readyToTray); 
       loader.load(new URLRequest("assets/icon.PNG")); 
      } 

      private function minToTray(event:Event):void{ 
       event.preventDefault(); 
       dock(); 
      } 

      public function readyToTray(event:Event):void{ 
       trayIcon = event.target.content.bitmapData; 

       var myMenu:NativeMenu = new NativeMenu(); 

       var openItem:NativeMenuItem = new NativeMenuItem("Options"); 
       var closeItem:NativeMenuItem = new NativeMenuItem("Close"); 

       openItem.addEventListener(Event.SELECT, unDock); 
       closeItem.addEventListener(Event.SELECT, closeApp); 

       myMenu.addItem(openItem); 
       myMenu.addItem(new NativeMenuItem("", true)); 
       myMenu.addItem(closeItem); 

       if(NativeApplication.supportsSystemTrayIcon){ 
        SystemTrayIcon(NativeApplication.nativeApplication.icon).tooltip = "Notifier"; 

        SystemTrayIcon(NativeApplication.nativeApplication.icon). 
         addEventListener(MouseEvent.CLICK, unDock); 

        stage.nativeWindow.addEventListener(
         NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, winMinimized); 

        SystemTrayIcon(NativeApplication.nativeApplication.icon).menu = myMenu; 
       } 
      } 

      private function winMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void{ 
       if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED){ 
        displayStateEvent.preventDefault(); 
        dock(); 
       } 
      } 

      public function dock():void{ 
       stage.nativeWindow.visible = false; 

       NativeApplication.nativeApplication.icon.bitmaps = [trayIcon]; 
      } 

      public function unDock(event:Event):void{ 
       stage.nativeWindow.visible = true; 
       stage.nativeWindow.orderToFront(); 

       NativeApplication.nativeApplication.icon.bitmaps = []; 
      } 

      private function closeApp(event:Event):void{ 
       stage.nativeWindow.close(); 
      } 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Style> 
     @namespace s "library://ns.adobe.com/flex/spark"; 
     s|WindowedApplication 
     { 

      skinClass:ClassReference("spark.skins.spark.SparkChromeWindowedApplicationSkin"); 
      background-color:#999999; 
      background-alpha:"0.7"; 
     }   
    </fx:Style> 

    <s:Label text="Hello AIR"/> 
</mx:WindowedApplication> 

很多謝謝。

回答

1

我想你會在readyToTray(event:Event)的末尾撥打dock()進行管理。 爲了確保initialWindow在啓動時不可見,您可以在application descriptor file中將其可見屬性設置爲false。

+0

太棒了,完美的作品,非常感謝:) – Sam0