把AIR隐藏在系统托盘中,并添加系统托盘菜单

来源:互联网 发布:js 设置input编辑状态 编辑:程序博客网 时间:2024/05/16 19:45
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApplication()">
 <mx:Script>
  <![CDATA[
   /**
    * 这个程序描述了如何把AIR程序隐藏在系统托盘中以及从系统托盘中再次激活程序
    * 当窗口被最小化或关闭时,把程序隐藏在系统托盘中。
    *
    * 做了一个简单的系统托盘菜单,来演示如何操作菜单。
    *
    * @Author: S.Radovanovic
    * @Url: http://www.saskovic.com/blog/?p=5
    * @Date: 24-11-2007
    * @Author: Jeffry Houser
    * @Date: 09-01-2007
    * Updated for AIR Beta 3
    */
   
   import mx.controls.Alert;
   import mx.events.CloseEvent;
   
   private var dockImage:BitmapData;
   
   /**
    * 用默认值初始化程序
    * 这个函数在窗口的 creationComplete 中执行
    */
   public function initApplication():void {
    
    //用loader对象载入一张图像作为系统托盘图标
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, prepareForSystray);
    loader.load(new URLRequest("skin/16.png"));
    
    
    // 捕获关闭窗口事件,让用户决定窗口是隐藏还是关闭
    this.addEventListener(Event.CLOSING, closingApplication);
   }
   
   /**       
    * 用户决定窗口是隐藏还是关闭
    * @Author: S.Radovanovic
    */
   private function closingApplication(evt:Event):void {
    // 以下语句防止默认的关闭动作发生
    evt.preventDefault();
    
    // 弹出窗口,让用户判断是否要关闭窗口
    //Alert.buttonWidth = 110;
    Alert.yesLabel = "Close";
    Alert.noLabel = "Minimize";
    Alert.show("Close or minimize?", "Close?", 3, this, alertCloseHandler);
   }
   
   // 响应弹出窗口中用户的选择
   private function alertCloseHandler(event:CloseEvent):void {
    if (event.detail==Alert.YES) {
     closeApp(event);
    } else {
     dock();
    }
   }
   
   
   /**
    * 设置基本属性。
    * @Author: S.Radovanovic
    */
   
   public function prepareForSystray(event:Event):void {
    
    // 把图像作为系统图标
    dockImage = event.target.content.bitmapData;
    
    // windows 支持系统托盘图标, 苹果系统同样也支持, 上网可以找到相应的方法
    if (NativeApplication.supportsSystemTrayIcon){
     setSystemTrayProperties();
     
     // 设置系统托盘菜单          
     SystemTrayIcon(NativeApplication.nativeApplication .icon).menu = createSystrayRootMenu();
    }
   }
   
   /**
    * 创建系统托盘菜单
    *
    * @Author: S.Radovanovic
    */
   private function createSystrayRootMenu():NativeMenu{
    // 添加菜单元件,每个元件响应相应的方法
    var menu:NativeMenu = new NativeMenu();
    var openNativeMenuItem:NativeMenuItem = new NativeMenuItem("Open");
    var exitNativeMenuItem:NativeMenuItem = new NativeMenuItem("Exit");
    
    // 当用户双击元件时发生的事件
    openNativeMenuItem.addEventListener(Event.SELECT, undock);
    
    exitNativeMenuItem.addEventListener(Event.SELECT, closeApp);
    
    // 把菜单元件添加到菜单中
    menu.addItem(openNativeMenuItem);
    menu.addItem(new NativeMenuItem("",true));
    
    
    menu.addItem(exitNativeMenuItem);
    
    return menu;
   }
   
   /**
    * 设置隐藏和激活的一些事件侦听
    *
    * @Author: S.Radovanovic
    */
   private function setSystemTrayProperties():void{
    
    
    // 当鼠标悬停在系统托盘图标上时显示文字。      
    SystemTrayIcon(NativeApplication.nativeApplication .icon).tooltip = "Systray test application";
    
    
    // 双击系统托盘图标打开程序
    SystemTrayIcon(NativeApplication.nativeApplication .icon).addEventListener(MouseEvent.CLICK, undock);
    
    
    // 侦听窗口显示状态的改变,这样就可以捕获最小化事件    
    stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, nwMinimized); //捕获最小化事件
    
   }
   
   /**
    * 窗口的状态改变时执行合适的动作。
    * 当用户点击最小化按钮,隐藏程序到系统托盘
    *
    * @Author: S.Radovanovic
    */
   private function nwMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void {
    
    
    if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED) {
     //Prevent the windowedapplication minimize action from happening and implement our own minimize
     //The reason the windowedapplication minimize action is caught, is that if active we're not able to
     //undock the application back neatly. The application doesn't become visible directly, but only after clicking
     //on the taskbars application link. (Not sure yet what happens exactly with standard minimize)
     
     displayStateEvent.preventDefault(); // 当按下最小化按钮是,要阻止默认的最小化发生
     
     dock();
    }
   }
   
   /**
    * 在系统托盘中显示程序图标
    * @Author: S.Radovanovic
    */
   public function dock():void {
    // 隐藏当前窗口
    stage.nativeWindow.visible = false;
    
    
    // 设置 bitmaps 数组,在系统托盘中显示程序图标。
    NativeApplication.nativeApplication .icon.bitmaps = [dockImage];
   }
   
   /**
    * 重新显示程序窗口,从系统托盘中移除图标
    * @Author: S.Radovanovic
    */
   public function undock(evt:Event):void {
    // 把窗口设置为可见, 并确保程序在最前端。
    stage.nativeWindow.visible = true;
    stage.nativeWindow.orderToFront();
    
    // 清空 bitmaps 数组,同时清空了系统托盘中的程序图标。
    NativeApplication.nativeApplication .icon.bitmaps = [];
   }
   
   
   /**
    * 关闭程序
    *
    * @Author: S.Radovanovic
    */
   private function closeApp(evt:Event):void {
    stage.nativeWindow.close();
   }
  ]]>
 </mx:Script>
 
</mx:WindowedApplication>
原创粉丝点击