Delphi FAQ

Jak dodać ikonę programu do Traya. ( ikonka obok zegara Windows )

Adam Boduch

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ż:

FAQ

9 komentarzy

"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: <ścieżka/plik.res>. 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

w OnClose formy

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

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

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?

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

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ć?

a co tu moze nie dzialac?

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

znacznie prosciej i ladniej ;)

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