AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Anwendung im SysTray anzeigen ohne Komponenten

Anwendung im SysTray anzeigen ohne Komponenten

Ein Tutorial von dor557 · begonnen am 1. Mai 2007 · letzter Beitrag vom 6. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von dor557
dor557
Registriert seit: 24. 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
 
Benutzerbild von Matze
Matze

 
Turbo Delphi für Win32
 
#2
  Alt 1. Mai 2007, 16:56
Hallo Sascha,

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

 
Delphi 10.1 Berlin Starter
 
#3
  Alt 1. Mai 2007, 17:16
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
Sascha Nickel
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#4
  Alt 1. Mai 2007, 20:07
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.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

 
Delphi 2006 Architect
 
#5
  Alt 1. Mai 2007, 21:33
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!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#6
  Alt 2. Mai 2007, 00:02
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?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

 
Delphi 10.1 Berlin Starter
 
#7
  Alt 2. Mai 2007, 05:11
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
Sascha Nickel
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#8
  Alt 2. Mai 2007, 10:24
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.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

 
Turbo Delphi für Win32
 
#9
  Alt 25. Jun 2007, 15:40
Da anscheinend einige Mitglieder mit der Umsetzung des Projektes Schwierigkeiten haben, hänge ich es hier sicherheitshalber noch mal an.
Angehängte Dateien
Dateityp: zip tna_945.zip (7,1 KB, 89x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry

 
Delphi 2006 Professional
 
#10
  Alt 25. Jun 2007, 16:43
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.
Jens
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 17:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf