Programowanie w języku Delphi » FAQ

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

  • 2007-07-05 19:59
  • 9 komentarzy
  • 1496 odsłon
  • Oceń ten tekst jako pierwszy
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ż:

9 komentarzy

tomalla 2006-11-26 09:51

"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

Rene 2006-07-21 11:50

w OnClose formy

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

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

physikus 2006-05-27 23:25

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?

dawidmo 2004-07-17 20:02

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

blackrage 2004-06-01 01:02

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

Wolverine 2004-03-06 11:55

a co tu moze nie dzialac?

Ja_ekspert 2003-09-07 20:55

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

starsin 2003-06-17 22:32

znacznie prosciej i ladniej ;)

Japcok 2003-05-24 23:07

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