|
Usuários |
|
114 Usuários Online
|
|
[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)
32 Comentários Enviar para um amigo Versão para impressão
|
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 pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
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: 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: dsbnews : Out 02, 2004 - 11:13 (Informações sobre o membro | Enviar uma mensagem) | Troque todo o corpo da procedure seguinte por este.
procedure TMainForm.TrayMessage (var Msg: TMessage);
var
Pt: TPoint;
begin
Case Msg.lParam of
wm_rbuttondown:
begin
GetCursorPos (Pt);
PopupMenu1.Popup (Pt.x, Pt.y);
end;
end;
end;
Não esqueça de incluir um Popup menu no seu Form.
abraços, até a proxima. | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
por: ekavfrança (elidiakav@hotmail.com) : Nov 04, 2008 - 05:09 (Informações sobre o membro | Enviar uma mensagem) | coloque um popupmenu no seu formulario e pois os itens e colocar as sua opções
,clique no form va na aba properties e ache a opçâo popupmenu e ache o que voçê colocou | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
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: Astorga : Dez 04, 2004 - 11:20 (Informações sobre o membro | Enviar uma mensagem) | const
WM_ICONTRAY = WM_USER + 1;
--------------------------------------------------------------------------------
antes da declaração de classe do formulário, ou seja, antes da palavra type, pois a classe irá usar esta constante em seu procedure.
quem respondeu isso foi um tar de flip. flop uns tres comentarios acima do seu, espero nao parecer aspero, mas eu tambem nao costumo ler os faqs, mas d vez em quando e baum. | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
por: LINDOMIX : Jan 12, 2007 - 01:05 (Informações sobre o membro | Enviar uma mensagem) | Seguinte Para usar :
public
{ Public declarations }
procedure TrayMessage(var Msg: TMessage);message WM_ICONTRAY;
end;
Você deve primeiro adicionar na clausula Uses o cabeçalho : AppEvnts
Ok... | [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
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: 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;
|
[ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
por: leuzyn : Jul 23, 2006 - 04:14 (Informações sobre o membro | Enviar uma mensagem) | Coloque este codigo para os dois botoes do mouse..
Procedure TPrinc.TrayMessage(var Msg: TMessage);
var
Pt: TPoint;
begin
If Msg.LParam = wm_RButtonDown then
begin
GetCursorPos(Pt);
SetForegroundWindow (Handle);
PopupMenu1.Popup (Pt.x, Pt.y);
end
else
if Msg.LParam = wm_LButtonDown then
begin
GetCursorPos(Pt);
SetForegroundWindow(Handle);
PostMessage(Handle, WM_NULL, 0, 0);
end;
End;
| [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
por: leuzyn : Jul 23, 2006 - 04:18 (Informações sobre o membro | Enviar uma mensagem) | Coloque este codigo para os dois botoes do mouse..
Procedure TPrinc.TrayMessage(var Msg: TMessage);
var
Pt: TPoint;
begin
If Msg.LParam = wm_RButtonDown then
begin
GetCursorPos(Pt);
SetForegroundWindow (Handle);
PopupMenu1.Popup (Pt.x, Pt.y);
end
else
if Msg.LParam = wm_LButtonDown then
begin
GetCursorPos(Pt);
SetForegroundWindow(Handle);
PostMessage(Handle, WM_NULL, 0, 0);
end;
End;
| [ Comentários não permitidos para usuários anônimos. Por gentileza, registre-se ou conecte-se ao sistema
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 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|