Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I run another application within a panel of my C# program?

I've been reading lots on how to trigger an application from inside a C# program (Process.Start()), but I haven t been able to find any information on how to have this new application run within a panel of my C# program. For example, I'd like a button click to open a notepad.exe WITHIN my application, not externally.

like image 354
Alex Avatar asked Apr 16 '09 23:04

Alex


People also ask

How can I run another application within a panel of my C# program?

Using the win32 API it is possible to "eat" another application. Basically you get the top window for that application and set it's parent to be the handle of the panel you want to place it in. If you don't want the MDI style effect you also have to adjust the window style to make it maximised and remove the title bar.

How do I open an app in Visual Studio?

Double-click the . csproj file to open it in Visual Studio. See Start from a Visual Studio solution or project. If the code is from another development environment, there's no project file.


1 Answers

Using the win32 API it is possible to "eat" another application. Basically you get the top window for that application and set it's parent to be the handle of the panel you want to place it in. If you don't want the MDI style effect you also have to adjust the window style to make it maximised and remove the title bar.

Here is some simple sample code where I have a form with a button and a panel:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading;  namespace WindowsFormsApplication2 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }          private void button1_Click(object sender, EventArgs e)         {             Process p = Process.Start("notepad.exe");             Thread.Sleep(500); // Allow the process to open it's window             SetParent(p.MainWindowHandle, panel1.Handle);         }          [DllImport("user32.dll")]         static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);     } } 

I just saw another example where they called WaitForInputIdle instead of sleeping. So the code would be like this:

Process p = Process.Start("notepad.exe"); p.WaitForInputIdle(); SetParent(p.MainWindowHandle, panel1.Handle); 

The Code Project has a good article one the whole process: Hosting EXE Applications in a WinForm project

like image 99
Luke Quinane Avatar answered Oct 19 '22 17:10

Luke Quinane