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

本文共 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

你可能感兴趣的文章
js 判断是否选中
查看>>
svn提交时强制注释
查看>>
ecshop 活动-》红包
查看>>
linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)
查看>>
js中的string.format函数代码
查看>>
Too many levels of symbolic links 问题
查看>>
Sql Server来龙去脉系列 必须知道的权限控制基础篇
查看>>
[翻译] CSStickyHeaderFlowLayout
查看>>
Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
查看>>
java_easyui体系之DataGrid(2)[转]
查看>>
Using View and Data API with Meteor
查看>>
SVN同步出现故障
查看>>
【CodeForces 620D】Professor GukiZ and Two Arrays
查看>>
[Git] --no-verify
查看>>
阿里云Ubuntu部署java web(2) - 配置tomcat
查看>>
TexturePacker 算法
查看>>
对象化的Http和请求对象HttpRequest
查看>>
Codeforces Round #312 (Div. 2) ABC题解
查看>>
INBOUND_CONNECT_TIMEOUT与SQLNET.INBOUND_CONNECT_TIMEOUT小结
查看>>
LeetCode:Palindrome Number
查看>>