Fenster in Programm anzeigen/starten

Peter86

Erfahrenes Mitglied
Hallo,
ich habe wieder eine Frage.
Ist es möglich ein Programm in einem fenster meines programmes anzuzeigen? Und wenn ja wie?
Um es zu verdeutlichen hab ich mal ein Bild hinzugefügt. HIER
Was ich vor habe in schritten.
Mein Programm starten > anderes Programm per mein programm starten (es soll sich aber nur in dem Fenster starten, also nicht in der taskleiste zu sehen sein).

Ich hoffe ihr könnt mir helfen.

Peter86
 
Hmmm,
leider kann ich bei mir keinen Panel Container finden. Habs auch versucht hinzuzufügen gibts aber nirgends. Was nun?

Peter86
 
PanelContainer ist der Name des Steuerelements Panel, der hier einfach vergeben wurde um seine Bedeutung näher zu unterstreichen.

Steht aber alles da.

Genauso gut müsstest du dafür auch ein TabPage Steuerelement hernehmen können. (TabPage ist ein Steuerelement vom TabControl für die Anzeige der einzelnen Reiter).
 
Vielen Dank, Spyke. Klappt wunderbar. Doch kann ich das fenster auch unbewegbar machen? Also das es fest ist.

Peter86
 
da mich das grad selbst interessiert hat, hab ich mal bissel google und msdn bemüht und ne denke mal passable Lösung hinbekommen :D

C#:
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, short nIndex, int dwNewLong);

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

const int GWL_STYLE = -16;

und nach
C#:
//Fenster anzeigen.
ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE);
noch einfügen
C#:
int frm=GetWindowLong(hProcess.MainWindowHandle,GWL_STYLE);
SetWindowLong(hProcess.MainWindowHandle, GWL_STYLE, frm & ~0xC00000);

hier nochmal der komplette Code:
C#:
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

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

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

        //Das Fenster wird maximiert angezeigt.
        const int SW_MAXIMIZE = 3;
        const int GWL_STYLE = -16;

...

        // <summary>
        // Die Prozedur startet die übergebene Anwendung und setzt sie in die aufrufende Form.
        /// </summary>
        // <param name="CallingApplication">bspw. notepad.exe</param>
        /// <param name="p">Panel-Control, in das die Anwendung eingebettet werden soll</param>
        private void SetApplicationAsChild(string CallingApplication, Panel p)
        {
            // Fehlerbehandlung einschalten.
            try
            {
                // Process starten ( ... notepad.exe ... ).
                System.Diagnostics.Process hProcess = System.Diagnostics.Process.Start(CallingApplication);
                // Siehe (... WaitForInputIdle ...)
                hProcess.WaitForInputIdle();

                // Parent Fenster setzen.
                SetParent(hProcess.MainWindowHandle, p.Handle);
                //Fenster anzeigen.
                ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE);

                int frm=GetWindowLong(hProcess.MainWindowHandle,GWL_STYLE);
                SetWindowLong(hProcess.MainWindowHandle, GWL_STYLE, frm & ~0xC00000);
            }
            catch (Exception ex)
            {
                // Fehlerbeschreibung bei auftretenden Fehler anzeigen.
                MessageBox.Show(ex.Message.ToString(), "Info");
            }
        }
C#:
SetApplicationAsChild("notepad.exe", panelContainer);

Nachtrag:
Im Grunde wird blos die Titelleiste ausgeblendet
 
Zuletzt bearbeitet von einem Moderator:
Code:
 <DllImport("user32.dll", SetLastError := True, CharSet := CharSet.Auto)> 
 Private Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
 End Function

 <DllImport("user32.dll", SetLastError := True, CharSet := CharSet.Auto)> _
 Private Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
 End Function

 <DllImport("user32.dll")> _
 Private Shared Function SetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Short, ByVal dwNewLong As Integer) As Integer
 End Function

 <DllImport("user32.dll")> _
 Private Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
 End Function

 Const SW_MAXIMIZE As Integer = 3
 Const GWL_STYLE As Integer = -16


...



 ' <summary>
 ' Die Prozedur startet die übergebene Anwendung und setzt sie in die aufrufende Form.
 ''' </summary>
 ' <param name="CallingApplication">bspw. notepad.exe</param>
 ''' <param name="p">Panel-Control, in das die Anwendung eingebettet werden soll</param>

 Private Sub SetApplicationAsChild(ByVal CallingApplication As String, ByVal p As Panel)

     ' Fehlerbehandlung einschalten.
     Try

         ' Process starten ( ... notepad.exe ... ).
         Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start(CallingApplication)
        
         ' Siehe (... WaitForInputIdle ...)
         hProcess.WaitForInputIdle()

         ' Parent Fenster setzen.
         SetParent(hProcess.MainWindowHandle, p.Handle)
        
         'Fenster anzeigen.
        
         ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
        
         Dim frm As Integer = GetWindowLong(hProcess.MainWindowHandle, GWL_STYLE)

         SetWindowLong(hProcess.MainWindowHandle, GWL_STYLE, frm And Not 12582912)

     Catch ex As Exception
  
         ' Fehlerbeschreibung bei auftretenden Fehler anzeigen.
         MessageBox.Show(ex.Message.ToString(), "Info")

     End Try
    
 End Sub
habs mal für dich übersetzt mit dieser Website:
http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx

nu is aber ne Positive Bewertung fällig ;)
 
Danke funktioniert Super. Deine Bewertung kriegste aufjedenfall. Aber da ich schonmal einen Thread offen habe. Kannst du mir eventuell noch sagen wie ich die Priorität verschiedener Prozesse auf High setzen kann? Ansonsten hat sich das thema erledigt.

Peter86
 
Zuletzt bearbeitet:
Danke funktioniert Super. Deine Bewertung kriegste aufjedenfall. Aber da ich schonmal einen Thread offen habe. Kannst du mir eventuell noch sagen wie ich die Priorität verschiedener Prozesse auf High setzen kann? Ansonsten hat sich das thema erledigt.

Peter86

C#:
System.Diagnostics.Process hProcess = System.Diagnostics.Process.Start(CallingApplication);

hProcess.PriorityClass = System.Diagnostics.ProcessPriorityClass.High;
Würde ich aber auf Normal lassen.

Schau dir am besten mal die Eigenschaft und Methoden von Process an.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück