C# - EXE in WinForm anzeigen?

2 Antworten

Das geht mit reinem .NET Framework nicht. Dazu musst Du mithilfe des Windows-API das Parent Window Handle des gewünschten Fensters setzen.

Beispiel: https://www.fluxbytes.com/csharp/host-a-process-window-inside-your-applications-window/

MarcelDerAdmin 
Fragesteller
 02.11.2021, 17:06

habs mit diesem code versucht und es startet auch das programm jedoch geht es zb bei notepad sofort wieder zu und es tut sich gar nix in der form

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


        [DllImport("user32.dll")]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);


        [DllImport("user32.dll")]
        static extern bool MoveWindow(IntPtr Handle, int x, int y, int w, int h, bool repaint);


        private void button1_Click(object sender, EventArgs e)
        {
            Process p = Process.Start("notepad.exe");
            p.WaitForInputIdle();
            while (p.MainWindowHandle == IntPtr.Zero)
            {
                Thread.Sleep(100); // Don't hog the CPU
                p.Refresh(); // You need this since `MainWindowHandle` is cached


                // do additional checks, or add a timeout in case the process is stalled
                // or never creates a main window handle, etc.
            }
            SetParent(p.MainWindowHandle, panel1.Handle);


        }
0
Palladin007  03.11.2021, 12:51
@MarcelDerAdmin

Dann schau nach, ob's Fehler gab.

Bei der WinApi bekommst Du keine Exceptions sondern Fehlercodes, die Du auch selber abfragen musst. Für Letzteres gibt's die "Marshal.GetLastWin32Error"-Methode oder Du nutzt direkt die GetLastError-Funktion der WinApi.
Aber ob der Fehlercode hilfreich ist oder überhaupt das ursprüngliche Problem aufzeigt, ist eine ganz anderes Thema.

Aber stell dich auf viele Schwierigkeiten ein, die WinAPI ist weit schwieriger zu bedienen, als WinForms oder andere Frameworks und birgt sehr viel mehr Fallstricke.

0

Der Code sollte schon so funktionieren wie du es gebaut hast. Du musst aber daran denken, dass das Notepad-Fenster eine eigene Position hat (x, y, breite, höhe), die innerhalb deines Panels eventuell außerhalb des sichtbaren Bereichs liegt.

Du hast ja bereits die native MoveWindow auch importiert, damit kannst du das Notepad-Fenster verschieben nachdem es ins Panels versetzt wurde:

...
SetParent(p.MainWindowHandle, panel1.Handle);
MoveWindow(p.MainWindowHandle, 0, 0, panel1.Size.Width, panel1.Size.Height, true);
...
Woher ich das weiß:Berufserfahrung