Anwendung im SysTray anzeigen
Systray oder auch TNA (Taskbar Notification Area) nennt man den Bereich neben der Windows-Uhr in der Taskleiste. Besonders bei Programmen, die lange aktiv sind, kann es sinnvoll sein, diese in den platzsparenden Systray zu verschieben.
Zunächst muss eine sog. benutzerspezifische Botschaft in Form einer globalen Konstante erstellt werden. Als Basis wird dazu die Botschaft WM_USER verwendet:
const WM_TASKBAREVENT = WM_USER + 1;
Es folgt die Deklaration des Prozedurkopfes dieser Botschaft.
private procedure WMTaskbarEvent(var message: TMessage); message WM_TASKBAREVENT;
Über die folgenden Prozeduren wird das Icon im Systray angezeigt (TaskbarAddIcon) und wieder entfernt (TaskBarRemoveIcon):
procedure TaskBarAddIcon; var tnid: TNotifyIconData; Owner: HWnd; begin with tnid do begin cbSize := SizeOf(TNotifyIconData); Wnd := Form1.Handle; uID := 1; uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; uCallbackMessage := WM_TASKBAREVENT; hIcon := Application.Icon.Handle; end; StrCopy(tnid.szTip, 'Tooltipp'); Shell_NotifyIcon(NIM_ADD, @tnid); Owner:=GetWindow(Form1.Handle,GW_OWNER); if Owner 0 then ShowWindow(Owner,SW_HIDE); end; procedure TaskBarRemoveIcon; var tnid: TNotifyIconData; Owner: HWnd; begin tnid.cbSize := SizeOf(TNotifyIconData); tnid.Wnd := Form1.Handle; tnid.uID := 1; Shell_NotifyIcon(NIM_DELETE, @tnid); Owner:=GetWindow(Form1.Handle,GW_OWNER); if Owner 0 then begin ShowWindow(Owner,SW_Show); ShowWindow(Owner,SW_Normal); end; end;
Nun folgt noch die Implementation unserer oben deklarierten Botschaft:
procedure TForm1.WMTaskbarEvent(var message: TMessage); var Point: TPoint; begin case message.LParamLo of WM_LBUTTONDOWN: TaskBarRemoveIcon; WM_RBUTTONDOWN: begin SetForegroundWindow(Handle); GetCursorPos(point); popupmenu1.popup(point.x,point.y); end; end; end;
Klickt man mit der linken Maustaste auf das Icon (WM_LBUTTONDOWN), wird dieses entfernt. Mit einem Rechtsklick wird an der Stelle ein Kontextmenu (Popupmenu1) geöffnet.
Da die Anwendung in diesem Beispiel nur im minimierten Zustand in SysTray erscheinen soll, muss zusätzlich noch folgende Zeile in das Application-Ereignis OnMinimize:
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin TaskBarAddIcon; end;
Seit Delphi 5 ist dieses Ereignis in der Komponente TApplicationEvents gekapselt. Bei älteren Delphi-Versionen muss das Ereignis manuell zugewiesen werden. Im private-Abschnitt muss dazu zusätzlich noch folgende Procedure deklariert werden:
private procedure ApplicationEvents1Minimize(Sender: TObject);
In neueren Delphi-Versionen gibt es eine Komponente TTrayIcon, die einem die hier gezeigte Arbeit abnimmt.