
클릭하면 크게 보입니다.
알송이나 메신져들 보면
태스크바는 차지하지 않고 시스템트레이에만 위치해있습니다.
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 소스 : [
다운받기 ]
Trackback URL : http://wooyaggo.tistory.com/trackback/147