在winform嵌入外部应用程序
? ? ? ? 應(yīng)朋友要求,需要將一個第三方應(yīng)用程序嵌入到本程序WinForm窗口,以前在VB6時代做過類似的功能,其原理就是利用Windows API中FindWindow函數(shù)找到第三方應(yīng)用程序句柄,再利用SetParent函數(shù),將該句柄設(shè)置為本窗口的子窗口。
? ? ? ? 網(wǎng)上搜索大部分都是利用System.Diagnostics.Process獲取外部應(yīng)用程序的MainWindowHandle,貌似以前的COM應(yīng)用程序可以,在Win10下調(diào)用Process.MainWindowHandle會提示“應(yīng)用程序已退出”,也就是獲取不到應(yīng)用程序句柄。于是轉(zhuǎn)換思路,利用FindWindow查找窗口句柄,測試成功。
? ? ? ? 但是需要注意的是,有些第三方應(yīng)用程序?qū)υL問權(quán)限要求高,需要“以管理員身份運行"/bin/debug"下的exe文件才能成功嵌入,代碼調(diào)試無效,調(diào)試模式調(diào)用SetParent會返回-5錯誤。
? ? ? ? ?以下是部分代碼:
/// <summary>/// 將指定的程序嵌入指定的控件/// </summary>private void EmbedProcess(){string title = System.Configuration.ConfigurationManager.AppSettings["Title"];//要查找的外部應(yīng)用程序窗口標(biāo)題 IntPtr P = new IntPtr(0);while (true){P = FindWindow(null, title);//通過標(biāo)題查找窗口句柄,當(dāng)然也可以按class查找,如果需要查找子窗口需要FindWindowEx函數(shù)Thread.Sleep(100); if (P == IntPtr.Zero)continue;elsebreak;}try{// 將外部應(yīng)用程序嵌入到本窗口 long ret = SetParent(P, this.panel1.Handle);if (ret == 0){MessageBox.Show("ErrorCode:"+ GetLastError().ToString());}// 移除邊框樣式 SetWindowLong(new HandleRef(this, P), GWL_STYLE, WS_VISIBLE);//移動窗口MoveWindow(P, 0, 0, this.Width, this.Height, true);}catch (Exception ex1){Console.WriteLine(ex1.Message);}}? ??
? ? ?點擊這里下載源碼
?
? ? ? ?主要參考來源:
http://blog.csdn.net/llddyy123wq/article/details/5624625
轉(zhuǎn)載于:https://www.cnblogs.com/habin/p/7815369.html
總結(jié)
以上是生活随笔為你收集整理的在winform嵌入外部应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Some notes for CLFS2
- 下一篇: 使用PVRTexTool压缩纹理的基本用