
클릭하면 크게 보입니다.
알송이나 메신져들 보면
태스크바는 차지하지 않고 시스템트레이에만 위치해있습니다.
AIR 도 물론 이게 가능하고
약간의 트릭만 있으면 쉽게 가능합니다.
1. 기본 NativeWindow 는 활성화시키지 않는다.
- 테스크바를 차지하지 않습니다.
2. 새창을 만든다.
- type 을 "utility"로 만들면 부모창에 종속된 창으로 나타납니다.
3. 새창의 stage, stage.nativeWindow 의 기본 속성을 복사해준다.
4. 기본 트레이 아이콘을 생성해준다.
- 생성전에 설정해주면 커스터마이징 가능합니다.
5. 새창의 stage 에 Document Class 를 addChild 해준다.
- 부모창의 의미를 바꿔버리는거죠.
6. 기본적인 셋팅.
- 자동으로 Application 닫도록 설정.
- 아이콘 클릭시 맨 위로 나타나도록 설정.
TrayedNativeApplication 소스보기
package kr.as3.display
{
/*****************************************************************
* Description : System Trayed Application's base class.
* Class Name : TrayedNativeWindow
* Company : Belong to www.as3.kr.
* Author : JINSANG YUN ( a.k.a. Wooyaggo victim4@gmail.com )
* Last modified : 2008.06.02
* Version : 1.0
*
* Copyright www.as3.kr. All Rights Reserved.
******************************************************************/
/**
* This source code follow LGPL (Lesser GPL)
*
* 본 제품(소프트웨어)는 GPL 라이센스 하에 배포되는 소프트웨어 TrayedNativeWindow 을 포함합니다
*
* 이 소스코드는 LGPL 을 따릅니다.
* 사실 저도 LGPL 을 잘 모릅니다.
*
* 하지만 단순한 몇가지를 나열해봅니다.
*
* * 라이센시(Licensee)는 오픈소스 소프트웨어(이 컴퍼넌트 클래스)를 자유롭게 사용할 수 있다.
* * 라이센시(Licensee)는 오픈소스 소프트웨어(이 컴퍼넌트 클래스)를 일정한 조건하에 자유롭게 복제할 수 있다.
* * 라이센시(Licensee)는 오픈소스 소프트웨어(이 컴퍼넌트 클래스)를 일정한 조건하에 자유롭게 수정, 수정된 내용을 재배포할 수 있다.
*
* * 복제, 수정, 재배포에 대한 조건 *
* * 저작권 관련 문구를 유지한다.
* * 제품명 혹은 컴퍼넌트(클래스)명을 중복되지 않게 한다.
* * 최종결과물에 사용 여부를 명시한다. (논문의 "인용" 과 비슷)
* * 수정, 추가하였을때는 수정, 추가한 소스코드도 공개한다. (저작자에게 email 로 알리면 된다고 봄)
* * 특허에 관련될 경우 복잡해지니 무시.
*
* 간단하게 이야기하면 이 소스는 LGPL 을 따르기 때문에 사용했다는 것을 반드시 밝혀야하고,
* 원본 소스가 수정 또는 추가되면 그 소스도 자동으로 LGPL 을 따르게 된다는 이야기입니다.
*
* 더 쉽게 말해서 걍 쓰시고 썼다는 이야기만 해주시면 될거 같습니다. 대부분 수정은 잘 안하자나요 ㅋㅋ
* 수정하면 수정했다고 공개하거나 메일로 소스랑 같이 알려주면되는거 같구요.
* 생각보다 그렇게 어려운 건 아닌거 같습니다^^
*
* 오픈소스 소프트웨어 라이센스 가이드 : http://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide?action=show&redirect=FindPage#s-3.2.2
* KLDP 의 LGPL 관련 질문글 : http://search.empas.com/search/oea/kldp/oe.html?q=LGPL&sdsn=&en=utf8
*
* 우리 모두 같이 자유롭게 소스를 공개하고 떳떳하게 사용하는 분위기를 조성해봅시다.
*
*/
import flash.desktop.*;
import flash.display.*;
import flash.events.MouseEvent;
/**
* To make a application is nested within SystemTray, Instead extending Sprite or MovieClip, just extend TrayedNativeWindow.
*
* @author wooyaggo
*
*/
public class TrayedNativeWindow extends MovieClip
{
/**
* if you want to set InitOption, After set this, then call super();
*
* @example
* <listing version="3.0">
<font color="#BC00CC"><b>package </b></font><br/>
{<br/>
<font color="#3A33FF"><b>import </b></font>flash.display.NativeWindowInitOptions;<br/>
<br/>
<font color="#3A33FF"><b>import </b></font>kr.as3.display.TrayedNativeWindow;<br/>
<br/>
<font color="#3A33FF"><b>public </b></font><font color="#BC00CC"><b>class </b></font>SampleTrayApplication <font color="#3A33FF"><b>extends</b></font> TrayedNativeWindow<br/>
{<br/>
<font color="#3A33FF"><b>public </b></font><font color="#339966"><b>function</b></font> SampleTrayApplication()<br/>
{<br/>
<font color="#3A33FF"><b>this</b></font>.initOption = <font color="#3A33FF"><b>new</b></font> NativeWindowInitOptions();<br/>
<font color="#3A33FF"><b>this</b></font>.initOption.resizable = <font color="#3A33FF"><b>false</b></font>;<br/>
<br/>
<font color="#3A33FF"><b>super</b></font>();<br/>
}<br/>
}<br/>
}
* </listing>
*/
public var initOption: NativeWindowInitOptions;
/**
* You can access SystemTrayIcon without type-casting NativeApplication.nativeApplication.icon.
*/
public var icon: SystemTrayIcon;
/**
* Constructor, You can create nested-SystemTrayApplication nowhere at taskbar.
*
*/
public function TrayedNativeWindow()
{
var older: NativeWindow = this.stage.nativeWindow;
var oldStage: Stage = this.stage;
if( this.initOption == null )
{
this.initOption = new NativeWindowInitOptions();
this.initOption.maximizable = older.maximizable;
this.initOption.minimizable = older.minimizable;
this.initOption.resizable = older.resizable;
this.initOption.systemChrome = older.systemChrome;
this.initOption.transparent = older.transparent;
}
this.initOption.type = NativeWindowType.UTILITY;
var window: NativeWindow = new NativeWindow( this.initOption );
window.width = older.width;
window.height = older.height;
window.x = older.x;
window.y = older.y;
window.title = older.title;
window.stage.addChild( this );
window.stage.align = StageAlign.TOP_LEFT;
window.stage.displayState = oldStage.displayState;
window.stage.focus = oldStage.focus;
window.stage.frameRate = oldStage.frameRate;
window.stage.fullScreenSourceRect = oldStage.fullScreenSourceRect;
window.stage.mouseChildren = oldStage.mouseChildren;
window.stage.quality = oldStage.quality;
window.stage.scaleMode = StageScaleMode.NO_SCALE;
window.stage.showDefaultContextMenu = oldStage.showDefaultContextMenu;
window.stage.stageFocusRect = oldStage.stageFocusRect;
window.stage.tabChildren = oldStage.tabChildren;
var iconBitmap: BitmapData = new BitmapData( 16, 16, false, 0xFFCC00 );
this.icon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
this.icon.bitmaps = [ iconBitmap, iconBitmap, iconBitmap, iconBitmap ];
this.icon.addEventListener( MouseEvent.CLICK, showFrontListener );
NativeApplication.nativeApplication.autoExit = true;
older.close();
window.activate();
}
/**
* To click tray icon when the application was covered with other windows, show up to front.
*/
private function showFrontListener( e: MouseEvent ): void
{
// keep a origin state.
var isFronted: Boolean = this.stage.nativeWindow.alwaysInFront;
this.stage.nativeWindow.alwaysInFront = false;
this.stage.nativeWindow.alwaysInFront = true;
if( isFronted == false )
this.stage.nativeWindow.alwaysInFront = false;
}
}
} |
|
이번에 올리는 소스는 아주 간단하게
Document 클래스를 Sprite 나 MovieClip 이 아니라
TrayedNativeWindow로 상속하게 되면
기본적으로 시스템트레이로 실행되는 어플리케이션을 만들 수 있습니다.
AIR 데모 : [
설치하기 ] (AIR Installer 가 설치되어있지 않으면 zip 파일로 인식합니다.)
AIR 소스 : [
다운받기 ]