A program helyes működéséhez elengedhetetlen, hogy a ballon megjelenítés engedélyezett legyen. Ehhez a Windows regisztrációs adatbázisában a HKEY_CURRENT_USER főkulcs alatt található \Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced címen kell lennie egy EnableBalloonTips bejegyzésnek, mely DWORD típusú és értéke 1. Ha ez nem így lenne, akkor változtassuk meg, majd a jelentkezzünk ki és újra be, mivel csak ekkor jut érvényre a módosításunk.
A megoldáshoz először is el kell érnünk, hogy alkalmazásunk ikonja megjelenjen ezen a helyen is a Windows tálcán. Ehhez csak annyit kell tennünk, hogy regisztráljuk alkalmazásunkat a Shell_NotifyIcon függvény hívásával. Ennek első paraméterében a NIM_ADD konstans az ikon hozzáadását fogja eredményezni, míg a második paraméterben megadott TExNotifyIconData struktúrában írhatjuk le a további tulajdonságokat.
procedure TForm1.FormCreate(Sender: TObject);
begin
FillChar(FIconData, SizeOf(TExNotifyIconData), 0);
FIconData.cbSize:=SizeOf(TExNotifyIconData);
Például a Wnd mezőben kell megadnunk egy ablakkezelő függvényt, mely képes üzenetek feldolgozására. Ehhez létre is hozunk egy újat az AllocateHWnd függvény hívásával, melynek paraméterként megadjuk a saját DoTrayIconMessage függvényünket.
FIconData.Wnd:=AllocateHWnd(DoTrayIconMessage);
Az uFlags-ban írjuk elő, hogy milyen funkciókkal kell rendelkeznie az ikonnak. Itt a NIF_INFO konstans fogja meghatározni, hogy használhatjuk a ballon funkciót.
FIconData.uFlags:=NIF_ICON+NIF_MESSAGE+NIF_INFO;
Az uCallbackMessage mezőben egy egyedi számot adunk meg, mellyel majd azonosítani tudjuk, hogy az érkező üzenet, melyik ikonunktól érkezik, mivel egy alkalmazás több ikont is elhelyezhetne ezen a területen.
FIconData.uCallbackMessage:=MESSAGECALLBACK;
A hIcon-ban egy Icon azonosítóját kell megadnunk, melynél most a saját alkalmazásunk ikonját használjuk fel, de létrehozhatnánk egy külön TIcon osztályt is egyedi ikonnal erre a célra.
FIconData.hIcon:=Application.Icon.Handle;
Shell_NotifyIcon(NIM_ADD, @FIconData);
Az alkalmazásunk indulása utána ShowBallon függvényünk meghívásával rögtön meg is jelenítünk egy üzenetet.
Amikor az alkalmazásunk futása befejeződik, akkor nem árt megszüntetni a létrehozott ablakkezelő függvényt, valamint eltüntetni az ikon a Windows tálcáról.
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(FIconData.Wnd);
Shell_NotifyIcon(NIM_DELETE, @FIconData);
end;
Amikor az ikon fölött mozog az egér, vagy rákattint a felhasználó, akkor a megadott DoTrayIconMessage üzenetkezelő függvényünk kap szerepet. Itt ellenőrizhetjük, hogy milyen jellegű esemény is következett be és ennek megfelelően rányithatjuk tovább alkalmazásunkat.
procedure TForm1.DoTrayIconMessage(var Msg: TMessage);
var
ie: variant;
begin
case Msg.lParam of
WM_MOUSEMOVE: ListBox1.Items.Add('WM_MOUSEMOVE');
WM_LBUTTONDOWN: ListBox1.Items.Add('WM_LBUTTONDOWN');
NIN_BALLOONSHOW: ListBox1.Items.Add('NIN_BALLOONSHOW');
...
end;
...
end;
Végül már csak egy tennivalónk maradt: a ShowBallon függvény létrehozása, mely képes arra, hogy egyedi üzenetet jelenítsen meg ballon formában a programunk futása során bármikor. Ehhez módosítanunk kell a már feltöltött TExNotifyIconData struktúrát: megadjuk az szInfoTitle mezőben a szükséges fejléc szöveget, valamint az szInfo mezőben magát az üzenet szövegét. Az uTimeout-ban beállíthatunk egy időtartamot, amíg maximum látható a ballon. Végül a dwInfoFlags mezőben azt adjuk meg, hogy milyen kis kép jelenjen meg a ballonban. Ennek három lehetséges értéke van: NIIF_INFO, NIIF_WARNING, NIIF_ERROR, illetve ha nem szeretnénk képet megjeleníteni, akkor a NIIF_NONE konstans használatával ezt letilthatjuk.
strPLCopy(FIconData.szInfoTitle, 'Software Online', SizeOf(FIconData.szInfoTitle) - 1);
strPLCopy(FIconData.szInfo, 'http://www.SoftwareOnline.hu'#13#10+DateTimeToStr(Now), SizeOf(FIconData.szInfo)-1);
FIconData.UnionData.uTimeout:=5000;
FIconData.dwInfoFlags:=NIIF_WARNING;
Shell_NotifyIcon(NIM_MODIFY, @FIconData);
...