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