Jump to content
Fórum Script Brasil
  • 0

Icone No Tray Ao Lado Do Relógio (delphi)


gsguma

Question

Como faço para iniciar o programa aberto e com o icone na tray!

Com os passos abaixo consigo iniciar minimizado apenas!

Alguém pode analisar e me dar uma dica?

1º Passo

Na clausula Uses declare a Unit ShellApi

Exemplo:

uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, Registry, ShellApi;
2º Passo Abaixo da cláusula Uses, declarea constante const WM_TRAYICON=WM_USER+1; Exemplo:
uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, Registry, ShellApi;

      const WM_TRAYICON=WM_USER+1;
3º Passo Na cláusula Private, digite as procedures a seguir:
...
      private
      { Private declarations }
      { Tratamento dos Ícones da Aplicação }
      procedure WMSysCommand(var Msg: TWMSysCommand); Message WM_SysCommand;
      procedure WMTrayIcon(var Msg: TMessage); Message WM_TRAYICON;
      procedure DestroyIcone;
      procedure CriaIcone;
      public
      { Public declarations }
      end;
4º Passo Digite a implementação a seguir para cada procedure. {Quando for necessário criar ou destruir nosso ícone, chamaremos as procedures CriaIcone e DestroyIcone respectivamente. A API Shel_NotifyIcon requer um ponteiro para uma variável do tipo TNotifyIconData, declarada na Unit ShellApi.
procedure TForm1.CriaIcone;
  var
    NotifyIconData: TNotifyIconData;
  begin
    with NotifyIconData do
    begin
      cbSize:= SizeOf(TNotifyIconData);
      Wnd:= Self.Handle;
      uID:= 0;
      uCallbackMessage:= WM_TRAYICON;
      uFlags:= NIF_ICON or NIF_TIP or NIF_MESSAGE;
      hIcon:= Application.Icon.Handle;
      szTip:= 'Exemplo da utilização do TrayIcon by janbaceiredo';
    end;
    Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
    Application.ShowMainForm:= False;
  end;

  procedure TForm1.DestroyIcone;
  var
    NotifyIconData: TNotifyIconData;
  begin
    NotifyIconData.cbSize:= SizeOf(TNotifyIconData);
    NotifyIconData.Wnd:= Self.Handle;
    NotifyIconData.uID:= 0;
    NotifyIconData.uFlags:= 0;
    Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
  end;

      {Captura todas as mensagens enviadas para a aplicação.
      Neste caso, trabalhamos apenas com as mensagens SC_MINIMIZE e SC_MAXIMIZE, que são enviadas quando devemos Minimizar ou Maximizar o formulario da aplicação. Capturando estas mensagens para esconder o ícone da aplicação da Barra de Tarefas do Windows e para criar / destruir o ícone que ficará ao lado do relógio.

      Obs: Você pode trabalhar com outras mensagem também. Tipo SC_CLOSE, SC_RESTORE e etc.}
  procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
  begin
    case (Msg.CmdType) of
      SC_MINIMIZE:
      begin
        Self.Visible:= False;
        CriaIcone;
      end;
      SC_MAXIMIZE:
      begin
        Self.Visible:= True;
      end
      else
        Inherited
    end;
  end;

      {Quando dar um duplo clique sobre o ícone da aplicação, destrímos este mesmo ícone e exibimos o formulário principal. Isto só funciona se implementarmos um manipulador para as Mensagens WMTrayIcon, que é o que faremos abaixo.

      Lembra-se da constante declarada no ínicio de nossa Unit?
      Pois bem, ela é passada como parâmetro para esta procedure.}
  procedure TForm1.WMTrayIcon(var Msg: TMessage);
  var
    Pt: TPoint;
  begin
    if (Msg.LParam = WM_RBUTTONDOWN) then
    begin
      GetCursorPos(Pt);
      PopupMenu.Popup(Pt.X, Pt.Y);
      PopupMenu.AutoPopup:= False;
    end
    else
      if (Msg.LParam = WM_LBUTTONDBLCLK) then
      begin
        Self.Visible:= True;
        DestroyIcone;
      end;
  end;
5º Passo Adicione um componente PopupMenu na Guia Additional e altere seu nome para PopupMenu Nesse componente(PopupMenu) você vai adiconar as opções que devem aparecer quando o usuario clicar com o botão direito do mouse sobre o icone da sua aplicação que esta ao lado do relógio. Exemplo: Sair, Configurações, Opções, Maximixar e etc.... Citação: Caso você não coloque o componente PopupMenu no seu formulario, isso irá gerar um erro de acesso a memória quando você clicar com o botão direito do mouse sobre o icone da sua aplicação que ficará do lado do relógio do computador. Sendo assim, não se esqueça de colocar esse componente(PopupMenu). 6º Passo A ultima etapa para realizar a sua necessidade é fazer o programa ser inicializado junto com o Windows. Para realizar essa etapa você tem que declarar a unit Registry na cláusula Uses Exemplo:
uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, Registry, ShellApi, Registry;
7º Passo Após isso, você deve digitar o código abaixo no Evento OnCreate
procedure TForm1.FormCreate(Sender: TObject);
  var
    Reg: TRegistry;
  begin
    CriaIcone;
    try

      // Inicializa a variavel do tipo TRegistry
      Reg:= TRegistry.Create;

      // Define a hirearquia das pasta, a qual irá trabalhar.
      Reg.RootKey:= HKEY_LOCAL_MACHINE;

      // Cria/entra, dentro da pasta do registro no qual irá aguardar informação
      Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False);

      // Escreve a informção na chave
      // NomeDaChave, pode ser qualquer nome que você queira
      Reg.WriteString('NomeDaChave', Application.ExeName);

      // Fecha a chave do registro
      Reg.CloseKey;
    Finally
      Reg.Free;
    end;
  end;

Se alguém puder ajudar e para quem quiser testar, o código funciona perfeitamente, sem usar adicionais como TTrayIcon e outros...

Edited by gsguma
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0
Em 06/10/2007 at 12:17, gsguma disse:

 

Obrigado Marcio, vou fazer isso!

eu fiz conforme citado acima e deu certo, porem não aparece a imagem do icone na bandeja, já tentei de todo jeito e não consegui, com eu faço

Edited by aprobato
resolvido
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...