C# make application inside application
create a win 32 form, add a panel named panel1 and use this code. this will not work on directx calls. form, namespace, and panel are depends on your project's name
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
public Form1()
{
InitializeComponent();
}
private void LoadApplication(string path, IntPtr handle)
{
Stopwatch sw = new Stopwatch();
sw.Start();
int timeout = 10 * 1000; // Timeout value (10s) in case we want to cancel the task if it's taking too long.
Process p = Process.Start(path);
while (p.MainWindowHandle == IntPtr.Zero)
{
System.Threading.Thread.Sleep(10);
p.Refresh();
if (sw.ElapsedMilliseconds > timeout)
{
sw.Stop();
return;
}
}
SetParent(p.MainWindowHandle, handle); // Set the process parent window to the window we want
SetWindowPos(p.MainWindowHandle, 0, 0, 0, 0, 0, 0x0001 | 0x0040); // Place the window in the top left of the parent window without resizing it
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
LoadApplication(@"notepad.exe", this.Handle);
}
}
}
0 comments: