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

Code to Host a Third Party Application in our Process Window (e.g. Google Chrome, Internet Explorer 8)

, 15 Aug 2010
Rate this:
Please Sign up or sign in to vote.
This code shows how to host a third party application inside your own process Window, like Google Chrome & Internet Explorer 8

Introduction

This code shows how to host a third party application UI in your application's Window. In the sample application given below, NOTEPAD.EXE will be hosted in my process. The NOTEPAD application is also made to resize itself whenever our application is resized. Likewise any GUI application can be hosted in a separate process. For delayed GUI application, the hosting process has to wait till the MainWindow of the hosted process is created, hence as an alternative, I have used Thread.Sleep to wait for a second or two. The sample application can be downloaded from here.

Application_UI.jpg

Advantages

  1. The lifetime of the Hosted process can be managed within the hosting process.
  2. If the hosted process crashes, it can be handled appropriately.

  3. This kind of hosting and managing process can be very useful for watchdog kind of applications, wherein if the hosted process goes down or crashes, then it can be brought up again. Again all these are done within one Window.
  4. With some Window coordinate calculations, the hosted application can be tiled/cascaded, etc.

Examples

The famous Google Chrome, Internet Explorer 8, where-in each tab of the Internet Explorer/Chrome Window is a process. I have hosted GUIs in splitter window, whereas Internet Explorer 8/Chrome have them hosted in Tabs.

Using the Code

Two Win32 APIs are used to host a 3rd part application's Window in our process:

SetParent and SetWindowPos

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, 
	int X, int Y, int cx, int cy, uint uFlags);

SetParent API is used to set the parent of the 3rd party application's main Window handle. In this case, my application's window handle is the parent of the 3rd party application's (Notepad.exe) main window.

SetParent(p.MainWindowHandle, this.splitContainer2.Panel1.Handle);        

SetWindowPos API is used to resize the 3rd party application's Window whenever our application is resized.

SetWindowPos(p.MainWindowHandle, HWND_TOP, 
	this.splitContainer2.Panel1.ClientRectangle.Left, 
this.splitContainer2.Panel1.ClientRectangle.Top,
	this.splitContainer2.Panel1.ClientRectangle.Width,
this.splitContainer2.Panel1.ClientRectangle.Height, SWP_NOACTIVATE | SWP_SHOWWINDOW);

Points of Interest

Any GUI application can be hosted in a separate process. The advantage of this is, if the GUI application crashes, the application that is hosting it still remains, it can take appropriate action. I was not able to host some of the applications like Internet Explorer (Iexplore.exe), Microsoft Word (winword.exe) into my own application's Window. To host these processes, I had to wait for a second (call Thread.Sleep(1000)) after WaitForInputIdle function is called. I really don't know the reason behind it. Please let me know if you know the reason.

History

  • 16th August, 2010: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Sharan Basappa
Team Leader
India India
He is a graduate, currently working as a Software Engineer in Bangalore, India. You can reach him at sharan34@yahoo.com

Comments and Discussions

 
GeneralMy vote of 1 Pinmembertinku5nov9-May-13 1:55 
QuestionAwesome Pinmemberlkdgnsl11-Jan-13 11:21 
QuestionIs this possible in Java please? Pinmemberdrequinox6-Jun-12 0:21 
GeneralMy vote of 5 PinmemberLidran3-Mar-11 8:31 
GeneralNOT WORKING ON OTHER EXE FILE as mdichild form PinmemberR&D_Man17-Oct-10 23:10 
GeneralMy vote of 2 PinmemberBooGhost15-Oct-10 8:00 
GeneralMy vote of 5 PinmemberS.H.Bouwhuis24-Aug-10 7:37 
GeneralTake a look at this... PinmemberRV Williams23-Aug-10 22:47 
GeneralMy vote of 3 Pinmemberkarabax16-Aug-10 5:50 
GeneralNice PinmemberManjunath Govindaraju16-Aug-10 0:23 
GeneralAny application.. PinmemberAjay Vijayvargiya15-Aug-10 16:52 
GeneralRe: Any application.. PinmemberSharan Basappa15-Aug-10 18:55 
GeneralRe: Any application.. Pinmembercara_ionutz12-Aug-12 7:38 
GeneralA basic tip PinmentorTrollslayer12-Aug-10 19:48 
GeneralRe: A basic tip PinmemberSharan Basappa12-Aug-10 23:03 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.140827.1 | Last Updated 16 Aug 2010
Article Copyright 2010 by Sharan Basappa
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid