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. Arbeitest du mit einer kleineren Version, musst du das Ereignis manuell zuweisen. Im Private-Abschnitt muss dazu zusätzlich noch folgende Procedure deklariert werden:
procedure ApplicationEvents1Minimize(Sender: TObject);