AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular an andere Anwendung binden

Ein Thema von G-Baumstamm · begonnen am 6. Jul 2012 · letzter Beitrag vom 15. Jul 2012
Antwort Antwort
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#1

Formular an andere Anwendung binden

  Alt 6. Jul 2012, 07:37
Delphi-Version: 7
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?
Daniel NR
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Formular an andere Anwendung binden

  Alt 6. Jul 2012, 07:59
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
Heiko
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Formular an andere Anwendung binden

  Alt 6. Jul 2012, 09:29
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 ...
Daniel NR
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Formular an andere Anwendung binden

  Alt 6. Jul 2012, 11:20
Du kannst dein Fenster auch direkt als ChildWindow der Fremdanwendung setzten. MSDN-Library durchsuchenSetParent
Delphi programming
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Formular an andere Anwendung binden

  Alt 6. Jul 2012, 14:38
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 ?
Daniel NR
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Formular an andere Anwendung binden

  Alt 14. Jul 2012, 22:16
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.)
Daniel NR
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Formular an andere Anwendung binden

  Alt 15. Jul 2012, 08:06
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Formular an andere Anwendung binden

  Alt 15. Jul 2012, 09:54
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));
Daniel NR

Geändert von G-Baumstamm (15. Jul 2012 um 11:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Formular an andere Anwendung binden

  Alt 15. Jul 2012, 10:47
Habe gerade nicht zum testen da, aber wieso Application.Handle, geht es nicht um ein Form?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Formular an andere Anwendung binden

  Alt 15. Jul 2012, 11:14
(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.
Daniel NR
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 18:51 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