Laden...

Externe Anwendung in einem MDI starten

Erstellt von masmin vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.463 Views
M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren
Externe Anwendung in einem MDI starten

Hallo,

ich möchte gerne eine externe Anwendung in einem MDI-Fenster starten.

Bisher habe ich Folgendes probiert


[System.Runtime.InteropServices.DllImport("user32.dll")]
            static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

...

            ProcessStartInfo psi = new ProcessStartInfo("notepad.exe");
            Process p = Process.Start(psi);
            SetParent(p.MainWindowHandle, this.Handle);


Leider klappt das nicht und die Anwendung (hier Notepad) wird immernoch außerhalb meines MDI-Fensters gestartet.

Hat jemand vielleicht eine Idee was ich falsch mache oder wie man es sonst lösen könnte?

925 Beiträge seit 2004
vor 17 Jahren
  1. weiß ich nicht, ob das überhaupt möglich ist
  2. hast du's mal andersherum versucht? Erst SetParent und dann .Start?
M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren

zu 1.
Doch, das geht auf jedenfall und ich hatte das auch vor Ewigkeiten auch schonmal gemacht. Der Code war irgendwie so ähnlich, nur das Framework war noch das 1.0. Jetzt hab das 2.0 laufen und ich kriegs nicht mehr hin.

zu 2.
Andersrum gehts nicht, da ja in SetParent der Process p gebraucht wird.

925 Beiträge seit 2004
vor 17 Jahren

Process p = new Process(psi);
SetParent(p.MainWindowHandle, this.Handle);
p.Start();

So auch nicht? Hab's gerade nicht ausprobiert... 😮

M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren

Das klappt leider auch nicht.

Ich habs auch mal so probiert


Process p = new Process();
SetParent(p.MainWindowHandle, this.Handle);
p.Start("notepad.exe.");

aber da erhalte ich folgenden Fehler

Auf den statischen Member "System.Diagnostics.Process.Start(string)" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.

49.485 Beiträge seit 2005
vor 17 Jahren
M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren

Okay, das war einfach.

Um den Fehler zu beheben müßte man den Code von so

Process p = new Process();
SetParent(p.MainWindowHandle, this.Handle);
p.Start("notepad.exe.");

auf so ändern

Process p = new Process(); //unnütz an dieser Stelle
SetParent(p.MainWindowHandle, this.Handle); //wird ebenso wenig mehr gebraucht
Process.Start("notepad.exe.");

Leider gibt mir das überhaupt keinen Lösungsansatz für mein bisheriges Problem 🙁

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo masmin,

also ich denke ja auch eher, dass es nicht geht, aber wenn du meinst, du hättest es in 1.0 hinbekommen, dann sollte der Code aber mit 2.0 noch genauso gut gehen.

herbivore

M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren

Also es hat mir jetzt keine Ruhe gelassen und ich hab es nochmal mit dem Framework 1.1 ausprobiert. Es klappt dort tatsächlich mit diesem Code.
Warum funktioniert es mit dem Framework 2.0 nicht mehr?? Ich wäre immer noch sehr dankbar, wenn mir jemand ein Lösung für das Problem für das .NET FW 2.0 geben könnte.

6.862 Beiträge seit 2003
vor 17 Jahren

Außer dem Framework wars die gleiche Maschine? Ich finds nur seltsam weil SetParent ja ne WinApi Funktion ist und nichts mit dem Framework zu tun hat. Dann könnts ja nur an den Handles liegen die anders gehandhabt werden in den verschiedenen FW Versionen.

Baka wa shinanakya naoranai.

Mein XING Profil.

915 Beiträge seit 2006
vor 17 Jahren

Original von talla
Außer dem Framework wars die gleiche Maschine? Ich finds nur seltsam weil SetParent ja ne WinApi Funktion ist und nichts mit dem Framework zu tun hat. Dann könnts ja nur an den Handles liegen die anders gehandhabt werden in den verschiedenen FW Versionen.

Wird es leider auch aber es gibt trotzdem einen weg, denke am Montag weis ich da mehr. Ein Kollege hat das schon mal denke ich gelöst bekommen.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

6.862 Beiträge seit 2003
vor 17 Jahren

Das wundert mich aber jetzt, hab grad mal in die SDK Doku geschaut und da steht folgendes:

An application can use the SetParent function to set the parent window of a pop-up, overlapped, or child window. The new parent window and the child window must belong to the same application.

Denke selbst wenn es im FW 1.x funktioniert hat, oder auch in unmanaged Code, ists ein Fehler denn es sollte laut Design nicht so benutzt werden.

Baka wa shinanakya naoranai.

Mein XING Profil.

M
masmin Themenstarter:in
29 Beiträge seit 2005
vor 17 Jahren

@Andreas.May
das wäre super, wenn du morgen nochmal posten könntest was du rausgefunden hast

@talla
egal, ob es so benutzt werden sollte oder nicht - ich suche nunmal eine Lösung für das Problem und ich denke mal schon, dass sowas möglich ist, irgendwie. 🙂

6.862 Beiträge seit 2003
vor 17 Jahren

Hehe, das ist die Lieblingseinstellung die jeden Supportmitarbeiter eine Programms zum glühen bringt 🙂 Funktionen für Dinge benutzen wofür sie nicht geschaffen sind 🙂

Also denke echt dass es evtl. nen Nebeneffekt vom FW 1.x ist das es damals funktioniert hat. Laut offizieller Doku ist es kein Anwendungsfall.

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo masmin,

ich muss talla zustimmen. Wenn du eine Funktion auserhalb der Spezifikation nutzt, dann kann es dir bei jedem Versionswechsel des Betriebssystems oder von .NET oder sogar nur durch einen Patch passieren, dass sie nicht mehr funktioniert. Auf so tönerne Füße sollte man sein Programm nicht stellen.

Deshalb nochmal die Vermutung, dass es eigentlich nicht geht.

herbivore

915 Beiträge seit 2006
vor 17 Jahren

Also getestet habe ich es leider nicht.
Aber vermute mal das es sich einfach nur um ein anderes Handle handelt.

Versuch mal mit dem Spy++ und FindWindowEx das Handle abzufangen.


DllImport("user32.dll")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

Eigentlich sollte SetParent immer noch gehen.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(