![]() |
Anwendung im SysTray anzeigen ohne Komponenten
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
Delphi-Quellcode:
Als nächstes muss eine sog. benutzerspezifische Botschaft in Form einer globalen Konstante erstellt werden. Als Basis wird dazu die Botschaft WM_USER verwendet:
uses ShellApi;
Delphi-Quellcode:
Es folgt die Deklaration des Prozedurkopfes dieser Botschaft im Private Bereich.
const
WM_TASKBAREVENT = WM_USER + 1;
Delphi-Quellcode:
Über die folgenden Prozeduren wird das Icon im Systray angezeigt (TaskbarAddIcon) und wieder entfernt (TaskBarRemoveIcon):
Private
procedure WMTaskbarEvent(var Message: TMessage); message WM_TASKBAREVENT;
Delphi-Quellcode:
Nun folgt noch die Implementation unserer oben deklarierten Botschaft:
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;
Delphi-Quellcode:
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.
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; 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:
Delphi-Quellcode:
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:
TaskBarAddIcon;
Delphi-Quellcode:
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 : ![]() |
Re: Anwendung im SysTray anzeigen ohne Komponenten
Hallo Sascha,
Zitat:
![]() |
Re: Anwendung im SysTray anzeigen ohne Komponenten
Danke für deine Antwort.
Dachte nur es wird mal zeit das hier mal zu komplettieren. Denn ich habe schon einige Viele Beiträge gesehen die auf diese seite verwiesen haben. gruss Sascha |
Re: Anwendung im SysTray anzeigen ohne Komponenten
ich fände es sehr sinnvoll wenn nicht nur erwähnt wird das man eine userspezifische Message benötigt sondern wenn auch erwähnt wird wozu diese da ist.
|
Re: Anwendung im SysTray anzeigen ohne Komponenten
Zitat:
|
Re: Anwendung im SysTray anzeigen ohne Komponenten
Zitat:
|
Re: Anwendung im SysTray anzeigen ohne Komponenten
Wenn du dir z.b. Den link hinter Quelle betrachtest und dann wirst du Feststellen das zum einen :
die ApplicationEvents Komponente nicht erwähnt wurde, Der hinweis das die Unit ShellApi eungebunden werden sollte. Da ich mich nicht in der Windows API auskenne kann ich keine gebnauere Beschreibung geben wofür was ist. Habe einfach das was schon Existiert hat genommen und dann noch meine Bemerkungen angepasst bzw. meine erfahrung damit eingebunden. Dachte das wäre OK... gruss Sascha |
Re: Anwendung im SysTray anzeigen ohne Komponenten
Ich bezog mich auf meinen Beitrag in der Code-Lib, auf den Matze verwiesen hat:
![]() und auf den auch du dich dann anscheinend bezogen hast. |
Re: Anwendung im SysTray anzeigen ohne Komponenten
Liste der Anhänge anzeigen (Anzahl: 1)
Da anscheinend einige Mitglieder mit der Umsetzung des Projektes Schwierigkeiten haben, hänge ich es hier sicherheitshalber noch mal an.
|
Re: Anwendung im SysTray anzeigen ohne Komponenten
wie bereits erwähnt finde ich es noch sehr wichtig das erwähnt wird wozu die Message da ist. Ansonsten wird es einfach nur ein copy&paste und da kann man auch gleiche eine fertige Komponente nehmen wenn man den quelltext nicht verstehen will.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz