Systembakken Delphi-applikation

click fraud protection

Se på din proceslinje. Se det område, hvor tiden er placeret? Er der andre ikoner der? Stedet kaldes Windows System Bakke. Vil du placere din Delphi programmets ikon der? Vil du have, at ikonet skal animeres - eller afspejle din applikations tilstand?

Dette ville være nyttigt for programmer, der lader køre i lange perioder uden brugerinteraktion (baggrundsopgaver du typisk fortsætter med at køre på din pc hele dagen lang).

Hvad du kan gøre er at få dine Delphi-applikationer til at se ud som om de minimerer til bakken (i stedet for til Opgavelinje, højre til Win Start-knappen) ved at placere et ikon i bakken og samtidig oprette din form (er) usynlig.

Lad os bakke det

Heldigvis er det temmelig let at oprette et program, der kører i proceslinjen - kun en (API) -funktion, Shell_NotifyIcon, er nødvendig for at udføre opgaven.

Funktionen er defineret i ShellAPI-enhed og kræver to parametre. Den første er et flag, der angiver, om ikonet tilføjes, ændres eller fjernes, og det andet er en markør til en TNotifyIconData-struktur, der indeholder oplysningerne om ikonet. Det inkluderer håndtaget på det ikon, der skal vises, teksten, der skal vises som et værktøjstip, når musen er over ikonet, håndtag i vinduet, der vil modtage meddelelser på ikonet, og meddelelsestypen, ikonet sender til dette vindue.

instagram viewer

Først sætter du linjen i din hovedforms private afsnit:
TrayIconData: TNotifyIconData;

type
TMainForm = klasse(TForm)
procedure FormCreate (Afsender: TObject);
privat
TrayIconData: TNotifyIconData;
{Private erklæringer}offentlig{Offentlige erklæringer}ende;

Derefter i din hovedform onCreate initialiserer TrayIconData-datastrukturen og kalder funktionen Shell_NotifyIcon:

med TrayIconData dobegin
cbSize: = SizeOf (TrayIconData);
Wnd: = Håndtag;
uID: = 0;
uFlags: = NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage: = WM_ICONTRAY;
hIcon: = Anvendelse. Ikon. Håndtere;
StrPCopy (szTip, ansøgning. Titel);
ende;
Shell_NotifyIcon (NIM_ADD, @TrayIconData);

Wnd-parameteren i TrayIconData-strukturen peger på det vindue, der modtager underretningsmeddelelser tilknyttet et ikon.

HIcon'en peger på det ikon, vi vil tilføje til magasinet - i dette tilfælde bruges applikationshovedikonet.
SzTip har værktøjstip-teksten, der skal vises for ikonet - i vores tilfælde applikationens titel. SzTip kan indeholde op til 64 tegn.
Parameteren uFlags er indstillet til at fortælle ikonet at behandle applikationsmeddelelser, bruge programmets ikon og dets tip. Det uCallbackMessage peger på den applikationsdefinerede meddelelsesidentifikator. Systemet bruger den specificerede identifikator til underretningsmeddelelser, som det sender til det vindue, der er identificeret med Wnd, når der sker en musebegivenhed i ikonets afgrænsende rektangel. Denne parameter er indstillet til WM_ICONTRAY-konstant defineret i interface-sektionen af ​​formularenheden og er lig med: WM_USER + 1;

Du tilføjer ikonet til bakken ved at kalde Shell_NotifyIcon API-funktionen. Den første parameter "NIM_ADD" tilføjer et ikon til magasinområdet. De to andre mulige værdier, NIM_DELETE og NIM_MODIFY, bruges til at slette eller ændre et ikon i bakken - vi får se, hvordan senere i denne artikel. Den anden parameter, vi sender til Shell_NotifyIcon, er den initialiserede TrayIconData-struktur.

Tag en

Hvis du Kører dit projekt nu, ser du et ikon i nærheden af ​​uret i bakken. Bemærk tre ting.

1) Først sker der intet, når du klikker på (eller gør noget andet med musen) på ikonet, der er placeret i bakken - vi har endnu ikke oprettet en procedure (meddelelseshåndterer).
2) For det andet er der en knap på proceslinjen (vi ønsker tydeligvis ikke den der).
3) For det tredje, når du lukker din applikation, forbliver ikonet i bakken.

Tag to

Lad os løse dette baglæns. For at få ikonet fjernet fra bakken, når du afslutter applikationen, skal du ringe til Shell_NotifyIcon igen, men med NIM_DELETE som den første parameter. Det gør du i OnDestroy event handler til hovedformularen.

procedure TMainForm. FormDestroy (Afsender: TObject);
begynde
Shell_NotifyIcon (NIM_DELETE, @TrayIconData);
ende;

For at skjule applikationen (programmets knap) fra proceslinjen bruger vi et simpelt trick. Tilføj følgende linje i Projektets kildekode: Program. ShowMainForm: = Falsk; inden ansøgningen. CreateForm (TMainForm, MainForm); F.eks. Lade det se ud:

...
begynde
Ansøgning. Initialiser;
Ansøgning. ShowMainForm: = Falsk;
Ansøgning. CreateForm (TMainForm, MainForm);
Ansøgning. Løb;
ende.

Og til sidst, for at få vores magasin-ikon til at reagere på musebegivenheder, er vi nødt til at oprette en procedure til håndtering af meddelelser. Først erklærer vi en meddelelseshåndteringsprocedure i den offentlige del af formdeklarationen: procedure TrayMessage (var Msg: TMessage); besked WM_ICONTRAY; For det andet ser definitionen af ​​denne procedure således ud:

procedure TMainForm. TrayMessage (Var Msg: TMessage);
begincase Msg.lParam af
WM_LBUTTONDOWN:
begynde
ShowMessage ('Venstre knap blev klikket
- lad os vise formularen! ');
MainForm. At vise;
ende;
WM_RBUTTONDOWN:
begynde
ShowMessage ('Klik på højre knap
- lad os skjule formen! ');
MainForm. Skjule;
ende;
ende;
ende;

Denne procedure er beregnet til kun at håndtere vores meddelelse, WM_ICONTRAY. Det tager LParam-værdien fra meddelelsesstrukturen, som kan give os musens tilstand ved aktivering af proceduren. For enkelhedens skyld håndterer vi kun venstre mus nede (WM_LBUTTONDOWN) og højre mus nede (WM_RBUTTONDOWN). Når venstre museknap er nede på ikonet, viser vi hovedformen, når man trykker på den højre knap skjuler vi den. Der er selvfølgelig andre musinputmeddelelser, du kan håndtere i proceduren, f.eks., Knap op, knap dobbeltklik osv.

Det er det. Hurtigt og nemt. Derefter vil du se, hvordan du animerer ikonet i bakken, og hvordan du får dette ikon til at afspejle din applikations tilstand. Endnu mere kan du se, hvordan du viser en pop-up-menu nær ikonet.

instagram story viewer