Ir para conteúdo
Fórum Script Brasil
  • 0

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


gsguma

Pergunta

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...

Editado por gsguma
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 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

Editado por aprobato
resolvido
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...