Winform嵌入其它应用程序
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嵌入其它应用程序的更多相关文章
- 在winform嵌入外部应用程序
应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...
- C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部【转载】
这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...
- 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
PS:文末的附件已更新,这次我放到博客园里面了,不会弹出广告,放心下载,O(∩_∩)O谢谢! 这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开 ...
- C# winform嵌入unity3D
最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘 ...
- 把任意的EXE嵌入到自己程序中
把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传 Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...
- Qt界面中嵌入其他exe程序的界面,使用Qt5
下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...
- WPF中嵌入普通Win32程序的方法
公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...
- SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework
9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...
- WinForm之窗体应用程序
WinForm之窗体应用程序 基本简单数据库操作(增删改查) using System; using System.Collections.Generic; using System.Windows. ...
随机推荐
- latex如何插入空白行
1.~\\:一行空白2.\\[行距]:可加入任意间距的空白行 [xpt]
- IOS CGAffineTransform 用于视图平移,放缩,旋转
转载于:http://blog.csdn.net/lc_obj/article/details/17454825 CGAffineTransform 今天碰到了一个旋转放缩图片的一个demo,在看的过 ...
- linux shell脚本编程笔记(四): 获取字符串长度的七种方法
获取字符串长度的七种方法 1. \${#str} 2.awk的length 备注:1) 最好用{}来放置变量2) 也可以用length($0)来统计文件中每行的长度 3.awk的NF 备注: -F为分 ...
- react native 触摸Touchable***的区别(TouchableWithoutFeedback、TouchableOpacity、TouchableHighlight、TouchableNativeFeedback)
一.问题背景: react native的跨平台开发没有button的概念,而是使用touchable系列实现点击触发效果. 而touchable系列就有四个之多,而且相互之间仍有较大差别,这就给我们 ...
- 第一个独特字符位置 · first position unique character
[抄题]: 给出一个字符串.找到字符串中第一个不重复的字符然后返回它的下标.如果不存在这样的字符,返回 -1. 给出字符串 s = "lintcode",返回 0.给出字符串 s ...
- Halcon中的坐标系特点及XLD的镜像转换
我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角.那么Halcon中坐标系和一般的二维坐标系有什么区别呢?我通过下面这个例子来分析. gen_image_const ...
- Golang之struct
1.用来定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分. 4.struct类型是值类型 5.struct类型可以嵌套 6.Go语言没 ...
- CentOS7下NFS服务安装及配置
系统环境:CentOS Linux release 7.4.1708 (Core) 3.10.0-693.el7.x86_64 软件版本:nfs-utils-1.3.0-0.48.el7_4.x86_ ...
- 2.QWidget类
简述: QWidget类是所有用户界面对象的基类. Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己. 每个Widget都是矩形的,它们按照Z-order进行 ...
- 生产消费者队列(TaskCompletionSource)的应用
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Li ...