![]() |
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? |
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 |
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 ... |
AW: Formular an andere Anwendung binden
Du kannst dein Fenster auch direkt als ChildWindow der Fremdanwendung setzten.
![]() |
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 ? |
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.) |
AW: Formular an andere Anwendung binden
Zitat:
![]() |
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)); |
AW: Formular an andere Anwendung binden
Habe gerade nicht zum testen da, aber wieso Application.Handle, geht es nicht um ein Form?
|
AW: Formular an andere Anwendung binden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz