博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Winform嵌入其它应用程序
阅读量:6166 次
发布时间:2019-06-21

本文共 10924 字,大约阅读时间需要 36 分钟。

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; }    }}
View Code

ApplicationHost:

using System;using System.ComponentModel;using System.Diagnostics;using System.Runtime.InteropServices;using System.Threading;using System.Windows.Forms;namespace SunCreate.CombatPlatform.Client{    ///     ///     ///     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 = -16;        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        ///         /// Gets or sets the m_ process.        ///         /// 
/// The m_ process. ///
private Process m_Process { get { return _process; } set { if (_process == value) return; if (value == null) UnloadProcess(); _process = value; } } #endregion #region Public Property /// /// Gets or sets the auto load process. /// ///
/// The auto load process. ///
public Boolean AutoLoadProcess { get { return _autoLoadProcess; } set { _autoLoadProcess = value; } } /// /// Gets or sets the hide application title bar. /// ///
/// The hide application title bar. ///
public Boolean HideApplicationTitleBar { get; set; } /// /// Gets or sets the file. /// ///
/// The file. ///
public string File { get { return _file ?? string.Empty; } set { _file = value; } } /// /// Gets or sets the arguments. /// ///
/// The arguments. ///
public string Arguments { get { return _arguments ?? string.Empty; } set { _arguments = value; } } /// /// Gets the main window handle. /// ///
/// The main window handle. ///
public IntPtr MainWindowHandle { get { return m_Process == null ? IntPtr.Zero : m_Process.MainWindowHandle; } } /// /// Gets the main window title. /// ///
/// The main window title. ///
public string MainWindowTitle { get { return m_Process == null ? string.Empty : m_Process.MainWindowTitle; } } #endregion #region Constructor & DeConstructor /// /// Initializes a new instance of the
class. ///
public ApplicationHost() { this.Load += ApplicationHost_Load; this.ProcessLoaded += ApplicationHost_ProcessLoaded; this.ProcessUnLoaded += ApplicationHost_ProcessUnLoaded; } /// /// Finalizes an instance of the
class. ///
~ApplicationHost() { m_Process = null; } #endregion #region Event public event EventHandler ProcessLoaded; public event EventHandler ProcessUnLoaded; #endregion #region Protected Method /// /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected override void Dispose(bool disposing) { if (disposing) { m_Process = null; } base.Dispose(disposing); } /// /// Raises the
event. ///
/// The
instance containing the event data. protected void OnProcessLoaded(EventArgs e) { if (ProcessLoaded == null) return; ProcessLoaded(this, e); } /// /// Raises the
event. ///
/// The
instance containing the event data. protected void OnProcessUnLoaded(EventArgs e) { if (ProcessUnLoaded == null) return; ProcessUnLoaded(this, e); } #endregion #region Public Method /// /// Loads the process. /// 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(100); } 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, 0, 0, this.Width, this.Height, true); OnProcessLoaded(EventArgs.Empty); } /// /// Unloads the process. /// public void UnloadProcess() { if (m_Process == null) return; if (m_Process.HasExited) return; m_Process.CloseMainWindow(); m_Process.WaitForExit(100); if (m_Process != null && !m_Process.HasExited) m_Process.Kill(); OnProcessUnLoaded(EventArgs.Empty); } /// /// Reloads the process. /// public void ReloadProcess() { UnloadProcess(); LoadProcess(); } #endregion #region Event Process /// /// Handles the Load event of the ApplicationHost control. /// /// The source of the event. /// The
instance containing the event data. void ApplicationHost_Load(object sender, EventArgs e) { if (Process.GetCurrentProcess().ProcessName.Equals("devenv", StringComparison.CurrentCultureIgnoreCase)) return; if (AutoLoadProcess) LoadProcess(); } /// /// Handles the Resize event of the ApplicationHost control. /// /// The source of the event. /// The
instance containing the event data. void ApplicationHost_Resize(object sender, EventArgs e) { var handle = m_Process.MainWindowHandle; if (handle != IntPtr.Zero) MoveWindow(handle, 0, 0, this.Width, this.Height, true); } /// /// Handles the ProcessLoaded event of the ApplicationHost control. /// /// The source of the event. /// The
instance containing the event data. void ApplicationHost_ProcessLoaded(object sender, EventArgs e) { this.Resize += ApplicationHost_Resize; } /// /// Handles the ProcessUnLoaded event of the ApplicationHost control. /// /// The source of the event. /// The
instance containing the event data. void ApplicationHost_ProcessUnLoaded(object sender, EventArgs e) { this.Resize -= ApplicationHost_Resize; } /// /// Handles the Exited event of the m_Process control. /// /// The source of the event. /// The
instance containing the event data. void m_Process_Exited(object sender, EventArgs e) { m_Process = null; OnProcessUnLoaded(EventArgs.Empty); } #endregion }}
View Code

代码:

private void ShowBrowser(string url){    if (dkPnl.Children.Count > 0)    {        WindowsFormsHost whst = dkPnl.Children[0] 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
_hostPool;private Dictionary
m_HostPool{ get { return _hostPool ?? (_hostPool = new Dictionary
()); }}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(); }}
View Code

 

转载于:https://www.cnblogs.com/s0611163/p/7716075.html

你可能感兴趣的文章
架构师之路(一)- 什么是软件架构
查看>>
DEV实现日期时间效果
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
android防止内存溢出浅析
查看>>
Android Jni调用浅述
查看>>
Spring常用注解
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
java学习:jdbc连接示例
查看>>
Exchange 2013 PowerShell配置文件
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
7.对象创建型模式-总结
查看>>
6.13心得
查看>>
java父子进程通信
查看>>
Java集合---HashMap源码剖析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
用tar和split将文件分包压缩
查看>>
Linux磁盘分区与挂载
查看>>
大数据传输,文件传输的专业解决方案!
查看>>
常用URL地址
查看>>