Options:

using CommandLine;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SunCreate.CombatPlatform.Client
{
public class Options
{
[Option("h", "handle", Required = true)]
public int Handle { get; set; } [Option("b", "browser")]
public Boolean IsBrowser { get; set; }
} }

ApplicationHost:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms; namespace SunCreate.CombatPlatform.Client
{
/// <summary>
///
/// </summary>
public class ApplicationHost : UserControl
{
#region PInvoke
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [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 = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);
#endregion #region Const
private const int GWL_STYLE = -;
private const int WS_VISIBLE = 0x10000000;
#endregion #region Var
private Boolean _autoLoadProcess = true;
private Process _process;
private string _file;
private string _arguments;
#endregion #region Private Property
/// <summary>
/// Gets or sets the m_ process.
/// </summary>
/// <value>
/// The m_ process.
/// </value>
private Process m_Process
{
get
{
return _process;
}
set
{
if (_process == value)
return; if (value == null)
UnloadProcess(); _process = value;
}
}
#endregion #region Public Property
/// <summary>
/// Gets or sets the auto load process.
/// </summary>
/// <value>
/// The auto load process.
/// </value>
public Boolean AutoLoadProcess
{
get
{
return _autoLoadProcess;
}
set
{
_autoLoadProcess = value;
}
} /// <summary>
/// Gets or sets the hide application title bar.
/// </summary>
/// <value>
/// The hide application title bar.
/// </value>
public Boolean HideApplicationTitleBar { get; set; } /// <summary>
/// Gets or sets the file.
/// </summary>
/// <value>
/// The file.
/// </value>
public string File
{
get
{
return _file ?? string.Empty;
}
set
{
_file = value;
}
} /// <summary>
/// Gets or sets the arguments.
/// </summary>
/// <value>
/// The arguments.
/// </value>
public string Arguments
{
get
{
return _arguments ?? string.Empty;
}
set
{
_arguments = value;
}
} /// <summary>
/// Gets the main window handle.
/// </summary>
/// <value>
/// The main window handle.
/// </value>
public IntPtr MainWindowHandle
{
get
{
return m_Process == null ? IntPtr.Zero : m_Process.MainWindowHandle;
}
} /// <summary>
/// Gets the main window title.
/// </summary>
/// <value>
/// The main window title.
/// </value>
public string MainWindowTitle
{
get
{
return m_Process == null ? string.Empty : m_Process.MainWindowTitle;
}
}
#endregion #region Constructor & DeConstructor
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationHost" /> class.
/// </summary>
public ApplicationHost()
{
this.Load += ApplicationHost_Load;
this.ProcessLoaded += ApplicationHost_ProcessLoaded;
this.ProcessUnLoaded += ApplicationHost_ProcessUnLoaded;
} /// <summary>
/// Finalizes an instance of the <see cref="ApplicationHost" /> class.
/// </summary>
~ApplicationHost()
{
m_Process = null;
}
#endregion #region Event
public event EventHandler ProcessLoaded;
public event EventHandler ProcessUnLoaded;
#endregion #region Protected Method
/// <summary>
/// </summary>
/// <param name="disposing">true to release both managed and unmanaged resources; false to release only unmanaged resources.</param>
protected override void Dispose(bool disposing)
{
if (disposing)
{
m_Process = null;
}
base.Dispose(disposing);
} /// <summary>
/// Raises the <see cref="E:ProcessLoaded" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected void OnProcessLoaded(EventArgs e)
{
if (ProcessLoaded == null)
return;
ProcessLoaded(this, e);
} /// <summary>
/// Raises the <see cref="E:ProcessUnLoaded" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected void OnProcessUnLoaded(EventArgs e)
{
if (ProcessUnLoaded == null)
return;
ProcessUnLoaded(this, e);
}
#endregion #region Public Method
/// <summary>
/// Loads the process.
/// </summary>
public void LoadProcess()
{
if (m_Process != null)
{
var startInfo = m_Process.StartInfo;
if (startInfo.FileName != this.File || startInfo.Arguments != this.Arguments)
m_Process = null;
else
return;
} m_Process = new Process()
{
SynchronizingObject = this,
StartInfo = new ProcessStartInfo()
{
FileName = File,
Arguments = this.Arguments
}
}; m_Process.Start(); m_Process.WaitForInputIdle();
while (!m_Process.HasExited && m_Process.MainWindowHandle == IntPtr.Zero)
{
Application.DoEvents();
Thread.Sleep();
} m_Process.EnableRaisingEvents = true; m_Process.Exited += m_Process_Exited; var handle = m_Process.MainWindowHandle; if (HideApplicationTitleBar)
SetWindowLong(handle, GWL_STYLE, WS_VISIBLE); SetParent(handle, this.Handle); MoveWindow(handle, , , this.Width, this.Height, true); OnProcessLoaded(EventArgs.Empty);
} /// <summary>
/// Unloads the process.
/// </summary>
public void UnloadProcess()
{
if (m_Process == null)
return; if (m_Process.HasExited)
return; m_Process.CloseMainWindow();
m_Process.WaitForExit(); if (m_Process != null && !m_Process.HasExited)
m_Process.Kill(); OnProcessUnLoaded(EventArgs.Empty);
} /// <summary>
/// Reloads the process.
/// </summary>
public void ReloadProcess()
{
UnloadProcess();
LoadProcess();
}
#endregion #region Event Process
/// <summary>
/// Handles the Load event of the ApplicationHost control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void ApplicationHost_Load(object sender, EventArgs e)
{
if (Process.GetCurrentProcess().ProcessName.Equals("devenv", StringComparison.CurrentCultureIgnoreCase))
return; if (AutoLoadProcess)
LoadProcess();
} /// <summary>
/// Handles the Resize event of the ApplicationHost control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void ApplicationHost_Resize(object sender, EventArgs e)
{
var handle = m_Process.MainWindowHandle; if (handle != IntPtr.Zero)
MoveWindow(handle, , , this.Width, this.Height, true);
} /// <summary>
/// Handles the ProcessLoaded event of the ApplicationHost control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void ApplicationHost_ProcessLoaded(object sender, EventArgs e)
{
this.Resize += ApplicationHost_Resize;
} /// <summary>
/// Handles the ProcessUnLoaded event of the ApplicationHost control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void ApplicationHost_ProcessUnLoaded(object sender, EventArgs e)
{
this.Resize -= ApplicationHost_Resize;
} /// <summary>
/// Handles the Exited event of the m_Process control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void m_Process_Exited(object sender, EventArgs e)
{
m_Process = null; OnProcessUnLoaded(EventArgs.Empty);
}
#endregion
}
}

代码:

private void ShowBrowser(string url)
{
if (dkPnl.Children.Count > )
{
WindowsFormsHost whst = dkPnl.Children[] as WindowsFormsHost;
whst.Dispose();
foreach (Process p in Process.GetProcessesByName("MyBrowser"))
{
p.Kill();
}
} var host = new ApplicationHost()
{
File = @"MyBrowser.exe",
Arguments = string.Empty,
HideApplicationTitleBar = true,
Dock = System.Windows.Forms.DockStyle.Fill,
BorderStyle = System.Windows.Forms.BorderStyle.None
};
host.ProcessLoaded += host_ProcessLoaded;
host.ProcessUnLoaded += host_ProcessUnLoaded; WindowsFormsHost windowsFormsHost = new WindowsFormsHost();
windowsFormsHost.Child = host;
dkPnl.Children.Add(windowsFormsHost);
} private Dictionary<IntPtr, ApplicationHost> _hostPool;
private Dictionary<IntPtr, ApplicationHost> m_HostPool
{
get
{
return _hostPool ?? (_hostPool = new Dictionary<IntPtr, ApplicationHost>());
}
} void host_ProcessLoaded(object sender, EventArgs e)
{
var host = sender as ApplicationHost;
m_HostPool.Add(host.MainWindowHandle, host);
} void host_ProcessUnLoaded(object sender, EventArgs e)
{
var host = sender as ApplicationHost; var parent = host.Parent;
if (parent != null && !parent.IsDisposed)
{
parent.Dispose();
}
}

Winform嵌入其它应用程序的更多相关文章

  1. 在winform嵌入外部应用程序

    应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...

  2. C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部【转载】

    这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...

  3. 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部

    PS:文末的附件已更新,这次我放到博客园里面了,不会弹出广告,放心下载,O(∩_∩)O谢谢! 这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开 ...

  4. C# winform嵌入unity3D

    最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘 ...

  5. 把任意的EXE嵌入到自己程序中

    把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传   Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...

  6. Qt界面中嵌入其他exe程序的界面,使用Qt5

    下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...

  7. WPF中嵌入普通Win32程序的方法

    公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...

  8. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

  9. WinForm之窗体应用程序

    WinForm之窗体应用程序 基本简单数据库操作(增删改查) using System; using System.Collections.Generic; using System.Windows. ...

随机推荐

  1. instr 函数从后往前计数 instr(spell,' ',-1)

    update CY set last=substr(spell,instr(spell,' ',-1));

  2. 31_java之项目中的数据库操作

    01项目训练目标 * A: 项目训练目标 * a: 项目目标 * 综合运用前面所学习的知识点 * 熟练View层.Service层.Dao层之间的方法相互调用操作. * 熟练dbutils操作数据库表 ...

  3. Vue项目中将table组件导出Excel表格以及打印页面内容

    体验更优排版请移步原文:http://blog.kwin.wang/programming/vue-table-export-excel-and-print.html 页面中显示的table表格,经常 ...

  4. VB.NET 指针

    在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy.PtrToStringUni .PtrToStructure .OffsetOf.WriteXXX,Rrea ...

  5. 带参数setTimeout

    /*         功能:修改 window.setTimeout,使之可以传递参数和对象参数         使用方法: window.setTimeout(回调函数,时间,参数1,,参数n)   ...

  6. ffmpeg默认输出中文为 UTF-8

    在使用ffmpeg 进行对音视频文件解码输出信息的时候会出现乱码. 从网上找到了说ffmpeg默认格式 为 utf-8 如果vs工程使用的的 Unicode 则需要将 utf-8转 Unicode 才 ...

  7. 发布spring jar包, 报错

    org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Una ...

  8. Cloudera Manger CDH 安装文档

    简介: Cloudera Manager 是 Cloudera 公司推出的 Hadoop 集群管理工具,通过该管理工具可以方便的部署.配置.监控集群. Cloudera 公司自己发布的 Hadoop ...

  9. 介绍MVC编程架构模式

    MVC(Model/View/Controller)模式是国外用得比较多的一种框架模式,最早是在Smaltalk中出现.MVC包括三类对象. Model——是应用对象 View——是它在屏幕上的表示 ...

  10. 2015年传智播客JavaEE 第168期就业班视频教程03-ERP简介(2)

    资源管理这块的东西大家基本上能够猜个差不多了.下面描述描述计划.计划这个东西把企业资源这个东西提升了不只十倍二十倍了.ERP的核心是计划,但是这次我们做是不做计划的.今年我们是一个生产型企业,我们要开 ...