Systemfack Delphi-applikation

Ta en titt på din Aktivitetsfält. Se området där tiden är belägen? Finns det några andra ikoner där? Platsen kallas Windows systemfack. Vill du placera din Delphi applikationens ikon där? Vill du att den ikonen ska animeras - eller återspegla statusen för din applikation?

Detta skulle vara användbart för program som lämnas igång under långa perioder utan användarinteraktion (bakgrundsuppgifter som du vanligtvis fortsätter att köra på din PC hela dagen).

Vad du kan göra är att få dina Delphi-applikationer att se ut som om de minimerar till facket (istället för till Aktivitetsfältet, höger till Win Start-knappen) genom att placera en ikon i facket och samtidigt göra din form (er) osynlig.

Låt oss bricka det

Lyckligtvis är det ganska enkelt att skapa ett program som körs i systemfältet - bara en (API) -funktion, Shell_NotifyIcon, behövs för att utföra uppgiften.

Funktionen definieras i ShellAPI-enhet och kräver två parametrar. Den första är en flagga som indikerar om ikonen läggs till, ändras eller tas bort, och den andra är en pekare till en TNotifyIconData-struktur som innehåller informationen om ikonen. Det inkluderar handtaget på ikonen som ska visas, texten som ska visas som verktygstips när musen är över ikonen, handtag i fönstret som tar emot meddelandena på ikonen och meddelandetypen ikonen skickar till detta fönster.

instagram viewer

Först, i din huvudforms privata avsnitt sätter du raden:
TrayIconData: TNotifyIconData;

typ
TMainForm = klass(TForm)
procedur FormCreate (avsändare: TObject);
privat
TrayIconData: TNotifyIconData;
{Privata deklarationer}offentlig{Offentliga förklaringar}slutet;

Sedan i din huvudform onCreate initiera TrayIconData-datastrukturen och anropa funktionen Shell_NotifyIcon:

med TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Hantera;
uID: = 0;
uFlaggar: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Applikation. Ikon. Hantera;
StrPCopy (szTip, Application. Titel);
slutet;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);

Wnd-parametern i TrayIconData-strukturen pekar på fönstret som får meddelanden som är associerade med en ikon.

HIcon pekar på ikonen som vi vill lägga till i facket - i detta fall används huvudikonen för applikationer.
SzTip innehåller verktygstipstexten som ska visas för ikonen - i vårt fall applikationens titel. SzTip kan innehålla upp till 64 tecken.
Parametern uFlags är inställd på att berätta för ikonen att behandla applikationsmeddelanden, använda programikonen och dess tips. De uCallbackMessage pekar på den applikationsdefinierade meddelanden identifieraren. Systemet använder den angivna identifieraren för meddelanden som det skickar till fönstret som identifieras av Wnd när en mushändelse inträffar i ikonens avgränsande rektangel. Denna parameter är inställd på WM_ICONTRAY-konstant definierad i gränssnittssektionen för formulärenheten och är lika med: WM_USER + 1;

Du lägger till ikonen i magasinet genom att ringa API-funktionen Shell_NotifyIcon. Den första parametern "NIM_ADD" lägger till en ikon i fackområdet. De andra två möjliga värdena, NIM_DELETE och NIM_MODIFY används för att radera eller ändra en ikon i facket - vi får se hur senare i den här artikeln. Den andra parametern som vi skickar till Shell_NotifyIcon är den initialiserade TrayIconData-strukturen.

Ta en

Om du KÖR ditt projekt nu ser du en ikon nära klockan i facket. Notera tre saker.

1) Först händer ingenting när du klickar på (eller gör något annat med musen) på ikonen som finns i facket - vi har ännu inte skapat en procedur (meddelandeshanterare).
2) För det andra finns det en knapp i Aktivitetsfältet (vi vill uppenbarligen inte ha det där).
3) För det tredje, när du stänger din ansökan, förblir ikonen i facket.

Ta två

Låt oss lösa detta bakåt. För att få ikonen bort från magasinet när du lämnar programmet måste du ringa Shell_NotifyIcon igen, men med NIM_DELETE som den första parametern. Du gör detta i OnDestroy händelsehanterare för huvudformuläret.

procedur TMainForm. FormDestroy (avsändare: TObject);
Börja
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
slutet;

För att dölja applikationen (programmets knapp) från Aktivitetsfältet använder vi ett enkelt trick. Lägg till följande rad i projektkällkoden: Applikation. ShowMainForm: = Falsk; före ansökan. CreateForm (TMainForm, MainForm); Till exempel, låt det se ut:

...
Börja
Ansökan. initialisera;
Ansökan. ShowMainForm: = Falsk;
Ansökan. CreateForm (TMainForm, MainForm);
Ansökan. Springa;
slutet.

Och slutligen, för att vår fackikon ska svara på mushändelser, måste vi skapa en procedur för hantering av meddelanden. Först förklarar vi ett meddelandehanteringsförfarande i den offentliga delen av formulärdeklarationen: procedur TrayMessage (var Msg: TMessage); meddelande WM_ICONTRAY; För det andra ser definitionen av denna procedur ut:

procedur TMainForm. TrayMessage (var Msg: TMessage);
begincase Msg.lParam av
WM_LBUTTONDOWN:
Börja
ShowMessage ('Vänster-knappen klickade på'
- låt oss visa formen! ');
MainForm. Visa;
slutet;
WM_RBUTTONDOWN:
Börja
ShowMessage ('Högerknappen klickade på)
- låt oss gömma formen! ');
MainForm. Dölj;
slutet;
slutet;
slutet;

Den här proceduren är utformad för att endast hantera vårt meddelande, WM_ICONTRAY. Det tar LParam-värdet från meddelandestrukturen som kan ge oss musens tillstånd när proceduren aktiveras. För enkelhetens skull hanterar vi bara vänster mus ner (WM_LBUTTONDOWN) och höger mus ned (WM_RBUTTONDOWN). När vänster musknapp är nere på ikonen visar vi huvudformen, när höger knapp trycks in döljer vi den. Naturligtvis finns det andra musinmatningsmeddelanden du kan hantera i proceduren, som, knapp upp, knapp dubbelklick etc.

Det är allt. Snabbt och lätt. Därefter ser du hur du animerar ikonen i magasinet och hur den ikonen ska spegla statusen för din applikation. Ännu mer ser du hur du visar en popup-meny nära ikonen.