Plassere Delphi-applikasjoner i systemstatusfeltet

Forretningskvinne jobber med prosjekt på datamaskin

Thomas Barwick/Stone/Getty Images





Ta en titt på oppgavelinjen. Ser du området der klokken er plassert? Er det andre ikoner der? Stedet kalles Windows System Tray. Ønsker du å plassere din Delphi programmets ikon der? Vil du at ikonet skal være animert - eller gjenspeile tilstanden til applikasjonen din?

Dette vil være nyttig for programmer som kjører i lange perioder uten brukerinteraksjon (bakgrunnsoppgaver du vanligvis kjører på PC-en hele dagen lang).



Det du kan gjøre er å få Delphi-applikasjonene til å se ut som om de minimeres til skuffen (i stedet for til oppgavelinjen, rett til Vinn Start-knappen) ved å plassere et ikon i skuffen og samtidig gjøre skjemaet(e) usynlige. .

La oss brette det

Heldigvis er det ganske enkelt å lage et program som kjører i systemstatusfeltet - bare én (API) funksjon, Shell_NotifyIcon, er nødvendig for å utføre oppgaven.



Funksjonen er definert i ShellAPI-enhet og krever to parametere. Den første er et flagg som indikerer om ikonet legges til, endres eller fjernes, og det andre er en peker til en TNotifyIconData-struktur som inneholder informasjonen om ikonet. Dette inkluderer håndtaket til ikonet som skal vises, teksten som skal vises som et verktøytips når musen er over ikonet, håndtaket til vinduet som vil motta meldingene til ikonet og meldingstypen ikonet vil sende til dette vinduet .

Først, i hovedskjemaets private seksjon, sett inn linjen:
TrayIconData: TNotifyIconData;

|_+_|

Deretter i hovedskjemaet dittOnCreate-metoden, initialiser TrayIconData-datastrukturen og kall opp Shell_NotifyIcon-funksjonen:

|_+_|

Wnd-parameteren til TrayIconData-strukturen peker til vinduet som mottar varslingsmeldinger knyttet til et ikon.



hIcon peker på ikonet vi ønsker å legge til i skuffen - i dette tilfellet brukes hovedikonet for applikasjoner.
szTip inneholder verktøytipsteksten som skal vises for ikonet - i vårt tilfelle tittelen på applikasjonen. szTip kan inneholde opptil 64 tegn.
Parameteren uFlags er satt til å fortelle ikonet å behandle applikasjonsmeldinger, bruk applikasjonens ikon og dens tips. De uCallbackMessage peker på den programdefinerte meldingsidentifikatoren. Systemet bruker den angitte identifikatoren for varslingsmeldinger som det sender til vinduet identifisert av Wnd når en musehendelse inntreffer i det avgrensende rektangelet til ikonet. Denne parameteren er satt til WM_ICONTRAY konstant definert i grensesnittdelen av skjemaenheten og er lik: WM_USER + 1;

Du legger til ikonet i skuffen ved å kalle opp Shell_NotifyIcon API-funksjonen. Den første parameteren 'NIM_ADD' legger til et ikon i skuffområdet. De to andre mulige verdiene, NIM_DELETE og NIM_MODIFY brukes til å slette eller endre et ikon i skuffen - vi ser hvordan senere i denne artikkelen. Den andre parameteren vi sender til Shell_NotifyIcon er den initialiserte TrayIconData-strukturen.



Ta en

Hvis du KJØRER prosjektet ditt nå, vil du se et ikon nær klokken i skuffen. Legg merke til tre ting.

1) For det første skjer det ingenting når du klikker (eller gjør noe annet med musen) på ikonet som er plassert i skuffen - vi har ikke laget en prosedyre (meldingsbehandler) ennå.
2) For det andre er det en knapp på oppgavelinjen (vi vil åpenbart ikke ha den der).
3) For det tredje, når du lukker programmet, forblir ikonet i skuffen.



Ta to

La oss løse dette baklengs. For å få fjernet ikonet fra skuffen når du avslutter programmet, må du ringe Shell_NotifyIcon igjen, men med NIM_DELETE som den første parameteren. Du gjør dette i OnDestroyhendelsesbehandlerfor hovedskjemaet.

|_+_|

For å skjule applikasjonen (applikasjonens knapp) fra oppgavelinjen bruker vi et enkelt triks. I prosjektkildekoden legger du til følgende linje: Application.ShowMainForm := False; før Application.CreateForm(TMainForm, MainForm); La det for eksempel se slik ut:



|_+_|

Og til slutt, for å få vårt skuffikon til å svare på musehendelser, må vi opprette en meldingshåndteringsprosedyre. Først erklærer vi en meldingshåndteringsprosedyre i den offentlige delen av skjemaerklæringen: prosedyre TrayMessage(var Msg: TMessage); melding WM_ICONTRAY; For det andre ser definisjonen av denne prosedyren slik ut:

|_+_|

Denne prosedyren er utformet for å håndtere bare meldingen vår, WM_ICONTRAY. Den tar LParam-verdien fra meldingsstrukturen som kan gi oss tilstanden til musen ved aktivering av prosedyren. For enkelhets skyld håndterer vi kun venstre mus ned (WM_LBUTTONDOWN) og høyre mus ned (WM_RBUTTONDOWN). Når venstre museknapp er nede på ikonet viser vi hovedskjemaet, når høyre knapp trykkes skjuler vi det. Selvfølgelig er det andre musemeldinger du kan håndtere i prosedyren, som, knapp opp, dobbeltklikk på knapp osv.

Det er det. Fort og lett. Deretter vil du se hvordan du animerer ikonet i skuffen og hvordan du får det ikonet til å gjenspeile applikasjonens tilstand. Enda mer, du vil se hvordan du viser en popup-meny nær ikonet.