Da ich mit hilfe des Tutorials von dem
dsdt.info seite versucht habe das umzusetzen und einige Schwirikkeiten hatte dachte ich schreibe einfach das Tutorial nochmal Komplett mit allem was man braucht Hier hinein.
Ich habe also von
dsdt.info einfach die Texte kopiert und kommplettiert.
also :
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 in der Uses klausel die ShellApi eingebunden werden mit
uses ShellApi;
Als nächstes muss eine sog. benutzerspezifische Botschaft in Form einer globalen Konstante erstellt werden. Als Basis wird dazu die Botschaft WM_USER verwendet:
Delphi-Quellcode:
const
WM_TASKBAREVENT = WM_USER + 1;
Es folgt die Deklaration des Prozedurkopfes dieser Botschaft im Private Bereich.
Delphi-Quellcode:
Private
procedure WMTaskbarEvent(var Message: TMessage); message WM_TASKBAREVENT;
Über die folgenden Prozeduren wird das Icon im Systray angezeigt (TaskbarAddIcon) und wieder entfernt (TaskBarRemoveIcon):
Delphi-Quellcode:
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:
Delphi-Quellcode:
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. PopupMenu1 sollte als komponente selbstverständlich auf dem Formular platziert sein.
Da die Anwendung in diesem Beispiel nur im minimierten Zustand in SysTray erscheinen soll, muss zuerst die ApplicationEvents komponente auf dem Formular platziert werden, In der Komponente auf ereignisse klicken und dann OnMinimize Doppelt anklicken und Folgenden Code in die ApplicationEvents1Minimize Procedure einfügen:
TaskBarAddIcon;
Da die dieses Ereignis seit Delphi 5 in der Komponente TApplicationEvents gekapselt ist solltest du bei einer älteren Delphi version das Ereignis manuell zuweisen. Im Private-Abschnitt muss dazu zusätzlich noch folgende Procedure deklariert werden:
procedure ApplicationEvents1Minimize(Sender: TObject);
Wer ergänzungen hat kann mit diese gerne mitteilen. Werde sie dann ausprobieren und entsprechend mit in dieses Tutorial einbringen.
Gruss Sascha
Quelle :
Anwendung im SysTray anzeigen