Plasarea aplicațiilor Delphi în tava de sistem

Aruncați o privire la bara de activități. Vedeți zona în care se află ora? Există alte icoane acolo? Locul se numește Windows System Tray. Doriți să plasați pictograma aplicației dvs. Delphi acolo? Doriți ca această pictogramă să fie animată - sau să reflecte starea aplicației dvs.?

Acest lucru ar fi util pentru programele care rămân în funcțiune pentru perioade îndelungate de timp, fără interacțiuni cu utilizatorii (activități de fundal pe care de obicei le continuați să funcționați pe computer toată ziua).

Ce puteți face este să faceți ca aplicațiile dvs. Delphi să pară ca și cum ar reduce la tăvălă (în loc de bara de activități, chiar la butonul Win Start), așezând o pictogramă în tavă și simultan făcând ca formele dvs. să fie invizibile..

Hai să-l tăvălim

Din fericire, crearea unei aplicații care rulează în tava de sistem este destul de ușoară - o singură funcție (API), Shell_NotifyIcon, este necesară pentru a îndeplini sarcina.

Funcția este definită în unitatea ShellAPI și necesită doi parametri. Primul este un steag care indică dacă pictograma este adăugată, modificată sau eliminată, iar al doilea este un indicator către o structură TNotifyIconData care conține informațiile despre pictogramă. Aceasta include mânerul pictogramei de afișat, textul care va fi afișat ca un sfat de instrument atunci când mouse-ul este peste pictogramă, mânerul ferestrei care va primi mesajele pictogramei și tipul de mesaj pe care pictograma îl va trimite la această fereastră.

În primul rând, în secțiunea Privată a formularului principal, puneți linia:
TrayIconData: TNotifyIconData;

tip
TMainForm = clasă(TForm)
procedură FormCreate (Expeditor: TObject);
privat
TrayIconData: TNotifyIconData;
Declarații privatepublicDeclarații publiceSfârșit;

Apoi, în metoda OnCreate a formularului principal, inițializează structura de date TrayIconData și apelează funcția Shell_NotifyIcon:

cu TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = mâner;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Application.Icon.Handle;
StrPCopy (szTip, Application.Title);
Sfârșit;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);

Parametrul Wnd al structurii TrayIconData indică fereastra care primește mesaje de notificare asociate cu o pictogramă. 

HIcon indică pictograma pe care vrem să o adăugăm în tavă - în acest caz, este utilizată pictograma principală a aplicațiilor.
SzTip deține textul Tooltip pentru a fi afișat pentru pictogramă - în cazul nostru titlul aplicației. SzTip poate reține până la 64 de caractere.
Parametrul uFlags este setat să spună pictogramei să proceseze mesajele aplicației, să utilizeze pictograma aplicației și vârful acesteia. UCallbackMessage indică identificatorul de mesaj definit de aplicație. Sistemul folosește identificatorul specificat pentru mesajele de notificare pe care le trimite ferestrei identificate de Wnd de fiecare dată când se întâmplă un eveniment de mouse în dreptunghiul de delimitare al pictogramei. Acest parametru este setat la constanta WM_ICONTRAY definită în secțiunea de interfață a unității formulare și este egală cu: WM_USER + 1;

Adăugați pictograma în tavă apelând funcția API Shell_NotifyIcon. Primul parametru „NIM_ADD” adaugă o pictogramă în zona tăvii. Celelalte două valori posibile, NIM_DELETE și NIM_MODIFY sunt folosite pentru a șterge sau modifica o pictogramă din Tava - vom vedea cum va fi mai târziu în acest articol. Al doilea parametru pe care îl trimitem la Shell_NotifyIcon este structura inițializată TrayIconData.

Ia o

Dacă executați proiectul dvs. acum veți vedea o pictogramă lângă ceasul din tavă. Notează trei lucruri. 

1) În primul rând, nu se întâmplă nimic atunci când faceți clic pe (sau faceți altceva cu mouse-ul) pe pictograma plasată în Tava - nu am creat încă o procedură (manipulator de mesaje).
2) În al doilea rând, există un buton pe bara de activități (evident că nu vrem acest lucru acolo).
3) În al treilea rând, când închideți aplicația, pictograma rămâne în tavă.

Ia doua

Să rezolvăm acest lucru înapoi. Pentru a elimina pictograma din tavă când ieșiți din aplicație, trebuie să apelați din nou la Shell_NotifyIcon, dar cu NIM_DELETE ca prim parametru. Faceți acest lucru în gestionarea de evenimente OnDestroy pentru formularul principal.