SysTrayIcon

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (2)  (0)

 

Olá Clube Delphi,

Por muito tempo compro a revista e participo do fórum de vocês e por muitas vezes vocês me ajudaram em dúvidas que tinha, por isso, vendo que muitas pessoas no fórum possuem essa dúvida resolvi esclarecer um pouco a dúvida sobre SysyTrayIcon. Para isso criei uma unit nova com Form e apenas um botão no form onde ao clicar neste botão a aplicação ficará ao lado do relógio do Windows e se esconderá da barra de tarefas e ao der um Duplo Clique no ícone ao lado do relógio do windows a aplicação se reestruturará . Abaixo irei demonstrar o código fonte da Unit e logo após irei explicar alguns itens importantes para esta definição:

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ShellApi;

 

const WM_TrayIcon = WM_User + 1;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  private

    Procedure WMTrayIcon( VAR MSG : TMessage );

    Message WM_TrayIcon;

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure Func_SysTrayIcon(const Kfuncao: string);

var

  Icone : TNotifyIconData;

begin

 

Icone.Hicon:= Application.Icon.Handle;

Icone.CBSize:= SIZEOF( TNotifyIconData );

Icone.WND:= Form1.Handle;

Icone.UID:= 0;

Icone.UCallBackMessage:= WM_TrayIcon;

Icone.UFlags:= NIF_Icon OR NIF_Tip OR NIF_Message;

Icone.SZTip:= 'Tool Tip da Aplicação ao lado do relógio' ;

 

If Kfuncao = 'ADD' Then

  SHELL_NOTIFYICON( NIM_ADD , @Icone )

Else If Kfuncao = 'DELETE' Then

  SHELL_NOTIFYICON( NIM_DELETE , @Icone );

 

end;

 

Procedure TForm1.Button1Click(Sender: TObject);

begin 

Func_SysTrayIcon( 'ADD' );

Application.ShowMainForm:= False;

Form1.Hide; 

end;

 

Procedure TForm1.WMTrayIcon( Var MSG : TMessage );

Begin

IF MSG.Lparam = WM_LButtonDBLCLK THEN

Begin

  Func_SysTrayIcon( 'DELETE' );

  Form1.Show;

end;

end;

 

Inicialmente vemos que para fazer esta definição temos que declarar no uses a ShellApi. Logo abaixo temos a declaração de uma const com o nome de WM_TrayIcon onde ela armazena no windows um lugar para receber mensagens dele. No Private do Form vimos a procedure WMTrayIcon declarada, ela é a responsável por receber do Windows a mensagem de que foi acionado o ícone ao lado do relógio.

A Função Func_SysTrayIcon( Const Kfuncao : String ) ela recebe na sua Const Kfuncao a opção de incluir o ícone ao lado do relógio ou de excluir. Esta função tem uma variavel chamda de Icone que recebe todas as informações para o ícone que as principais são :

 

HICON : Identifica o Handle do ícone que se deseja colocar ao lado do relógio que no exemplo utilizamos o ícone da aplicação;

CBSize : ela armazena o tamanho de uma estrutura TNotifyIconData;

WND : Indica o Handle da Janela que irá receber as mensagens enviadas pelo windows;

UCallBackMessage : Indica o lugar que foi armazenado para receber mensagens do Windows;

UFlags : Identifica as opções que se deseja para aparecerem ao lado do relógio que são :

NIF_Icon : O ícone;

NIF_Tip : O Texto de Tool Tip;

NIF_Message : Se ele aceitará mensagens;

SZTip : Texto de Tool Tip que aparecerá ao se posicionar o mouse sobre o ícone;

 

A chamada para inclusão do ícone ao lado do relógio é passada o parâmetro NIM_ADD e para exclusão NIM_DELETE e a váriavel Icone.

Na função Click do Botão é chamada a procedure Func_SysTrayIcon para ser incluído o ícone e tira a aplicação da barra de tarefas e após isto esconde o form.

E Finalmente na Função WMTrayIcon que é a responsável por receber as mensagens do windows, identifica se a mensagem enviada significa um Duplo Click com o Botão esquerdo do Mouse para então excluir o ícone e aparecer o Form.

Espero que com essa Dica possa ajudar muitos programadores que buscam componentes para executar esta função, que quando entendida se torna mais viavel que a utilização de componentes terceiros.

Muito Obrigado a Todos

 

Euclides Moraes (eeuclides@ig.com.br)

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ficou com alguma dúvida?