参考网址:https://www.cnblogs.com/xiaoa/p/4308573.html
https://max.book118.com/html/2017/0706/120670327.shtm
主要的代码部分
[DllImport("user32.dll", SetLastError=true)]
private static extern long SetParent (IntPtr hWndChild, IntPtr hWndNewParent);
Process p = new Process();
p.StartInfo.FileName = "cmd.exe ";
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;//设置程序样式
p.Start();
SetParent(p.MainWindowHandle, this.Handle); //改变p的父窗口句柄为本程序句柄
ShowWindow(p.MainWindowHandle, 3);//第一个参数窗口句柄,第二个参数 指定窗口如何显示
以备不时之需。
using System;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace AppControl
{
///
/// Application Display Control
///
[
ToolboxBitmap(typeof(ApplicationControl), "AppControl.bmp"),
]
public class ApplicationControl : System.Windows.Forms.Panel
{
///
/// Track if the application has been created
///
bool created = false;
///
/// Handle to the application Window
///
IntPtr appWin;
///
/// The name of the exe to launch
///
private string exeName = System.IO.Directory.GetCurrentDirectory()+"/agoratutorial.exe";
///
/// Get/Set if we draw the tick marks
///
[
Category("Data"),
Description("Name of the executable to launch"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)
]
public string ExeName
{
get
{
return exeName;
}
set
{
exeName = value;
}
}
///
/// Constructor
///
public ApplicationControl()
{
}
[DllImport("user32.dll", EntryPoint="GetWindowThreadProcessId", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);
[DllImport("user32.dll", SetLastError=true)]
private static extern IntPtr FindWindow (string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError=true)]
private static extern long SetParent (IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", EntryPoint="GetWindowLongA", SetLastError=true)]
private static extern long GetWindowLong (IntPtr hwnd, int nIndex);
[DllImport("user32.dll", EntryPoint="SetWindowLongA", SetLastError=true)]
private static extern long SetWindowLong (IntPtr hwnd, int nIndex, long dwNewLong);
[DllImport("user32.dll", SetLastError=true)]
private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);
[DllImport("user32.dll", SetLastError=true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("user32.dll", EntryPoint="PostMessageA", SetLastError=true)]
private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
private const int SWP_NOOWNERZORDER = 0x200;
private const int SWP_NOREDRAW = 0x8;
private const int SWP_NOZORDER = 0x4;
private const int SWP_SHOWWINDOW = 0x0040;
private const int WS_EX_MDICHILD = 0x40;
private const int SWP_FRAMECHANGED = 0x20;
private const int SWP_NOACTIVATE = 0x10;
private const int SWP_ASYNCWINDOWPOS = 0x4000;
private const int SWP_NOMOVE = 0x2;
private const int SWP_NOSIZE = 0x1;
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private const int WM_CLOSE = 0x10;
private const int WS_CHILD = 0x40000000;
///
/// Force redraw of control when size changes
///
/// Not used
protected override void OnSizeChanged(EventArgs e)
{
this.Invalidate();
base.OnSizeChanged (e);
}
///
/// Creeate control when visibility changes
///
/// Not used
protected override void OnVisibleChanged(EventArgs e)
{
// If control needs to be initialized/created
if (created == false)
{
// Mark that control is created
created = true;
// Initialize handle value to invalid
appWin = IntPtr.Zero;
// Start the remote application
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");
}
// 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);
}
base.OnVisibleChanged (e);
}
///
///
///
///
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);
}
///
/// Update display of the executable
///
/// Not used
protected override void OnResize(EventArgs e)
{
if (this.appWin != IntPtr.Zero)
{
MoveWindow(appWin, 0, 0, this.Width, this.Height, true);
}
base.OnResize (e);
}
}
}