Click here to Skip to main content
Click here to Skip to main content

Hosting EXE Applications in a WinForm project

By , 21 Dec 2004
 

Sample Image

Introduction

Though not a common task, recently I needed to take an existing executable application and embed it into an application I was building. Oddly enough, I did not need any interaction between my application and the existing EXE. As it ends up, this is not a difficult thing to do. To make it even easier, I created a custom C# control that allows you to specify the name of an executable you want embedded into your application. The control takes care of all the rest.

How does it work

In design time, the user can specify the name of the executable to embed. When the control is created in runtime, it launches the application as follows:

Process p = null; 
try 
{
  // Start the process 
  p = System.Diagnostics.Process.Start(this.exeName); 

  // Wait for process to be created and enter idle condition 
  p.WaitForInputIdle(); 

  // Get the main handle
  appWin = p.MainWindowHandle; 
} 
catch (Exception ex) 
{ 
  MessageBox.Show(this, ex.Message, "Error"); 
}

After launching, the code must then set the parent of the executable's main window to the control handle. It does this as follows:

// Put it into this form
SetParent(appWin, this.Handle);

// Remove border and whatnot
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);

// Move the window to overlay it on this window
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);

Any time the control is resized, it must also resize the executable window. To do so, it does this in the Resize function:

protected override void OnResize(EventArgs e)
{
  if (this.appWin != IntPtr.Zero)
  {
    MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
  }
  base.OnResize (e);
}

Lastly, when the control is destroyed, it should shut down the executable. To do so, it does the following:

protected override void OnHandleDestroyed(EventArgs e)
{
  // Stop the application
  if (appWin != IntPtr.Zero)
  {

    // Post a colse message
    PostMessage(appWin, WM_CLOSE, 0, 0);

    // Delay for it to get the message
    System.Threading.Thread.Sleep(1000);

    // Clear internal handle
    appWin = IntPtr.Zero;

  }

  base.OnHandleDestroyed (e);
}

History

  • 12-20-2004: Released.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Jay Nelson
Web Developer
United States United States
Member
I have been developing software professionaly since 1991 writing software in Automation and Manufacturing environments. For 14 years I worked for companies that built custom robotic automated equipment for the semiconductor, telecommunications, and other industies. Presently, I work for a medical device manufacturer developing applications for the compact framework.
 
My undergraduate degrees are in Mathematics and Philosopy. My graduate degree is in Management Information Systems. I am MCSD certified in Visual C++ 6.0 and MCSD.NET certified in C#.
 
I enjoy triathlons and reading.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralFor those who can't get it working for any application other than notepadmemberChristopher Sippel9 Apr '13 - 7:33 
Here is a link with a solution that worked for me:
 
http://stackoverflow.com/a/5965992/1097080
 
I was getting it working, but only for Notepad.exe, and the solution was to use the While loop in the above link.
Questiontoopstrip disabledmemberMember 902164117 Feb '13 - 23:27 
Hi, i have tried to host an application inside a web panel of a form and all works except that thebuttons and textbox are not invoking the methods corresponding to its events
It works fine if i dont bind it with panel
 
Some one could help me ???
plzzz

Questionwindows 7 problemmemberMember 930102825 Jul '12 - 12:26 
i tryed with windows 7 and dont works.. Some1 have a solution?
AnswerRe: windows 7 problemmemberRaRi200323 Nov '12 - 2:46 
Try this one.
Window Tabifier[^]
QuestionHosting External Exe Application in a WPF Window. [modified]membersukesh.gudikandulla27 May '12 - 6:35 
Please help me, how to open External exe application in a WPF Window. Thanks...
 
Below is the code...sample right now..i am using.. let me know what i need to modify in the code below..to work for external exe to launch in WPF window. This is opening application in separately not in WPF Window.
 
namespace WpfApplication_Blend
{
///
/// Interaction logic for Window1.xaml
///

public partial class Window1 : Window
{
public IntPtr MainWindowHandle { get; set; }
 

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

//[DllImport("user32.dll", SetLastError = true)]
//private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
 
public Window1()
{
InitializeComponent();
 
try
{
//External exe inside WPF Window
System.Windows.Forms.Panel _pnlSched = new System.Windows.Forms.Panel();
 
WindowsFormsHost windowsFormsHost1 = new WindowsFormsHost();
 
windowsFormsHost1.Child = _pnlSched;
 
_Grid.Children.Add(windowsFormsHost1);
 
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Program Files\Atwin\Atwin2k2.exe");
 
psi.WindowStyle = ProcessWindowStyle.Normal;
 
Process PR = Process.Start(psi);
 
PR.WaitForInputIdle(); // true if the associated process has reached an idle state.
SetParent(PR.MainWindowHandle, _pnlSched.Handle); // loading exe to the wpf window.
 
}
catch (Exception ex)
{
//Nothing...
}
}
 

 
}
}

modified 27 May '12 - 13:12.

QuestionIt doesn't work in window 7memberdhojonline3 Apr '12 - 2:44 
I tried running the exes it does not work in WIndows 7.
Need different way of handling it.
 
Any suggestion will be much appreciated.
AnswerRe: It doesn't work in window 7memberk3v1n5215 May '12 - 2:19 
Same problem for me.
Notepad is running fine in the panel. iexplore, excel, acrobat reader ... open as a popup.
GeneralRe: It doesn't work in window 7memberMember 899490321 May '12 - 3:40 
I have put a "this post based code" that works, answered in the post:
can't start programe that have login window. caixrz 21:56 11 Apr '07
 
Hope it helps.
QuestionHow to stop exe flashing up or appearing in taskbarmemberJamesA_Dev26 Jan '12 - 1:24 
Some programs can take a second or two to start.
When this happens, you get the program flash up and an entry for it in the taskbar.
It then gets re-parented properly.
 
Any ideas to stop this?
(Win7 with sleep fix).
QuestionMenus are disabledmemberdelfo8 Aug '11 - 22:07 
Hi, i have tried to host an application inside a windows forms on Win7 (with the bug fix corrected) and all works except that the menus and toolbar don't works.
Some one could help me ???
Thanks in advance
Stefano
GeneralMy vote of 4memberyanghe11173 May '11 - 4:16 
nice
GeneralMy vote of 5memberYusuf18 Jan '11 - 9:35 
Simple and Elegant 5
QuestionAdvice neededmemberHollyY18 Nov '10 - 12:57 
I know this is an old article, but I was wondering if/how you could implement something like this but reversed. That is run an application inside a web page instead of a browser inside of an application.
 
Thanks
GeneralWin7 and Vista Incompatablemembercs_can3 Apr '10 - 3:28 
Instead of using System.Threading.Thread.Sleep(1000), I fixed the error by following code:
 
while( p.MainWindowHandle == IntPtr.Zero || !IsWindowVisible(p.MainWindowHandle))
{
System.Threading.Thread.Sleep(10);
p.Refresh();
}
p.WaitForInputIdle();
 
You have to declare the IsWindowVisible within the same class:
 
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWindowVisible(IntPtr hWnd);
 
Hope the above help.
QuestionPowerPoint Viewer Does Not seem to workmemberMember 265354228 Dec '09 - 21:47 
I am working with VC# 2008. Powerpoint viewer application does not seem to work with this.
Furthermore, I tried retrieving the parent handle after SetParent using GetParent.
The parent handle is different from this.Handle.
Does this mean that it parent control functions have been disabled on the exe or am I misiing something ?
 
Abi

GeneralAnother problemmemberil172316 Nov '09 - 5:36 
I finnaly run the application. just commented //PostMessage(appWin, WM_CLOSE, 0, 0); and // SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE); in appcontrol.
 
Now I have other problem, I cannot start the application then a form is already opened. so if i put all working code to Form_Load function it doesn't work. It works only in InitializeComponent() function.
 
what should i do ?
 
thnx
GeneralProblemmemberil172316 Nov '09 - 4:59 
what should i fix if i recieve folowing error ? it happens when this string executing "this.Controls.Add(this.applicationControl1);"
 
PInvokeStackImbalance was detected
A call to PInvoke function 'AppControl!AppControl.ApplicationControl::SetWindowLong' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
GeneralRe: ProblemmemberElbe Alves Miranda24 Feb '11 - 3:24 
Replace:
[DllImport ("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern long SetWindowLong (IntPtr hwnd, int nIndex, long dwNewLong
);
by:
[DllImport ("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern int SetWindowLong (IntPtr hwnd, int nIndex, int dwNewLong);

GeneralReally great, works perfectly after bug fix - thank you very much!memberBlasterwurm10 Nov '09 - 4:39 
With the following "bug fix" your code works perfectly, Jay!
 
"Bug fix" to solve problem that the external application is opened in a new window instead of being hosted/integrated in Form1:
http://www.codeproject.com/Messages/3169714/Re-Vista-incompatibility.aspx
 
Furthermore you can set the property "Enabled" of applicationControl1 (included in Form1) to False to dissallow any interaction with the hosted application - that's exactly what I wanted.
 
Thank you so much Smile | :)
GeneralRe: Really great, works perfectly after bug fix - thank you very much!memberAtchyuta Rao9 Dec '09 - 20:29 
Before the application is launched in the control, i could see the application in separate window for a second...how can i avoid this?
GeneralRe: Really great, works perfectly after bug fix - thank you very much!membercs_can3 Apr '10 - 5:41 
Try using my routine instead of using sleep(1000)
GeneralApplication dosen't workmembertreuveni26 Sep '09 - 9:37 
Hello,
 
Can some please help me with this code?
The explorer dosen't open if the application,
What i'm doing wrong???
GeneralNice Article... But one clarification required ... Running the Code..it;s launching the custom control and IE .. separately [modified]memberNikkiee28 May '09 - 7:00 
Hi,
 
Good Shot....nice article.....
 
But running the Code, for my self I found it;s launching the custom control and IE .. separately
I tried to run the code and as a result .. running WindowsApplication1 application ..it is not launching the IE inside the user control..
But what is happing is the UI form having nothing launching first .. then the IE is launching separately outside the user control...not inside the control.
 
Have anyone noticed that.. But as per my understanding the IE shud launch inside the form as it is a Custom control.
 

Jay, can you please help me why it is happing like this ..Do I need to do something else.
I tried with VS 2005 and VS 2008 and release and debug mode of dlls...getting the same results.
Actually treating the example as a sample, I want to create one user control which would launch the Adobe Photoshop.
 
modified on Thursday, May 28, 2009 1:11 PM

GeneralRe: Nice Article... But one clarification required ... Running the Code..it;s launching the custom control and IE .. separately [modified]memberBlasterwurm10 Nov '09 - 2:18 
Problem is solved here:
http://www.codeproject.com/KB/miscctrl/AppControl.aspx?msg=3169714#xx3169714xx
 
modified on Tuesday, November 10, 2009 9:36 AM

GeneralRe: Nice Article... But one clarification required ... Running the Code..it;s launching the custom control and IE .. separately [modified]memberbencodeproject2515 Mar '11 - 11:33 
http://www.codeproject.com/KB/miscctrl/AppControl.aspx?msg=3169714#xx3169714xx
the above link doesn't have the solution for the said above problem.still it is pointing out old source not the rectified source.
 
could you please provide us the exact link where the said above problem is rectified

modified on Wednesday, March 16, 2011 9:48 AM

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 21 Dec 2004
Article Copyright 2004 by Jay Nelson
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid