Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Formular an andere Anwendung binden (https://www.delphipraxis.net/169238-formular-andere-anwendung-binden.html)

G-Baumstamm 6. Jul 2012 07:37

Delphi-Version: 7

Formular an andere Anwendung binden
 
Heyho,

ich habe ein Formular, welches ich quasi als Overlay über einer anderen, nicht von mir geschriebenen Anwendung anzeigen lassen möchte, so dass es wie ein weiteres Menü diese Formulars wirkt. Dazu habe ich z.B. einen Hotkey, den ich global abfange, und falls meine externe Anwendung das ForeGroundWindow ist entsprechend meine Form Zeige oder Hide.

Wie auch immer, damit das ganze vernünftig funktioniert muss meine Form ja immer genau eine Ebene vor der Anwendung sein, wenn beide Forms von mir wären würde ich die eine ja einfach andocken, geht aber in diesem Fall irgendwie nicht ...

Irgendwelche Ideen?

hoika 6. Jul 2012 07:59

AW: Formular an andere Anwendung binden
 
Hallo,

verstanden habe ich es nicht ...
Was ist ein Overlay ?

Aber mals o:
Du weisst schon, dass die andere Anwendung gar kein "Form", sondern ein Window hat mit einem Handle.
Das Handle könntest du dir zumindestens besorgen.
Ob du dich da als Parent eintragen kannst, hoffe ich nicht.

Wäre schlimm, wenn MS sowas erlauben würde.

Suche mal nach "DLL injection", viell. ist es ja das, was du willst.

Heiko

G-Baumstamm 6. Jul 2012 09:29

AW: Formular an andere Anwendung binden
 
Mh, dann versuche ich nochmal das zu präzisieren ...

Ich möchte, das mein Formular immer genau eine Ebene höher als eine andere Anwendung (nennen wir sie Anwendung X), deren Handle ich habe, angezeigt werde.

Wenn ich zum Beispiel Anwendung X anklicke, kommt sie ja in den Vordergrund, und dann möchte ich das mein Formular trotzdem noch davor angezeigt wird. Wenn ich danach eine weitere Anwendung in den Vordergrund hole, soll diese ganz oben angezeigt werden, danach meine Anwendung, danach Anwendung X.

Die Fensterstruktur soll also immer so aussehen:

0-n andere Anwendungen
meine Anwendung
Anwendung X
0-n andere Anwendungen

Also quasi wie wenn ich meine Anwendung an Anwendung X andocken würde.

Hoffe das war jetzt verständlicher ...

WM_CLOSE 6. Jul 2012 11:20

AW: Formular an andere Anwendung binden
 
Du kannst dein Fenster auch direkt als ChildWindow der Fremdanwendung setzten. MSDN-Library durchsuchenSetParent

G-Baumstamm 6. Jul 2012 14:38

AW: Formular an andere Anwendung binden
 
Danke, das hab ich gesucht.

Gibt es irgendeine Möglichkeit, herauszufinden, wann die als Parent gesetzte Anwendung geschlossen wird, um in meiner Anwendung darauf zu reagieren ?

G-Baumstamm 14. Jul 2012 22:16

AW: Formular an andere Anwendung binden
 
Jetzt muss ich hier doch noch mal nachhaken, sorry.

Da ich keine Möglichkeit gefunden habe, das über nen Event oÄ zu machen, habe ich mir mit einem Timer geholfen, der immer wieder polled, also überprüft, ob eine bestimme Anwendung gestartet wurde (und in diesem Fall meine Application als Child einträgt) und anschließend, ob diese noch läuft, und wenn nicht eigentlich meine Application wieder lösen sollte.

Das krieg ich aber nicht hin. Wenn ich einfach SetParent(Application.Handle,0); aufrufe, passiert irgendwie nichts, also ich sehe im Taskmanager, dass mein Prozess noch läuft, wenn ich alle anderen Fenster wegschiebe sehe ich auch mein Fenster noch, aber es wird nicht mehr in der Taskleiste oder im Tray angezeigt, man kann es als Anwender also nicht mehr richtig benutzen.

"Workaround" von mir ist momentan, die Application in diesem Fall einfach neu zu starten, läuft zwar, hat aber einige Nachteile. Größter davon ist sicherlich, dass ich nicht verhindern kann, das 2 Instanzen meiner Anwendung gleichzeitig laufen (was ich gerne würde), da für einen kurzen Moment ja tatsächlich 2 offen sein müssen ... außerdem ist das sicherlich stiltechnisch ziemlich unschön.

Lange Rede kurzer Sinn, wie gebe ich meine Application wieder "zurück", nachdem ich sie für ne Weile irgendwo als Child eingetragen hatte ?

(Hinweis: Ich weiß nicht ob das richtig ist, aber ich benutze bewusst Application.Handle und nicht das Handle einer Form. Ich habe 2 Forms, und wenn ich das Handle einer dieser Forms nehme funktioniert es nicht richtig, sie wird dann nicht vernünftig als Child angezeigt sondern flackert allenfalls ein bisschen und ist sonst garnicht zu sehen.)

Sir Rufo 15. Jul 2012 08:06

AW: Formular an andere Anwendung binden
 
Zitat:

Zitat von MSDN
For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, if hWndNewParent is NULL, you should also clear the WS_CHILD bit and set the WS_POPUP style after calling SetParent. Conversely, if hWndNewParent is not NULL and the window was previously a child of the desktop, you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

G-Baumstamm 15. Jul 2012 09:54

AW: Formular an andere Anwendung binden
 
Hey, danke, eigentlich habe ich den Artikel gelesen, aber manchmal braucht man irgendwie jemanden, der einen mit der Nase draufstößt ... ;)

Ist der Aufruf so richtig (bzw. eher was stimmt daran nicht, nach dem zurückgeben hab ich nämlich immer noch nichts in der Taskbar ...) ?

Delphi-Quellcode:
 // als Child eintragen

SetWindowLongPtr(Application.Handle,GWL_STYLE,
  getWindowLong(Application.Handle, GWL_STYLE) or WS_CHILD and (not WS_POPUP));
Windows.SetParent(Application.Handle,NewHandle);

 // wieder "zurückgeben"

Windows.SetParent(Application.Handle,0);
SetWindowLongPtr(Application.Handle,GWL_STYLE,
  getWindowLong(Application.Handle, GWL_STYLE) or WS_POPUP and (not WS_CHILD));

Bummi 15. Jul 2012 10:47

AW: Formular an andere Anwendung binden
 
Habe gerade nicht zum testen da, aber wieso Application.Handle, geht es nicht um ein Form?

G-Baumstamm 15. Jul 2012 11:14

AW: Formular an andere Anwendung binden
 
Zitat:

Zitat von G-Baumstamm (Beitrag 1174720)
(Hinweis: Ich weiß nicht ob das richtig ist, aber ich benutze bewusst Application.Handle und nicht das Handle einer Form. Ich habe 2 Forms, und wenn ich das Handle einer dieser Forms nehme funktioniert es nicht richtig, sie wird dann nicht vernünftig als Child angezeigt sondern flackert allenfalls ein bisschen und ist sonst garnicht zu sehen.)

Frag mich nicht warum das so ist, kam mir auch komisch vor.


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