c#自定义控件winform将其它应用程序窗体嵌入自己内部

c#自定义控件winform将其它应用程序窗体嵌入自己内部

ID:8969074

大小:899.09 KB

页数:9页

时间:2018-04-13

c#自定义控件winform将其它应用程序窗体嵌入自己内部_第1页
c#自定义控件winform将其它应用程序窗体嵌入自己内部_第2页
c#自定义控件winform将其它应用程序窗体嵌入自己内部_第3页
c#自定义控件winform将其它应用程序窗体嵌入自己内部_第4页
c#自定义控件winform将其它应用程序窗体嵌入自己内部_第5页
资源描述:

《c#自定义控件winform将其它应用程序窗体嵌入自己内部》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题)。在codeproject找到了一篇相关的文章(http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project),虽然可用,但是很不方便,于是重新设计编写了一个类库,用一个

2、控件完成内嵌其它应用程序的功能。直接上图先: 从打开AdobeReader那张图片可以看出来所谓的“内嵌程序和宿主程序的窗口激活状态问题”。当内嵌程序窗口激活时,表面上将其包裹起来的宿主窗口却处于非激活的状态。想隐藏这一点的话,把窗口的FormBorderStyle属性设为None吧,然后自己在窗口上画关闭、最大化、最小化按钮好了。 原作者的实现思路更能暴露本质,所以这里用原作者的代码段解释一下实现过程。1、启动要嵌入的应用程序进程1Processp=null;2try3{4//Starttheprocess5p=System.Diag

3、nostics.Process.Start(this.exeName);67//Waitforprocesstobecreatedandenteridlecondition8p.WaitForInputIdle();910//Getthemainhandle11appWin=p.MainWindowHandle;12}13catch(Exceptionex)14{15MessageBox.Show(this,ex.Message,"Error");16}2、调用WindowsAPI将启动的应用程序窗口嵌入自定义的控件(作者用的是Pane

4、l控件)1//Putitintothisform2SetParent(appWin,this.Handle);//this在这里是Panel控件34//Removeborderandwhatnot5SetWindowLong(appWin,GWL_STYLE,WS_VISIBLE);67//Movethewindowtooverlayitonthiswindow8MoveWindow(appWin,0,0,this.Width,this.Height,true);3、设置被嵌入的窗体大小随宿主窗体改变1protectedoverride

5、voidOnResize(EventArgse)2{3if(this.appWin!=IntPtr.Zero)4{5MoveWindow(appWin,0,0,this.Width,this.Height,true);6}7base.OnResize(e);8}4、设置被嵌入的窗体应用程序在宿主程序关闭时也关闭1protectedoverridevoidOnHandleDestroyed(EventArgse)2{3//Stoptheapplication4if(appWin!=IntPtr.Zero)5{6//Postacolseme

6、ssage7PostMessage(appWin,WM_CLOSE,0,0);89//Delayforittogetthemessage10System.Threading.Thread.Sleep(1000);1112//Clearinternalhandle13appWin=IntPtr.Zero;14}15base.OnHandleDestroyed(e);16} 原作者的代码实际用起来是很不方便的,具体大家试试就知道,不细说了(反正我只学了学上面的步骤,也不用他的库)。本人开发了一个比较实用的控件,使用起来也很简单,只需三步。首

7、先,在窗体应用程序项目中引用类库SmileWei.EmbeddedApp。然后,在宿主窗体上拖一个AppContainer控件,摆放好位置。(如果工具箱里没有AppContainer,就F6生成解决方案一下,然后再看就有了。)最后,告诉AppContainer控件,要嵌入的应用程序(*.exe文件)的绝对路径(本人以使用OpenFileDialog为例),命令AppContainer控件启动之。1appContainer1.AppFilename=openEXE.FileName;2appContainer1.Start();这个App

8、Container控件有什么好处呢?1、原作者想到的Resize和随宿主程序关闭而关闭的问题,AppContainer都实现了。2、AppContainer指定要嵌入的应用程序和启动是分开的,这样更灵活,开

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。