日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部

發(fā)布時(shí)間:2023/12/19 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PS:文末的附件已更新,這次我放到博客園里面了,不會(huì)彈出廣告,放心下載,O(∩_∩)O謝謝!

這是最近在做的一個(gè)項(xiàng)目中提到的需求,把一個(gè)現(xiàn)有的窗體應(yīng)用程序界面嵌入到自己開發(fā)的窗體中來,看起來就像自己開發(fā)的一樣(實(shí)際上……跟自己開發(fā)的還是有一點(diǎn)點(diǎn)區(qū)別的,就是內(nèi)嵌程序和宿主程序的窗口激活狀態(tài)問題)。

在codeproject找到了一篇相關(guān)的文章(http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project),雖然可用,但是很不方便,于是重新設(shè)計(jì)編寫了一個(gè)類庫,用一個(gè)控件完成內(nèi)嵌其它應(yīng)用程序的功能。

直接上圖先:

??

?

從打開Adobe Reader那張圖片可以看出來所謂的“內(nèi)嵌程序和宿主程序的窗口激活狀態(tài)問題”。當(dāng)內(nèi)嵌程序窗口激活時(shí),表面上將其包裹起來的宿主窗口卻處于非激活的狀態(tài)。想隱藏這一點(diǎn)的話,把窗口的FormBorderStyle屬性設(shè)為None吧,然后自己在窗口上畫關(guān)閉、最大化、最小化按鈕好了。

?

原作者的實(shí)現(xiàn)思路更能暴露本質(zhì),所以這里用原作者的代碼段解釋一下實(shí)現(xiàn)過程。

1、啟動(dòng)要嵌入的應(yīng)用程序進(jìn)程

1 Process p = null; 2 try 3 { 4 // Start the process 5 p = System.Diagnostics.Process.Start(this.exeName); 6 7 // Wait for process to be created and enter idle condition 8 p.WaitForInputIdle(); 9 10 // Get the main handle 11 appWin = p.MainWindowHandle; 12 } 13 catch (Exception ex) 14 { 15 MessageBox.Show(this, ex.Message, "Error"); 16 }

2、調(diào)用Windows API將啟動(dòng)的應(yīng)用程序窗口嵌入自定義的控件(作者用的是Panel控件)

1 // Put it into this form 2 SetParent(appWin, this.Handle);//this在這里是Panel控件

3 4 // Remove border and whatnot 5 SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE); 6 7 // Move the window to overlay it on this window 8 MoveWindow(appWin, 0, 0, this.Width, this.Height, true);

3、設(shè)置被嵌入的窗體大小隨宿主窗體改變

1 protected override void OnResize(EventArgs e) 2 { 3 if (this.appWin != IntPtr.Zero) 4 { 5 MoveWindow(appWin, 0, 0, this.Width, this.Height, true); 6 } 7 base.OnResize (e); 8 }

4、設(shè)置被嵌入的窗體應(yīng)用程序在宿主程序關(guān)閉時(shí)也關(guān)閉

1 protected override void OnHandleDestroyed(EventArgs e) 2 { 3 // Stop the application 4 if (appWin != IntPtr.Zero) 5 { 6 // Post a colse message 7 PostMessage(appWin, WM_CLOSE, 0, 0); 8 9 // Delay for it to get the message 10 System.Threading.Thread.Sleep(1000); 11 12 // Clear internal handle 13 appWin = IntPtr.Zero; 14 } 15 base.OnHandleDestroyed (e); 16 }

?

原作者的代碼實(shí)際用起來是很不方便的,具體大家試試就知道,不細(xì)說了(反正我只學(xué)了學(xué)上面的步驟,也不用他的庫)。

本人開發(fā)了一個(gè)比較實(shí)用的控件,使用起來也很簡(jiǎn)單,只需三步。

首先,在窗體應(yīng)用程序項(xiàng)目中引用類庫SmileWei.EmbeddedApp。

然后,在宿主窗體上拖一個(gè)AppContainer控件,擺放好位置。(如果工具箱里沒有AppContainer,就F6生成解決方案一下,然后再看就有了。)

最后,告訴AppContainer控件,要嵌入的應(yīng)用程序(*.exe文件)的絕對(duì)路徑(本人以使用OpenFileDialog為例),命令A(yù)ppContainer控件啟動(dòng)之。

1 appContainer1.AppFilename = openEXE.FileName; 2 appContainer1.Start();

這個(gè)AppContainer控件有什么好處呢?

1、原作者想到的Resize和隨宿主程序關(guān)閉而關(guān)閉的問題,AppContainer都實(shí)現(xiàn)了。

2、AppContainer指定要嵌入的應(yīng)用程序和啟動(dòng)是分開的,這樣更靈活,開發(fā)過程中也不會(huì)看到如下的情況了:開發(fā)的時(shí)候原作者的控件就“情不自禁”地把內(nèi)嵌程序加載進(jìn)來了。

?

3、AppContainer防范了各種可能出錯(cuò)的情形,例如禁止自己嵌入自己(死循環(huán))、內(nèi)嵌Console程序時(shí)提示不能嵌入、參數(shù)為null或無效的檢驗(yàn)等。

4、其它。例如,AppContainer里面不會(huì)使用Thread.Sleep(1000);這樣低端的句子來保證程序正確地嵌入(而且對(duì)于類似photoshop這樣啟動(dòng)很慢的程序也保證不了),而是通過Application.Ilde事件實(shí)現(xiàn)了在被嵌程序加載完畢后才將其窗體嵌入的技巧。

當(dāng)然,有些應(yīng)用程序是不能這么自動(dòng)化地嵌入進(jìn)來的。因?yàn)槌绦騿?dòng)窗體和主窗體句柄不一樣,AppContainer無法獲得主窗體句柄,所以無法自動(dòng)嵌入。

為了解決這個(gè)問題,我在宿主窗體的狀態(tài)欄上設(shè)置了“句柄嵌入”標(biāo)簽,點(diǎn)擊“句柄嵌入”,你可以填入想嵌入的應(yīng)用程序主窗體句柄,然后宿主窗體就可以嵌入它了。

然后有同學(xué)就問了,我怎么知道想要嵌入的窗體句柄是多少啊?方法很多啦,我這里也提供一個(gè)自己制作的小程序,大家可以在這里下載:WindowDetective(窗口偵探)0.20.rar

界面是這個(gè)樣子的:

里面“句柄:{1903014}”那一行就給出了本人正在用的Windows Live Writer的主窗體句柄。

用法很簡(jiǎn)單,啟動(dòng)這個(gè)程序后,它會(huì)自動(dòng)檢測(cè)鼠標(biāo)所在位置的窗體信息,顯示在窗口中。所以把鼠標(biāo)放在你想了解的窗體菜單欄上就OK了。QQ TM版也可以這樣嵌進(jìn)來滴。(QQ嵌不進(jìn)來,不知道騰訊在搞什么)

大家還可以試試把QQ對(duì)話框嵌進(jìn)來,很好玩哦~

?

?

我的源代碼都給出了明確的注釋,類型、變量名也都規(guī)范易懂,在此不再多做解釋了,有疑問請(qǐng)留言吧O(∩_∩)O

本文所有源代碼、可執(zhí)行程序均可在下面列出的鏈接中下載到。

示例宿主程序及類庫源代碼:SmileWei.EmbeddedApp.rar

示例宿主程序可執(zhí)行文件(及必需的類庫):SmileWei.EmbeddedApp.EXE.rar

窗口偵探(用于查看窗口句柄):WindowDetective(窗口偵探)0.20.rar


轉(zhuǎn)載請(qǐng)注明出處,http://www.cnblogs.com/bitzhuwei/archive/2012/05/24/SmileWei_EmbeddedApp.htmlO(∩_∩)O謝謝

?

轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3163108.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的【转】C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产专区第一页 | 精品动漫一区二区三区在线观看 | av一级二级 | 特级淫片裸体免费看冫 | 国产亚洲精品网站 | 牛av| 中文字幕在线观看一区二区三区 | 午夜寂寞福利 | 国产调教一区 | 欧美一区二区三区在线看 | 三级av毛片 | 国产精品无码免费在线观看 | 欧美偷拍一区二区三区 | 丰满雪白极品少妇流白浆 | 日本三级韩国三级三级a级中文 | 精品成人国产 | 三级a级片| 国产成人小视频在线观看 | 日韩一级二级 | 国模大尺度视频 | 5个黑人躁我一个视频 | 深夜视频在线 | 国产麻豆精品一区二区 | 久久四色| 天天射综合网站 | 欧美日韩精品在线观看视频 | 91色啪 | 日韩av一区二区三区在线观看 | 国产精品主播 | xxxx日本少妇 | 久久爱99| 国产山村乱淫老妇女视频 | 超碰成人网| 国产亚洲精品精品国产亚洲综合 | 亚洲精品久久久久久久蜜桃臀 | 亚洲视频国产精品 | 跪求黄色网址 | 久久成人亚洲 | 短篇山村男同肉耽h | 欧日韩精品 | 亚洲女人天堂成人av在线 | 免费污片软件 | 疯狂做爰的爽文多肉小说王爷 | 97一级片| 性生交大片免费看3p | 激情三级在线 | 日韩欧美亚| 久久99久久99精品蜜柚传媒 | 中国av在线 | 在线观看xxxx | 美国式禁忌1980 | 亚洲av无码国产精品久久久久 | 亚洲精品综合精品自拍 | 精品孕妇一区二区三区 | 久久久久久久久久久久久久久久久久 | 国产免费无码一区二区视频 | 国产精品免费视频观看 | 亚洲精品第三页 | 捆绑束缚调教 | 九一亚洲精品 | 真人毛片97级无遮挡精品 | 6090伦理| 日韩av综合网站 | 亚洲成人久久久久 | 精品人妻在线一区二区三区 | 国产欧美久久久 | 日日干夜夜骑 | 精品人妻无码一区二区性色 | 国产日韩在线免费观看 | 91亚洲国产精品 | 香蕉手机网 | 欧美高清性xxxx | 国产精品久久久久久亚洲调教 | 在线观看中文字幕一区二区 | 国产精品99一区二区三区 | 黄视频免费在线看 | 欧美在线一二 | 日本高清免费aaaaa大片视频 | 六月丁香综合网 | av中亚| 无码人妻久久一区二区三区蜜桃 | 国产美女永久免费无遮挡 | 免费高清毛片 | 久久这里只有精品9 | 在线激情小视频 | 激情小说中文字幕 | 色漫在线观看 | 亚洲丁香色 | 邻居少妇张开腿让我爽了在线观看 | 久久久久国产精品无码免费看 | 色多多入口 | 久久咪咪 | 日本高清视频www | 又粗又猛又爽又黄的视频 | 日韩专区第一页 | 亚洲网站在线看 | 国产欧美另类 | 一区二区三区四区欧美 | 久久国产免费观看 |