Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 12 de Junho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
114 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Colocando um ícone de seu aplicativo Delphi no System Tray sem usar nenhum componente
Publicado por Admin : Sexta, Março 05, 2004 - 03:27 GMT-3 (30419 leituras)
Comentários 32 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Alguns programas tornam-se mais utilizáveis e mais acessíveis pelo simples fato de estarem no System Tray ou “bandeja do sistema”, como alguns gostam de chamar. Um bom exemplo disto é o uso da calculadora do Windows, veja todo o caminho que deve-se percorrer até poder executa-la (excluindo é claro a possibilidade de se configurar uma tecla de atalho para ela ou ainda de coloca-la na barra de tarefas):
Menu Iniciar, Programas, Acessórios, Calculadora.

Ao invés de fazer isso muitos usuários simplesmente optam por pegar a calculadora que esta sobre a mesa, ou na gaveta e fazer o cálculo desejado. Agora pense bem se houvesse um ícone para a calculadora que estivesse a apenas um clique do mouse, certamente ela seria bem mais utilizada.

Vale também lembrar aqui que às vezes precisamos fazer com que uma programa fique rodando o dia todo mas algum usuário descuidado sempre acaba clicando no botão de fechar, ou ele pressiona as teclas ALT+F4, sempre por acidente e acaba por fechar aquele programa que deveria ficar rodando.

Tenho certeza que torna-se muito mais difícil fechar o seu programa por acidente estando ele no System Tray, e desta forma imune a cliques ou qualquer outro comando executado por descuido (é claro que ninguém vai estar imune à um CTRL+ALT+DEL), mas esta medida protege seu programa e ainda o torna mais acessível/disponível para o usuário.

Bom vamos ao trabalho então.

Usaremos durante este processo só uma função da API do windows, Shell_NotifyIcon .

Esta função esta definida na Unit ShellAPI e requer apenas dois parâmetros.

Obs: Não esqueça de declarar a Unit ShellAPI na seção Uses do formulário principal.

O primeiro parâmetro é uma flag que vai indicar se o ícone esta sendo Adicionado, Modificado ou Removido e o segundo parâmetro é um ponteiro que será apontado para a estrutura TNotifyIconData passando o handle do ícone, o texto que será exibido em forma de hint quando o mouse estiver sobre o ícone, também o handle da janela que receberá a mensagem que o ícone vai enviar e o tipo da mensagem para esta janela.

Primeiro adicione na seção private do seu formulário principal a linha:

TrayIconData: TNotifyIconData;


Fig-1: Exemplo de como deve ficar a seção private.

Depois adicione ao método OnCreate do formulário principal um procedimento para inicializar a estrutura TrayIconData e chamar a função Shell_NotifyIcon veja abaixo o exemplo:


Fig-2: Exemplo de como deve ficar o evento OnCreate do formulário principal .

O parâmetro Wnd da estrutura TaryIconData, aponta para o programa que vai receber as mensagem vindas do ícone associado.
O parâmetro hIcon indica qual ícone deve ser exibido no System Tray, neste caso estamos usando o mesmo ícone do programa.

O Parâmetro szTip recebe o texto que será exibido como hint ao passar o mouse sobre o ícone no System Tray, aqui estamos usando o título do programa, se você quiser alterar o texto existe uma limitação quanto ao seu tamanho que não pode ser superior à 64 caracteres.

O parâmetro uFlags esta definindo o ícone para receber as mensagens do programa ( process application messages ), habilitar a exibição do ícone e também do Hint.

O parâmetro uCallbackmessage aponta para o identificador de mensagens do programa, o sistema usa este identificador para informar as mensagens identificadas como Wnd ou eventos do mouse, mas que não ocorreram na área do ícone. Este parâmetro recebe o valor da constante WM_ICONTRAY que equivale à WM_USER+1.

Devemos declarar então a constante WM_ICONTRAY, e atribuir à ela o valor WM_USER+1


Fig-3: Exemplo de como deve ser declarada a constante WM_ICONTRAY .

Agora que definimos os parâmetros do ícone podemos adicioná-lo ao System Tray chamando a função Shell_NotifyIcon da API.

O primeiro parâmetro NIM_ADD adiciona o ícone na área do System Tray, existem ainda dois valores possíveis de serem passados para esta função da API, são NIM_DELETE e NIM_MODIFY que são usados para remover ou modificar um ícone na área do System Tray. Veremos exemplos de uso destes parâmetros mais à frente deste artigo. O Segundo parâmetro que passamos para a função foi a estrutura TrayIconData que inicializamos anteriormente.

Neste ponto se você rodar seu programa você vai ver que foi adicionado um ícone ao System tray, observe três ítens:

1- Primeiro, nada acontece quando você clica sobre o ícone (nós ainda não criamos nenhum procedimento para tratar isso).

2- Segundo, além do ícone no System Tray ainda existe o botão correspondente ao seu programa na barra de tarefas (nosso objetivo era justamente remover isto).

3- Terceiro, quando fechamos o programa o ícone permanece no System Tray até que o mouse seja levado sobre ele.

Bom chegamos à segunda parte do nosso artigo.

Vamos começar pelo mais simples, remover o ícone do System Tray após o programa ser fechado.
Vamos adicionar ao evento OnDestroy do formulário principal uma chamada para a função

Shell_NotifyIcon passando como primeiro parâmetro o valor NIM_DELETE

Fig-4: Exemplo de como deve ficar o evento OnDestroy do formulário principal

Para “escondermos” ou “remover” o botão do programa da barra de tarefas podemos usar um truque simples. No código do projeto (Menu Project / View Source), adicione a linha:

Application.ShowMainForm := False;
Após a linha:
Application.CreateForm(TMainForm, MainForm);


Fig-5: Exemplo de como deve ficar o código do projeto


Agora vamos à parte mais complicada de todo o processo, criar um procedimento para fazer o ícone responder aos eventos do mouse.

Primeiro declare na área public do formulário principal o procedimento para fazer o tratamento das mensagens recebidas.

procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;


Fig-6: Exemplo de como deve ficar a seção public.

Segundo vamos à definição do procedimento declarado acima:


Fig-7: Corpo do procedimento para tratar os eventos do mouse sobre o ícone .

Considerações finais:

Neste artigo criamos um procedimento simples para tratar apenas as mensagens mais básicas geradas por eventos do mouse sobre o ícone, poderíamos por exemplo adicionar procedimentos para tratar o clique duplo com o botão esquerdo ou direito sobre o ícone, ao ser soltado o botão, etc.....

Veja algo interessante, podemos fazer com que o volume do som aumente enquanto o botão esquerdo estiver pressionado sobre o ícone, ou que o volume baixe durante o tempo que o botão direito estiver pressionado sobre o ícone, existem inúmeras possibilidades, bastas ter tempo e um pouco de paciência para adaptarmos este exemplo às mais diversas necessidades.

Bom por hora é isso, simples e rápido!!!

No próximo artigo você verá como animar o ícone, fazer com que o ícone represente o estado de sua aplicação e ainda como criar um menu PopUp que será exibido ao clicar sobre o ícone.

Rodigo Schiavo
schiavor@uol.com.br

Baseado no artigo original de http://delphi.about.com/library/weekly/aa121801a.htm

Observação: Por: Rodigo Schiavo



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: grings : Mar 15, 2004 - 07:05
(Informações sobre o membro | Enviar uma mensagem) http://
Comigo não funcionou 100%, o icone até foi para o tray mas não retornava, alguma coisa a ver com o WM_ICONTRAY


por: fabiofs : Mar 25, 2004 - 11:06
(Informações sobre o membro | Enviar uma mensagem)
Bom, achei super legal o artigo.
Apesar de minha experiência com o Delphi e saber que era possível realizar tal ação, nunca tinha tentado isto. E sempre vi componentes fazerem isto o que explica nunca ter me atinado em criar um código para tal tarefa.

Mas ainda fica uma pequena solicitação. Acho que o artigo poderia ser melhor classificado como uma dica bem detalhada.

Faltou explicar de uma forma mais genérica o que é a API do windows. Explicar de uma forma mais detalhada o significado de cada parâmetro do método da API utilizada pois os mesmos aparecem em outros métodos da API, etc...
Lembrem-se que programadores iniciantes também vão ler o artigo e desta forma vão se limitar a aprender o que foi explicado como se estivessem lendo uma "receita de bolo".

Mesmo assim achei o artigo legal.


por: dchacal : Abr 13, 2004 - 12:20
(Informações sobre o membro | Enviar uma mensagem)
Exelente pois evita tarmos atrás de componentes é um pouco trabalhoso mais depois de pronto fica o maximo, parabens


por: CrAsH_OvErRiDe : Abr 15, 2004 - 03:23
(Informações sobre o membro | Enviar uma mensagem) http://
Muito útil o artigo, mas ele tem problemas, se possível peço que o reveja, deu erro em 3 partes do códigos, com 3 parâmetros, são eles: uCallbackMessage := WM_ICONTRAY; procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; case Msg.1Param of As partes que não foram identificadas pelo delphi estão em negrito.. Não foi identificada a função WM_ICONTRAY, e o número 1 antes de Param.! Peço que seja revisto esta parte do código, pois sem isso ele perdeu toda sua validade! :) Abrigado, abraços


por: luis.tec : Mai 24, 2004 - 08:35
(Informações sobre o membro | Enviar uma mensagem)
adaptei essas rotinas no meu programa e funcionou certinho. Falta mostra como abrir um menu qundo clicar com botão direito.
valeu


por: wwwww : Out 04, 2004 - 11:53
(Informações sobre o membro | Enviar uma mensagem) http://http://
Comigo deu erro na seguinte parte:
Shell_NotifyIcon(NIM_ADD,0TrayIconData;

se alguem puder me mandar o Codigo pronto em TXT ou me dizer pq deu erro ai eu ficaria muito grato pois pra mim isto sera muito util...

meu e-mail é wwwwwilton@yahoo.com.br


por: FaBiTo : Dez 03, 2004 - 01:58
(Informações sobre o membro | Enviar uma mensagem) http://
Aew deu um erro no meu tb! Foi no WM_ICONTRAY na hora que fui declarar a procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY. Ele não reconhece esse negocio aí! Será que é por causa da versão do meu windows que é o XP? Por favor alguém tira essa minha dúvida, se quizerem me responder meu email é fabioponzo@yahoo.com.br. Obrigado!


por: nivaldin : Dez 28, 2004 - 02:20
(Informações sobre o membro | Enviar uma mensagem) http://
Ola amigo o seu codigo aki funcionou perfeitamente... mas gostaria de saber como faço pra colocar um menu qndo eu clikar com o botao direito no icone!! Agradecido Nivaldo


por: nivaldin : Abr 07, 2005 - 11:01
(Informações sobre o membro | Enviar uma mensagem) http://
Ae, como faço pra minha aplicaçao ao iniciar ir direto pro tray... mande e-mail plis!! Urgente


por: marcosgildavid : Jul 27, 2005 - 08:47
(Informações sobre o membro | Enviar uma mensagem)
Para colocarem um menu quando clicam com o botão direito insiram um Tpopmenu na form principal (popmenu1, por exemplo).


No procedimento TrayMessage coloquem este código dentro do case of (substituam o que aparece no artigo):

WM_RBUTTONDOWN:
begin PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
end;


por: pedro_oliveto : Jan 02, 2006 - 06:58
(Informações sobre o membro | Enviar uma mensagem)
po cara..show show msm....agora ta facil....o mais difícl tu ensinou...eu ja botei o meu legalzinho, do geito q eu keria...brigadão ae!!!


por: leuzyn : Jul 22, 2006 - 12:47
(Informações sobre o membro | Enviar uma mensagem)


Cara deu certo, mais assim, coloquei o PopupMenu, mais quando clico com o botão esquerdo, o popupmenu ainda fica visivel, tem geito de vocês me explicarem como fasso para tirar o Menu quando clico no icone com botao esquerdo
Mande-me email, ou responda no forum, sou membro : Leuzyn

Obrigado


por: vicente386 (vicente386@gmail.com) : Mai 19, 2009 - 05:31
(Informações sobre o membro | Enviar uma mensagem)
o codigo correto seria o seguinte logo no inicio do cabeçalho do programa abaixo da uses vem a constante
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, UrlMon, ShellApi, Activex, ComCtrls, StdCtrls, Gauges, Clipbrd;
const WM_ICONTRAY = WM_USER + 1;

no public fica assim
public
{ Public declarations }
procedure TrayMessage(var Msg: TMessage);
message WM_ICONTRAY;

i no final na procedure TrayMessage fica assim
procedure TFrPrincipal.TrayMessage(var Msg: TMessage);
begin
case Msg.lParam of
WM_LBUTTONDOWN:
begin
ShowMessage('Esconder Programa ');
FrPrincipal.Show;
end;
WM_RBUTTONDOWN:
begin
ShowMessage('Exibir Programa ');
FrPrincipal.Hide;
end;
end;
end;

fazendo deste geito vai funcionar tudo certin e para os demais erros é questão de olhar certim o codigo vlw até +
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados