Laden...

Fremde Anwendung in eigener Anwendung

Erstellt von msycho vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.100 Views
M
msycho Themenstarter:in
234 Beiträge seit 2007
vor 14 Jahren
Fremde Anwendung in eigener Anwendung

Hallo!

Ist es möglich eine fremde Anwendung in der eigenen Anwendung laufen zu lassen? Also als MDI-Child?
Habt ihr mir ein Schlagwort mit dem ich weiterkomme?

Danke.

/EDIT: Zwischenzeitlich habe ich doch was gefunden. Anscheinend ist es schon möglich. Allerdings muss beide Anwendungen in dem selben Thread laufen, bzw. muss der Zugriff von dem Thread kommen, der den GUI-Thread erzeugt hat:
Warum darf nur ein GUI-Thread existieren?
Doch wie bette ich eine fremde Anwendung in die eigene ein?

1.549 Beiträge seit 2004
vor 14 Jahren

wenn beides Dot net anwendugen sind kannst du ja einfach auf die assamblys zugreifen und die entsprechende anwendung Starten

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
902 Beiträge seit 2007
vor 14 Jahren

wenn es wirklich externe, nicht .net anwendungen sind, kannst du dir mal die Win32 Funktionen FindWindow und SetParent anschauen.

Gibt hier im Forum sicher auch schon Beispiele.

mfg
serial

M
msycho Themenstarter:in
234 Beiträge seit 2007
vor 14 Jahren

Ich bin weitergekommen:

public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        private string exeName = @"C:\Programme\Internet Explorer\iexplore.exe";

        public Form1()
        {
            InitializeComponent();

            Process p = null;
            IntPtr appWin = IntPtr.Zero;
            try
            {
                //Prozess starten
                p = Process.Start(this.exeName);

                //Auf Prozess warten
                if (p.WaitForInputIdle(50000))
                {
                    //Window Handle holen
                    appWin = p.MainWindowHandle;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Error");
            }

            if (appWin != IntPtr.Zero)
            {
                //In meine Form setzen
                SetParent(appWin, this.Handle);
            }
        }
    }

Mein Problem ist jetzt aber, dass der fremde Prozess (den ich einbinden will) zu früh da ist. Selbst mit WaitForInputIdle schaff ich es nicht ihn einzubetten.
Habt ihr eine Idee?

/EDIT: Das scheint irgendwie am IE7 zu liegen. Will ich z.B. Notepad einbinden, funktioniert es. Weiß jemand wieso?

M
71 Beiträge seit 2008
vor 14 Jahren

Pack dein Code doch in FormShow

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo msycho,

Allerdings muss beide Anwendungen in dem selben Thread laufen

das ist nicht möglich. Ein Thread ist immer genau einem Prozess zugeordnet.

herbivore

C
252 Beiträge seit 2007
vor 14 Jahren

Der WindowTabifier dürfte genau das sein was du suchst.