Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi Anwendung im SysTray anzeigen ohne Komponenten (https://www.delphipraxis.net/91211-anwendung-im-systray-anzeigen-ohne-komponenten.html)

dor557 1. Mai 2007 15:52


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:
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:

Delphi-Quellcode:
 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:

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 : Anwendung im SysTray anzeigen

Matze 1. Mai 2007 15:56

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Hallo Sascha,

Zitat:

Zitat von dor557
Da die Anwendung in diesem Beispiel nur im minimierten Zustand in SysTray erscheinen soll, muss zuerst die ApplicationEvents komponente auf dem Formular platziert werden [...]

Das ist gar nicht nötig, ich nutze immer folgenden Code, um ein TNA-Icon anzulegen: Code-Library. ;)

dor557 1. Mai 2007 16:16

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

SirThornberry 1. Mai 2007 19:07

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.

Mackhack 1. Mai 2007 20:33

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Zitat:

Zitat von SirThornberry
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.

Guter Vorschlag SirThornberry!

Luckie 1. Mai 2007 23:02

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Zitat:

Zitat von dor557
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.

Was ist an meinem Beispiel unvollständig?

dor557 2. Mai 2007 04:11

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

Luckie 2. Mai 2007 09:24

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Ich bezog mich auf meinen Beitrag in der Code-Lib, auf den Matze verwiesen hat:
http://www.delphipraxis.net/internal_redirect.php?t=137
und auf den auch du dich dann anscheinend bezogen hast.

bitsetter 25. Jun 2007 14:40

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.

SirThornberry 25. Jun 2007 15:43

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.

Muetze1 25. Jun 2007 22:28

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
1. Ich finde es schlecht, dass TaskBarAddIcon und TaskBarRemoveIcon auf Form1.Handle zugreifen, da diese Variable nicht immer stimmt. Warum diese nicht einfach als Methoden implementieren und auf Self.Handle zugreifen?
2. Es wird nicht auf die "TaskbarCreated" vom Explorer eingegangen um das Icon erneut zu registrieren, wenn der Explorer (abstürzt) neu gestartet wurde.
3. Es wird nicht erwähnt, dass bei einem minimierten Programm mit nur einem Icon im TNA Bereich kein OnCloseQuery ausgelöst wird und auch hier nicht durchlaufen wird. Sprich: es wird nicht auf WM_QUERYENDSESSION & WM_ENDSESSION reagiert.

Ich verweise - wie immer bei einem solchen Thema - auf mein Beispielprojekt dazu, welcher die o.g. Punkte beinhaltet: TNA Example. Luckie bzw. die CodeLib kann dies gerne übernehmen, aber das hatte ich auch schon mehrfach geschrieben... *seufz*

Xedixo 31. Aug 2008 12:48

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Danke!!!

Hat prima gefunzt!

Xedixo

yoshi1991 6. Sep 2009 16:31

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Ich hab mal eine Frage

also das mit dem Icon in der Symbolleiste funktioniert schonmal alles

bloß das mit der Aktion beim Minimieren des Programms geht nicht
ich hab Delphi 7, muss ich da irgendwas beachten?

Luckie 6. Sep 2009 22:31

Re: Anwendung im SysTray anzeigen ohne Komponenten
 
Was heißt "Geht nicht"? Das ist eine mehr als unzureichende Fehlerbeschreibung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz