AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Anwendung im SysTray anzeigen ohne Komponenten
Tutorial durchsuchen
Ansicht
Themen-Optionen

Anwendung im SysTray anzeigen ohne Komponenten

Ein Tutorial von dor557 · begonnen am 1. Mai 2007 · letzter Beitrag vom 6. Sep 2009
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von dor557
dor557
Registriert seit: 23. Okt 2004
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
 
Muetze1
 
#11
  Alt 25. Jun 2007, 22:28
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*
  Mit Zitat antworten Zitat
Xedixo

 
Delphi 7 Enterprise
 
#12
  Alt 31. Aug 2008, 12:48
Danke!!!

Hat prima gefunzt!

Xedixo
  Mit Zitat antworten Zitat
yoshi1991
 
#13
  Alt 6. Sep 2009, 16:31
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#14
  Alt 6. Sep 2009, 22:31
Was heißt "Geht nicht"? Das ist eine mehr als unzureichende Fehlerbeschreibung.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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