Oto kod. Aha, dodaj do listy modułów słowo "ShellAPI".

1. Do sekcji private dodaj takie pozycje:
 
IconNotifyData: TNotifyIconData;
procedure WndProc(var Msg: TMessage); override;
 


2. Teraz w OnCreate wpisz taki oto kod:
 
  with IconNotifyData do 
  begin
    hIcon := Application.Icon.Handle;
    uCallbackMessage := WM_USER + 1;
    cbSize := SizeOf(IconNotifyData);
    Wnd := Handle;
    uID := 100;
    uFlags := NIF_MESSAGE + NIF_ICON+NIF_TIP;
  end;
  // Kopiujemy tytuł aplikacji jako "dymek"
  StrPCopy(IconNotifyData.szTip, Application.Title);
 
  // Dodajemy ikonę do traya
  Shell_NotifyIcon(NIM_ADD, @IconNotifyData);
 


Następnie uzupełnij procedurę "WndProc" w taki oto sposób:
 
procedure TMainFrm.WndProc(var Msg: TMessage);
var
  p: TPoint;
begin
{
Ta procedura służy do przechwytywania komunikatów po naciśnięciu przycisku w obrębie ikony.
}
//Jezeli nacisnieto prawym przyciskiem myszy
  if (Msg.Msg=WM_USER+1) and (Msg.lParam = WM_RBUTTONDOWN) then
  begin
//Nastepuje pobranie pozycji kursora myszki
    GetCursorPos(p);
//i wyswietlenie menu 
    TrayMenu.Popup(p.x, p.y);
  end;
//Jezeli nacisnieto lewy przycisk nastepuje wyswietlenie //formy
  if Msg.LParam = WM_LBUTTONDOWN then
    MainFrm.Show;
 
  inherited;
end;
 


Dodatkowo przy zamykaniu programu możesz dopisać linie:
 
Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);
 

Usuwa ona ikonę z Tray'a.

Zobacz też:



Kategoria: Delphi » FAQ

9 komentarzy

Brak avatara
Napisany 2006-11-26 09:51 przez tomalla

"Prościej jest użyć komponentu: CoolTrayIcon ;> "
Mi to nie działa ten komponent, gdy rozpakowuje package, wyświetla mi komunikat: "Cannot find resource file: <>. Recreated." OCO TU CHODZI?!?!?!?
Próbowałem znaleźć ten plik w internecie :/, ale ... znalazłem :? Dodałem to tego wszystkiego, wszystko OK, nie wyświetla komunikatu, ale nie moge kliknąć przycisku INSTALL, zablokowany.

POMOCY

Avatar: Rene
Napisany 2006-07-21 11:50 przez Rene

w OnClose formy

Action := caNone;
Application.ShowMainForm := False;
ShowWindow(Handle, SW_HIDE);

albo z CoolTrayIcon:
Action := caNone;
CoolTrayIcon1.HideMainForm;

Brak avatara
Napisany 2006-05-27 23:25 przez physikus

A jak zrobic aby po nacisniciu na krzyżyk(zamknij) program sie zamknoł a ikona w trayu była i jak na nią nacisne to mi sie włączy forma?

Brak avatara
Napisany 2004-07-17 20:02 przez dawidmo

Wpisz przed GetCursorPos(p);
SetForegroundWindow(Handle) mi działa

Brak avatara
Napisany 2004-06-01 01:02 przez blackrage

Nie wiem jak pod innymi winami, ale mi pod XP i ten kod i CoolTrayIcon działają źle. W momencie kiedy wyskoczy PopupMenu po kliknieciu na ikonce w Trayu, to znika tylko jeśli kliknę na formę, lub wybiorę pozycję z tego PopupMenu.
W innych aplikacjach, "fabrycznych", po kliknięciu na pulpit, czy gdziekolwiek ten Popup znika.
Wie ktoś jak to zrobić?

Avatar: Wolverine
Napisany 2004-03-06 11:55 przez Wolverine

a co tu moze nie dzialac?

Brak avatara
Napisany 2003-09-07 20:55 przez Ja_ekspert

mi ten kod nie dziala, to z kad moge wziasc ten CoolTrayIcon

Brak avatara
Napisany 2003-06-17 22:32 przez starsin

znacznie prosciej i ladniej ;)

Avatar: Japcok
Napisany 2003-05-24 23:07 przez Japcok

Prościej jest użyć komponentu: CoolTrayIcon ;>

4programmers.net