Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi eigenen tray-bereich programmieren (https://www.delphipraxis.net/98589-eigenen-tray-bereich-programmieren.html)

eisblock 29. Aug 2007 13:00


eigenen tray-bereich programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

wollte mal fragen, ob ihr zufällig wisst, wie man eine eigene tray area programmieren kann.
Meine Frage ist, wie ich die Icons vom TrayNotifyWnd-Fenster auf mein Programm umleiten kann.
Vielleicht wisst ihr auch, wie man das TrayNotifyWnd-Fenster aus dem Shell_TrayWnd-Fenster abkapseln kann :) (das würde die neuprogrammierung des Traybereichs ersparen)

Ähm ja ich gebe zu das klingt jetzt etwas kryptisch, deshalb anbei ein Screenshot meines Desktops :)
hoffe, ihr versteht mich :gruebel: :dp:

Grüße,
jr

s-off 29. Aug 2007 13:21

Re: eigenen tray-bereich programmieren
 
Zitat:

Zitat von eisblock
Vielleicht wisst ihr auch, wie man das TrayNotifyWnd-Fenster aus dem Shell_TrayWnd-Fenster abkapseln kann :) (das würde die neuprogrammierung des Traybereichs ersparen)

Klar :mrgreen:

Delphi-Quellcode:
Unit Unit1;

Interface

Uses
   Windows,
   Messages,
   SysUtils,
   Variants,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs,
   StdCtrls;

Type
   TForm1 = Class(TForm)
      Button1: TButton;
      Button2: TButton;
      Procedure Button1Click(Sender: TObject);
      Procedure Button2Click(Sender: TObject);
   private
      { Private-Deklarationen }
      OriginParent: Hwnd;
   public
      { Public-Deklarationen }
   End;

Var
   Form1: TForm1;

Implementation

{$R *.dfm}

Procedure TForm1.Button1Click(Sender: TObject);
Begin
   OriginParent := Windows.GetParent(xxx);
   Windows.SetParent(xxx, Self.Handle);
End;

Procedure TForm1.Button2Click(Sender: TObject);
Begin
   Windows.SetParent(xxx, OriginParent);
End;

End.
Edit:
xxx = Handle Deiner TNA

Edit2:
Hab mir gerade erst Deinen Anhang angesehen. Wenn Du
Delphi-Quellcode:
Windows.SetParent(xxx, Self.Handle);
ersetzt durch
Delphi-Quellcode:
Windows.SetParent(xxx, 0);
landet Deine TNA übrigens auf dem Desktop.

Edit3:
Was mir gerade noch einfällt:
Solltest Du die TNA auf Deine eigene Form packen, dann denke daran, beim Beenden Deiner Anwendung das Ganze wieder rückgängig zu machen (Button2Click) - ansonsten stehst Du ohne TNA da ;)
Obwohl man die auch irgendwie wieder herstellen kann; weiss allerdings aktuell nicht, wie.

Edit4: Rechtschreibfehler in Edit3 beseitigt

eisblock 29. Aug 2007 14:31

Re: eigenen tray-bereich programmieren
 
hey danke erstmal für den guten Ansatz! Das ganze funktioniert auch mit der gesamten Taskleiste und sieht echt putzig aus =) aber wenn ich es nur auf die TNA anwende, verschwindet sie im Nirvana =(

s-off 29. Aug 2007 14:41

Re: eigenen tray-bereich programmieren
 
Hmm,

bei mir gehts. Die TNA landet in der linken oberen Ecke des Desktops. Sicher, dass Du das korrekte handle hast, also das der Klasse 'ToolbarWindow32' mit dem Titel 'Infobereich'?

eisblock 29. Aug 2007 14:44

Re: eigenen tray-bereich programmieren
 
ich benutze das handle kind:

elter := FindWindow('Shell_TrayWnd', nil);
kind := FindWindowEx(elter, 0, 'TrayNotifyWnd', nil);

s-off 29. Aug 2007 14:49

Re: eigenen tray-bereich programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tipp: besorge Dir WinSpy und hol Dir darüber erstmal manuell das korrekte Handle, um zu sehen, ob es grundlegend funktioniert. Evtl. ist in Deiner Handle-Suche noch etwas nicht ganz korrekt.

Edit: Du bist noch nicht tief genug -> s. Screenshot

eisblock 29. Aug 2007 15:00

Re: eigenen tray-bereich programmieren
 
Ich habe jetzt folgenden Code

Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
   OriginParent := Windows.GetParent(d);
   Windows.SetParent(d, 0);
End;


Procedure TForm1.Button2Click(Sender: TObject);
Begin
Windows.SetParent(d, OriginParent);

End;

procedure TForm1.FormCreate(Sender: TObject);
begin
a := FindWindow('Shell_TrayWnd', nil);
b := FindWindowEx(a, 0, 'TrayNotifyWnd', nil);
c:=FindWindowEx(b, 0, 'Syspager', nil);
d:=FindWindowEx(c, 0, 'ToolbarWindow32', 'Infobereich');

end;
und irgendwie klappt es immernoch nicht, obwohl er ein gültiges Handle liefert. Hm vielleicht sollte ich mich nochmal genauer mit Handles beschäftigen... was ist denn dein Handle-Suchcode?

s-off 29. Aug 2007 15:13

Re: eigenen tray-bereich programmieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mir das Handle wie gesagt über WinSpy geholt, da ich keine Lust hatte, mich da durch zu hangeln.
Aber das hast Du ja jetzt für mich gemacht ;)

Habe also Deine Routine zur Ermittlung des Handles übernommen und es funktioniert bei mir -> die TNA wird beim Klick auf Button1 auf meine Form verfrachtet.

Beispielprojekt anbei.

eisblock 29. Aug 2007 15:20

Re: eigenen tray-bereich programmieren
 
aaah es hat die ganze Zeit geklappt! Das Problem war nur: bei mir ist die Taskleiste oben. und deshalb hat sie auch wunderschön den TNA-Bereich überdeckt ^^ vielen Dank für deine Hilfe! =)

thabaker 29. Aug 2007 20:43

Re: eigenen tray-bereich programmieren
 
Das funktioniert ja "nur" wenn auch die Taskleiste da ist, sprich der Explorer als Shell läuft, oder? Wenn ich jetzt hergehen würde und eine andere Shell benutze, wie erstelle ich dann "per Hand" eine TNA?
Muss ich dann diese Windows-Struktur selbst erstellen? :wiejetzt:

s-off 30. Aug 2007 07:11

Re: eigenen tray-bereich programmieren
 
Hallo,

Zitat:

Zitat von thabaker
Das funktioniert ja "nur" wenn auch die Taskleiste da ist, sprich der Explorer als Shell läuft, oder?

Ja.

Zitat:

Zitat von thabaker
Wenn ich jetzt hergehen würde und eine andere Shell benutze, wie erstelle ich dann "per Hand" eine TNA?

Mal davon abgesehen, dass eine alternative Shell eine derartige Funktionalität mitbringen sollte, müsstest Du wohl selber anlegen.

Zitat:

Zitat von thabaker
Muss ich dann diese Windows-Struktur selbst erstellen? :wiejetzt:

'Windows' im Sinne der Fenster-Technik oder im Sinne des Betriebssystems?
Im Prinzip sind ja alles nur Fenster, die auf irgendwelche Botschaften reagieren. Also wäre der Nachbau einer Taskbar mit all ihren Elementen nichts anderes als jede andere Anwendung mit Buttons und dergleichen auch.
Nur dass man hier wohl nicht umher kommen würde, sich mit der WinAPI zu beschäftigen, da es meines Wissens nach keine Komponenten gibt, welche diese Funktionalitäten kapseln.

Rastaman 30. Aug 2007 19:58

Re: eigenen tray-bereich programmieren
 
MSDN-Library durchsuchenSetWindowsHookEx mit idHook = WH_SHELL

thabaker 31. Aug 2007 22:24

Re: eigenen tray-bereich programmieren
 
@Rastaman: und dann? da sind zwar Nachrichten drin die eine eigene Taskleiste möglich machen, aber zum Thema Tray-Bereich hab dort jetzt nix gesehen...

wicht 31. Aug 2007 23:11

Re: eigenen tray-bereich programmieren
 
Kleiner Hinweis: Schau mal auf http://www.sharpe-shell.org/ - die haben eine Shell in Delphi programmiert, und da ist auch das TNA-Gerät bei.

Luckie 31. Aug 2007 23:12

Re: eigenen tray-bereich programmieren
 
Es gibt bestimmt Dokumentationen von Microsoft, wie man eine eigene Shell programmiert. Dort sollten auch die benötigten Schnittstellen dokumentiert sein.

Billi Berserker 1. Sep 2007 00:16

Re: eigenen tray-bereich programmieren
 
Zitat:

Zitat von Rastaman
MSDN-Library durchsuchenSetWindowsHookEx mit idHook = WH_SHELL

bringt dich bzgl. des Trays absolut nicht weiter

Zitat:

Zitat von Luckie
Es gibt bestimmt Dokumentationen von Microsoft, wie man eine eigene Shell programmiert. Dort sollten auch die benötigten Schnittstellen dokumentiert sein.

Die einzige Dokumentation die man findest beschränkt sich leider darauf wie man ein eigenes Icon im Tray platziert. Das ganze ist aber auf jedenfall hilfreich zu wissen da das ja genau die Daten sind die man verarbeiten muß wenn Anwendungen im eigenen Tray Icons platzieren wollen.
NOTIFYICONDATA Structure

Aber insgesammt würde ich von einer komplette Neuprogrammierung des Tray absolut abraten insofern es nicht echt nötig ist. Das ganze ist ziemlich kompliziert und es ist fast ein ding der unmöglichkeit eine eigenen system tray zu implementieren der absolut fehlerfrei funktioniert. Grund ist zum einen der Mangel an Dokumentation (man kann sich vieles nur aus dem Thema verwandten MSDN und Knowledge Base Artikeln zusammen suchen und probieren) und der Fakt das es Anwendungen gibt die den MSDN Richtlinien nicht exakt Folgen (aber trotzdem im explorer tray richtig angezeigt werden... nur in deinem eigenen nicht). Den eigenen Tray parallel zum explorer tray laufen lassen ist übriegens nicht möglich da es nur ein 'Shell_TrayWnd' geben kann welches die Tray Nachrichten via WM_COPYDATA empfängt.

Wenn es für deine Zwecke reicht solltest du wirklich versuchen die Shell_TrayWnd und TrayNotifyWnd Fenster von der Taskbar abzudocken. Schau vielleicht mit Winspector nach ob es noch irgendein parent Fenster gibt was du gleich mit rausziehen kannst. In der Taskbar ist das soweit ich mich erinnere ganz gut organisiert.
Das einzige auf was du absolut achten mußt ist das das TrayNotififyWnd ein child Fenster vom Shell_TrayWnd bleibt.

Luckie 1. Sep 2007 00:49

Re: eigenen tray-bereich programmieren
 
Zitat:

Zitat von Luckie
"Billi Berserker
Zitat:

Zitat von Luckie
Es gibt bestimmt Dokumentationen von Microsoft, wie man eine eigene Shell programmiert. Dort sollten auch die benötigten Schnittstellen dokumentiert sein.

Die einzige Dokumentation die man findest beschränkt sich leider darauf wie man ein eigenes Icon im Tray platziert. Das ganze ist aber auf jedenfall hilfreich zu wissen da das ja genau die Daten sind die man verarbeiten muß wenn Anwendungen im eigenen Tray Icons platzieren wollen.
NOTIFYICONDATA Structure

Das ist ja kein großes Geheimnis. Aber ich bin mir ziemlich sicher, dass es da eine Dokumentation geben muss. Man muss sie nur finden.

Billi Berserker 1. Sep 2007 09:22

Re: eigenen tray-bereich programmieren
 
Zitat:

Zitat von Luckie
Das ist ja kein großes Geheimnis. Aber ich bin mir ziemlich sicher, dass es da eine Dokumentation geben muss. Man muss sie nur finden.

Muß dich da leider enttäuschen. Ich hab mich sehr ausführlich mit dem Thema beschäftigt und offiziell von Microsoft gibt es da echt nix außer die Definition der Daten Strukturen und Anleitungen wie man einen Tray benutzt. Aber leider nix wie man selber einen Programmiert. So interessante Sachen wie das das Shell_TrayWnd auch ApplicationData Nachrichten verwalten muß (und das diese auch einfach als WM_COPYDATA mit ner anderne ID gesendet werden) mußte ich mir z.b. aus nem Knowledge Base Aritkel der erklärt hat wie man die Position der Taskbar findet herraus fummeln. Auch Informationen über das starten der Shell Service Objects gibts auf MSDN oder auch in anderen Microsoft Artikeln nicht.

Hier ist man größtenteils wirklich auf sich allein gestellt (insofern man nicht blind von bereits existierenden shells kopieren will) und einem bleibt manchmal auch nix anderes übrig als mit Winspector Nachrichten und Fenster zu überwachen oder manchmal sogar 100 MB große Process Monitor startup logs von windows/explorer zu analysieren.

Hat schon seinen Grund warum ich davon abrate insofern es nicht absolut notwendig ist :)


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