在winform嵌入外部应用程序
生活随笔
收集整理的這篇文章主要介紹了
在winform嵌入外部应用程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 應朋友要求,需要將一個第三方應用程序嵌入到本程序WinForm窗口,以前在VB6時代做過類似的功能,其原理就是利用Windows API中FindWindow函數找到第三方應用程序句柄,再利用SetParent函數,將該句柄設置為本窗口的子窗口。
? ? ? ? 網上搜索大部分都是利用System.Diagnostics.Process獲取外部應用程序的MainWindowHandle,貌似以前的COM應用程序可以,在Win10下調用Process.MainWindowHandle會提示“應用程序已退出”,也就是獲取不到應用程序句柄。于是轉換思路,利用FindWindow查找窗口句柄,測試成功。
? ? ? ? 但是需要注意的是,有些第三方應用程序對訪問權限要求高,需要“以管理員身份運行"/bin/debug"下的exe文件才能成功嵌入,代碼調試無效,調試模式調用SetParent會返回-5錯誤。
? ? ? ? ?以下是部分代碼:
/// <summary>/// 將指定的程序嵌入指定的控件/// </summary>private void EmbedProcess(){string title = System.Configuration.ConfigurationManager.AppSettings["Title"];//要查找的外部應用程序窗口標題 IntPtr P = new IntPtr(0);while (true){P = FindWindow(null, title);//通過標題查找窗口句柄,當然也可以按class查找,如果需要查找子窗口需要FindWindowEx函數Thread.Sleep(100); if (P == IntPtr.Zero)continue;elsebreak;}try{// 將外部應用程序嵌入到本窗口 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
轉載于:https://www.cnblogs.com/habin/p/7815369.html
總結
以上是生活随笔為你收集整理的在winform嵌入外部应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Some notes for CLFS2
- 下一篇: 使用PVRTexTool压缩纹理的基本用