Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Auflisten aller Programme, die als TrayIcon vorliegen (https://www.delphipraxis.net/193572-auflisten-aller-programme-die-als-trayicon-vorliegen.html)

ULIK 16. Aug 2017 13:25

Auflisten aller Programme, die als TrayIcon vorliegen
 
Servus,

könnte mir jemand sagen, wie man alle Programme auflistet, die als TrayIcon in der TNA vorliegen? Der Code müßte von XP bis Windows 10 funktionieren (unter 32Bit). Ich hab bisher mit dem Code aus https://www.experts-exchange.com/que...ray-icons.html herumexperimentiert, aber dieser liefert mir keine Daten, obwohl Programme im Tray minimiert existieren.

Hintergrund: mein Programm soll sich (optional) beim Beenden minimieren und dann als TrayIcon weiterleben. Ist soweit kein Problem und funktioniert. Nun möchte ich aber verhindern, daß eine gestartete zweite Instanz des Programms sich ebenfalls ins Tray minimiert (da dies funktional keinen Sinn ergibt). Deswegen war meine Idee, zu schauen, ob schon eine Instanz als TrayIcon vorliegt und wenn ja, dann die zweite Instanz wirklich zu beenden, statt ins Tray zu minimieren.


Danke,
Uli

TiGü 16. Aug 2017 13:30

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Ist es denn für dein Anwendung per se sinnvoll, dass sie zweimal gestartet werden kann?

himitsu 16. Aug 2017 13:57

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Stichwort: IPC

Das andere Programm hat es nicht zu interessieren, ob der andere im TNA ist, jedenfalls nicht aus Sicht der TNA.
Die Programme unterhalten sich und sprechen sich ab, wer sich da anzeigt.

Bzw. Semaphore ... wenn schon eine Instanzläuft, dann seigt man sich nicht im TNA an.

Altenativ: im TNA zeigt sich ein drittes Programm an, was sich mit einem/mehreren der Instanzen des Hauptprogramms unterhält.
Beispiel: Virenscanner, Firewall usw. im TNA liegt nur ein Kontrollprogramm und das Hauptprogramm läuft im Hintergrund und wird vom Kontrollprogramm gesteuert.

jaenicke 16. Aug 2017 14:04

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Die einfachste Variante ist einen Mutex zu erzeugen (CreateMutex) sobald die Anwendung in die Tray minimiert wird. Wird von der zweiten Anwendung der Mutex gefunden (OpenMutex liefert Wert <> 0), was vor der Erzeugung geprüft werden muss, beendet sich diese Instanz stattdessen. Wird die Anwendung aus der Tray wiederhergestellt, wird der Mutex wieder freigegeben (CloseHandle).

ULIK 16. Aug 2017 14:14

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
@himitsu, @jaenicke: vielen Dank, manchmal sieht man den Wald vor lauter Bäumen nicht mehr.
@TiGü: ja, ist durchaus sinnvoll. Es handelt sich um einen Dokumenteneditor, der aber beim Start des Programms erst einmal sehr viele Daten einlesen und verarbeiten muß, ohne die die Berarbeitung wenig Sinn macht. Das ist eh schon verzögert was geht, aber irgendwann müssen die Daten halt doch mal geladen werden. Und da werden teilweise mehrere Instanzen parallel geöffnet.

Nur zur Info:

Ein Problem des Codes aus Experts-Exchange ist wohl, daß mein Icon dort gar nicht erfaßt wird: Die Bestimmung des Traybereichs liefert nur das Fenster-Handle des sichtbaren Infobereichs, nicht aber der TrayIcons, die im Popup daneben verborgen sind.

Hier müßte man wohl noch zusätzlich mit
Delphi-Quellcode:
  result := FindWindow('NotifyIconOverflowWindow', nil);
  if (result <> 0) then
  begin
    result := FindWindowEx(result, 0, 'ToolbarWindow32', nil);
  end;
diesen Bereich erfassen. Allerdings liefert mir dann das Auslesen der TrayData-Struktur der dortigen Buttons keine Daten.


Danke,
Uli

zeras 16. Aug 2017 17:15

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Kannst du nicht prüfen, ob das Programm schon läuft und wenn ja, dann nicht zulassen?
Auch sollte beim Start des ersten Programms ein Fortschrittsbalken kommen, damit man sieht, wo man steht.
Das sind so meine Gedanken zu dem Thema.

pertzschc 16. Aug 2017 20:24

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Zitat:

Zitat von jaenicke (Beitrag 1378858)
Die einfachste Variante ist einen Mutex zu erzeugen (CreateMutex) sobald die Anwendung in die Tray minimiert wird. Wird von der zweiten Anwendung der Mutex gefunden (OpenMutex liefert Wert <> 0), was vor der Erzeugung geprüft werden muss, beendet sich diese Instanz stattdessen. Wird die Anwendung aus der Tray wiederhergestellt, wird der Mutex wieder freigegeben (CloseHandle).

Das ist doch die Lösung, da musst Du mit Findwindow etc. nicht weiter probieren.
Grüße, Christoph

ULIK 17. Aug 2017 04:41

AW: Auflisten aller Programme, die als TrayIcon vorliegen
 
Zitat:

Zitat von pertzschc (Beitrag 1378884)
Das ist doch die Lösung, da musst Du mit Findwindow etc. nicht weiter probieren.
Grüße, Christoph

Da hast du Recht. Ich hab nur zwischenzeitlich mit dem anderen Code rumgespielt, weil ich wissen wollte, warum der so nicht funktioniert. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 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