exe innerhalb ausführen
-
Hallo ich benutze C++ Builder und möchte innerhalb meiner Form ein anderes Programm starten / laufen lassen.
Vielleicht innerhalb einer Box / Frame oder der gleichen, ist das möglich? Wie?mfg
-
Hallo
Stichwort ShellExecute
bis bald
akari
-
Stimmt, mit shell execute kann ich ein prog starten, klappt ja auch wunderbar. Aber ich will das programm innerhalb meiner Form haben.
Fest an eine Stelle angedockt sozusagen.|-----------------------------------| | | | |------| | | click | xxxx | | | | xxxx | | | |------| | | | | | | | |-------------------------------------
Ich drücke auf click und bei xxxxx soll dann das prog laufen....
deshalb innerhalb einer box / fenster / frame / explorer.
-
Hallo,
vermutlich möchtest Du ein "fremdes" Fenster eingebettet in Deiner
Applikation haben?
Wir haben das über ein Handle und die Funktion SetParent() (winapi)
gelöst. Dann musst Du Dich aber auch noch um die Positionierung bei
Größenänderung und Verschieben kümmern.Gruß
Alexander
-
Ja genau, "ein fremdes Fenster" in meine Applikation eingebettet trifft den Nagel auf den Kopf!
Wäre es Möglich mir das ganze Code - Exemplarisch aufzuzeigen?
Danke
-
Die Funktion SetParent() ist an sich nicht sonderlich kompliziert.
Du brauchst aber das Handle des "Fremdfensters" und ein Handle eines
Controls Deiner Applikation (das ist leichter).
Wir bekommen das Handle von außen übergeben, daher kann ich Dir nicht
sagen, wie man an des Handle einer externen Applikation herankommt.
Ich habe aber hier im Forum dazu erst neulich ein paar Posts gesehen.SetParent() verwendest Du dann so:
SetParent(FremdHandle, MyControl->Handle);
Dabei ist dann MyControl ein Panel oder dergleichen.
Um die Größe des Fremdfensters anzupassen, kannst Du MoveWindwo() verwenden.
Wir wollten einfach haben, dass das Fremdfenster unser Control voll ausfüllt,
sozusagen alClient. Wir brauchen daher nur auf Größenänderungen zu reagieren.
Dann genügt sowas wie:MoveWindow(FremdHandle, 0, 0, MyControl->ClientWidth, MyControl->ClientHeight, true);
Ein kleines Problem, das wir dabei noch haben, ist, dass das Fremdfenster immer noch den
Fokus bekommen kann. Wenn man auf das eingebettete Fenster klickt, erscheint unsere Applikation
"deaktiviert". Die Titelleiste ist ausgegraut und es werden auch keine Tastaturereignisse mehr
verarbeitet.Gruß
Alexander
-
handle habe ich anscheinend richtig,
da ich das prog, welches ich später innerhalb haben möchte mit:HWND hWnd = FindWindow(0, "Innerhalb Programm"); if(hWnd) PostMessage(hWnd, WM_CLOSE, 0, 0);
schließen kann.
Aber wenn ich nun probiere es innerhalb zu öffnen, passiert nichts
HWND hWnd = FindWindow(0, "Innerhalb Programm"); HWND hWndmy = FindWindow(0, "Project1"); ::SetParent(hWnd, Form1->Handle); MoveWindow(hWnd, 0, 0, Form1->ClientWidth, Form1->ClientHeight, true);
Ich drücke den Button zum staren / öffnen des Progs und nichts passiert...
-
hallo,
hast du rausbekommen wie das funktioniert? Würde mich auch mal interessieren,
beste Grüße,
Tippo
-
diggler schrieb:
handle habe ich anscheinend richtig
Wahrscheinlich hast Du eher das falsche Handle erwischt.
Deine Applikation hat normalerweise mehrere Handles. Möglicherweise hast
Du das Handle der Applikation (Application->Handle) erwischt. Das kannst
Du ja selbst ausprobieren.
Außerdem gibt es API-Funktionen, mit denen man die Handles einer Applikation
durchgehen kann.
Dieses ganze Konstrukt ist aber etwas wacklig. Wenn Du in der externen
Applikation etwas änderst, musst Du möglicherweise die andere Applikation
auch mitändern. Sowas artet schnell zum Chaos aus.
Vielleicht gibt es auch eine andere Möglichkeit, Dein Ziel zu erreichen -
z.B.:
- Frames
- Komponenten
- DLL
- ActiveX (COM-Objekte)Wenn Du keinen Zugriff auf den Quelltext der externen Applikation hast,
wird Dir das natürlich nichts helfen.Gruß
Alexander