Adicionando um icone no System Tray com Adobe AIR

As vezes você precisa que seu aplicativo rode em "background" bastando acessa-lo por um icone no systray do seu computador. O Adobe AIR suporta essa funcionalidade, sendo possivel usar a interação tanto com o botão direito quanto com o botão esquerdo do mouse.
Vamos pegar uma imagem qualquer para nosso exemplo, como essa: brick
Carregaremos a imagem em nossa aplicação usando a classe Loader, assim que o carregamento estiver completo, sera adicionando no system tray usando a propriedade NativeApplication.nativeApplication.icon.bitmaps.

ACTIONSCRIPT3:
  1. public function init():void
  2. {
  3.     var icon:Loader = new Loader();
  4.     icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
  5.     icon.load(new URLRequest("brick.png"));
  6. }
  7.  
  8. private function iconLoadComplete(event:Event):void
  9. {
  10.     NativeApplication.nativeApplication.icon.bitmaps = [event.target.content.bitmapData];
  11. }

Executando a aplicação, veremos a imagem ao lado do relogio do windows. Vamos adicionar um tooltip:

ACTIONSCRIPT3:
  1. public function init():void
  2. {
  3.     var icon:Loader = new Loader();
  4.     icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
  5.     icon.load(new URLRequest("brick.png"));
  6.         var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
  7.     if (NativeApplication.supportsSystemTrayIcon)
  8.     {
  9.         systray.tooltip = "to aqui ô!!! o/";
  10.     }
  11. }

Rodando o programa veremos o icone aparecendo no system tray, ao passar o mouse por cima, o tooltip.
Agora vamos implementar a ação para quando o usuário clicar com o botão direito do mouse. Usaremos o a classe NativeMenu e NativeMenuItem, é bem parecido com o que já usamos no Flash Player. Vamos instanciar a classe e adicionar um evento para a ação de select:

ACTIONSCRIPT3:
  1. var iconMenu:NativeMenu = new NativeMenu();
  2. var aboutCommand:NativeMenuItem =  iconMenu.addItem(new NativeMenuItem("blablabla"));
  3. var webCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Ir para o blog"));
  4. webCommand.addEventListener(Event.SELECT,goURL);
  5. iconMenu.addItem(new NativeMenuItem("",true));//separator
  6. var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit")); exitCommand.addEventListener(Event.SELECT, closeApp);

Agora verificando se o sistema operacional suporta system tray:

ACTIONSCRIPT3:
  1. if (NativeApplication.supportsSystemTrayIcon)
  2.                 {
  3.                     var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
  4.                     systray.menu = iconMenu;
  5.                 }

Segue o código completo:
DOWNLOAD

Referencia:
http://help.adobe.com/en_US/AIR/1.5/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7dcc.html

Translations
English Version

16 Comments

  • By Ved, May 21, 2009 @ 09:28

    Muito obrigado pelo tutorial! Vai me ajudar bastante! =D

  • By Ved, May 21, 2009 @ 09:49

    Só um detalhe. Se vc quiser complementar sua informação, eu fiz uma verificação se o SO é Mac. Se for, adiciono um icone de 128×128px pois ele será mostrado no dock. Se for windows, insiro o icone padrao de 16×16px.

    // Verifica se é MacOS
    if(NativeApplication.supportsDockIcon){
    icon.load(new URLRequest(“assets/images/icons/icone128×128.png”));
    } else {
    icon.load(new URLRequest(“assets/images/icons/icone16×16.png”));
    }

  • By Leonardo França, May 21, 2009 @ 13:04

    Boa Ved, não tinha testado ainda no mac ;o)

  • By popup, May 23, 2009 @ 18:42

    gostei do post

  • By janderson, May 26, 2009 @ 12:22

    boa dica, muito útil, vlw!

  • By João, June 6, 2009 @ 19:41

    Boa noite ! Queria deixar a seguinte questão.. Porque razão num video flashchat , apos uns dias de utilização ao entrar um nick ou ao sair do chat , não conseguimos escrever durante breves segundos e apos o server enviar um pedido por E-mail aos serviços do Flash media server para me fazerem reset o chat deixa de bloquiar durante uns dias . o erro é do flash media server ou da configuração do chat?? Antecipadamente o meu Obrigado

  • By Leonardo França, June 9, 2009 @ 10:08

    Dificil responder assim, entra ai uma serie de fatores, como o servidor esta configurado, a banda da internet usada, erro do programador etc

  • By Carlos, June 17, 2009 @ 11:27

    Adorei o seu blog.

  • By rodrigo, June 19, 2009 @ 14:22

    ola grande leonardo que acompanho a anos, eu tenho uma duvida simples ate, eu to fazendo um navegador tem como eu clicar com o botao direito do mouse e abrir link em outra aba???

    mal se for easy de mas é que to novo nisso ainda.

    flw

  • By Lucas Monteverde, June 25, 2009 @ 16:05

    Olá, li o seu tutorial, e já li outros similares, mas ainda estou com uma dúvida, seria possível restaurar o aplicativo do system tray, com um comando do teclado(hotkey) algo como o google desktop faz(duplo ctrl)?

  • By Leonardo França, June 28, 2009 @ 23:02

    Ola, obrigado pelo prestigio! :D
    Quanto a sua pergunta, possivel sim, da um trabalhinho mas é possivel sim, assim que sobrar um tempo, posso deixar um exemplo no blog ;)

  • By Leonardo França, June 28, 2009 @ 23:42

    Ola Lucas,
    É possivel sim, basta implemantar o evento de restaurar a janela com o evento do teclado(KeyboardEvent) com um contator simples.
    caso queira, posto um exemplo ;)

  • By João, July 2, 2009 @ 09:34

    Ola amigo,
    Primeiro parabéns pelo blog, conteúdo simples e objetivo, muito bom mesmo.
    Fiquei com uma dúvida, isso funciona da mesma forma no linux?

  • By Leonardo França, July 2, 2009 @ 12:48

    Ainda nao testei no linux, vou ver se consigo fazer um teste, mas em teoria deve funcionar da mesma forma ;)

  • By Antonio Carlos, November 16, 2009 @ 17:29

    Olá Leonardo..
    Muito bom o post.. contudo tenho uma dúvida.
    Seria possível a janela da aplicação ficar visível mas não aparecer na taskbar?
    No Windows seria mais ou menos como Crtl+R, o famoso “Executar”, .. a janela está visível mas não é representada na barra de tarefas..
    valeu..

  • By Leonardo França, December 8, 2009 @ 11:54

    é possivel sim, vc vai usar a mesma tecnica para esconder a janela

Other Links to this Post

RSS feed for comments on this post. TrackBack URI

Leave a comment

WordPress Themes


Video & Audio Comments are proudly powered by Riffly