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. ...
随机推荐
- 前端之promise
Promise是一个非常重要的方法,它可以是一些异步操作最后归为有序的进行. url: from django.contrib import admin from django.urls import ...
- Vue项目中将table组件导出Excel表格以及打印页面内容
体验更优排版请移步原文:http://blog.kwin.wang/programming/vue-table-export-excel-and-print.html 页面中显示的table表格,经常 ...
- IOS 证书失效
IOS 证书失效,能选择ppf,选择不了证书. [Error] No certificate found in provisioning profile "aee9b804-bc71-4ce ...
- Java Graphics 2D绘制图片 在Liunx上乱码
绘图的代码工具类 package com.gwzx.framework.captcha; import java.awt.Color; import java.awt.Font; import jav ...
- Openstack 组件简介
1. Nova 计算服务: 负责承载和管理云计算系统 其中nova-compute service 通过调用Hypervisor APIs创建和终止虚拟机实例. 虚拟化技术: KVM和Xen 2. N ...
- ios 获取当前wifi名称
ios5之前可以通过读取配置文件获取,ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConfiguration/WiFi ...
- Django基础学习四_数据库的增删改查
今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...
- 27-python 画图
绝佳教程:http://pyecharts.org/#/zh-cn/prepare?id=%E4%BD%BF%E7%94%A8%E4%B8%BB%E9%A2%98安装 pyecharts pip in ...
- Qt Thread
Threading Classes (Qt help manual key words) These Qt Core classes provide threading support to appl ...
- Qt Read and Write Csv File
This page discusses various available options for working with csv documents in your Qt application. ...