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


Anmelden zum Antworten