Buscar

Shell_NotifyIcon e NOTIFYICONDATA

Código

Delphi: D7
SO: Windows XP Pro 32Bits
Nível: Básico - Intermediário
Descrição: Colocar ícone do aplicativo no system tray. utilizando Shell_NotifyIcon e NOTIFYICONDATA da unit ShellApi.
Componentes: -
Requisitos: Lógico de programação, mínimo de conhecimento em Delphi e entender um pouco sobre propriedades de objetos.

1- File -> New -> Application.

2- Adicione um componente TPopupMenu da aba Standard e um TApplicationEvents da aba Additional.
Criaremos um menu para o ícone e usaremos o evento OnMinimize.

3- Adicione em Uses, ShellApi.
Exemplo:
Código:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi, Menus, AppEvnts;

E logo abaixo uma constante:
Código:

Const
 WM_TRAY = WM_USER + 1;

A constante WM_TRAY será o nosso identificar de mensagens.
Sobre o WM_USER veja a definição do Msdn:

WM_USER Notification
The WM_USER constant is used by applications to help define private messages for use by private window classes, usually of the form WM_USER+X, where X is an integer value.

4- Vá até a seção Private da classe TForm1 e adicione:
Código:

Icone : TNotifyIconData;
procedure TrayMessage(var Msg: TMessage); message WM_TRAY;

A classe TNotifyIconData representa as informações necessárias para que o windows apresente o ícone, como por exemplo, qual ícone será exibido e com qual título.
Declaramos uma procedure que será a responsável pela exibição do PopupMenu. Repare no identificador de mensagens, é ele o responsável pela comunicação, já a variável Msg será responsável pelo reconhecimento de um clique por exemplo através do LParam.

5- Vá até o menu Project -> View Source e deixa da seguinte forma:
Código:

  Application.Initialize;
  Application.ShowMainForm := False;
  Application.CreateForm(TForm1, Form1);
  Application.Run;

Adicionamos a linha "Application.ShowMainForm := False;" para que ao executar o programa este não dê um show no Tform.

6- Volte para o TForm, e dê dois cliques sobre o evento OnCreate, adicione o seguinte:
Código:

procedure TForm1.FormCreate(Sender: TObject);
begin
 Icone.cbSize := SizeOf(Icone);
 Icone.Wnd := handle;
 icone.uID := 0;
 Icone.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
 icone.uCallbackMessage := WM_TRAY;
 icone.hIcon := Application.Icon.Handle;
 icone.szTip := 'Teste de Tray';
 Shell_NotifyIcon(NIM_ADD, @Icone);
end;

Inicialmente define-se as propriedades do Icone:
a) cbSize: representa o tamanho da estrutura, no nosso caso o objeto Icone. O comando SizeOf retorna o valor em bytes.
b) Wnd: É a janela do aplicativo. Handle é o indexador da janela, assim pode-se compreender como um identificar único para cada janela do windows.
c) uID: É o identificador do icone.
d) uFlags: São identificadores que indicam informações adicionais ao objeto consistem em:
d.1) NIF_MESSAGE: Dá validade ao uCallbackMessage.
d.2) NIF_ICON: Valida o icone.
d.3) NIF_TIP: Valida o texto do icone.
Sobre flags veja : NOTIFYICONDATA Structure
e) uCallbackMessage: Vou utilizar a descrição do Msdn que está fácil:

An application-defined message identifier. The system uses this identifier to send notification messages to the window identified in hWnd. These notification messages are sent when a mouse event or hover occurs in the bounding rectangle of the icon, when the icon is selected or activated with the keyboard, or when those actions occur in the balloon notification. (GRIFO MEU).

f) hIcon: Define qual será o nosso icone, no caso o do próprio aplicativo.
g) szTip: O título do ícone, que deve ter entre 64 e 128 caracteres. Consulte o msdn para mais informações, mas já adianto que é a partir do Windows 2000 em diante que aceita 128.
h) Shell_NotifyIcon: Esta função é reponsável pela instalação, desinstalação e alteração do icone.

Shell_NotifyIcon Function, possui dois parâmetros:
h.1) dwMessage: Que recebe um dos seguintes valores:
h1.1) NIM_ADD: Adicione o icone.
h1.2) NIM_DELETE: Deleta o icone do task.
h1.3) NIM_MODIFY: Obviamente, para modificar o icone.
Há outros valores, que podem ser encontrados no link acima.
h.2) lpdata: Recebe um ponteiro. Para utilizar ponteiros em Delphi utilize a referência @. Procure no Google sobre ponteiros pois este tutorial não explica a sua utilização.

7- Vá até o evento OnClose do Form, e adicione:
Código:

Shell_NotifyIcon(NIM_DELETE, @Icone);

Estamos deletando o icone ao fechar o programa.

8- Vá até o componente ApplicationEvents, selecione o evento OnMinimize, adicione:
Código:

ShowWindow(Application.Handle, SW_HIDE);

Com este code, estamos esconde o aplicativo da barra de tarefas.
ShowWindow Function

9- Clique duas vezes sobre o componente PopupMenu, e insira um item com o Caption Abrir. Dê dois clique sobre o item e adicione:
Código:

if not Application.Active then
 Application.Restore;
if WindowState = wsMinimized then
 WindowState := wsNormal;
if not Visible then
 Visible := True;

Código responsável por nos mostrar o Form novamente.

10- Introduza o codigo da nova procedure, (Dica: coloque o cursor no começo da linha procedure TrayMessage(var Msg: TMessage); message WM_TRAY; e prescione Ctrl+Shift+C, a procedure será criada automaticamente):
Código:

procedure TForm1.TrayMessage(var Msg: TMessage);
Var
 Mouse : TPoint;
begin
Case Msg.LParam of
 WM_LBUTTONDBLCLK:
    begin
      ShowMessage('Dois cliques na esquerda.');
    end;
 WM_RBUTTONDOWN:
    Begin
     GetCursorPos(Mouse);
     PopupMenu1.Popup(Mouse.X , Mouse.Y);
    End;
 WM_MBUTTONDOWN:
  Begin
  ShowMessage('Botao do meio');
  End;
End;
end;

Aqui verificamos qual botão do mouse foi utilizado e determinados uma ação.
Para outros LParam entre em Notifications.

Por fim, dê Ctrl + F9, verifique se não esqueceu de nada, e rode o aplicativo.

Referências:
http://msdn.microsoft.com/en-us/library/ms644931(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb773352(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb773352(VS.85).aspx
http://msdn.microsoft.com/en-us/library/bb762159(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms633548(VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd458632(VS.85).aspx

Abraço,
Júlio César Schincariol Filho

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Windows
Adicionada dia: 31/07/10
Por: Júlio César Schincariol Filho
Visualizada: 4543 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009