在winform上內嵌入其它的程式

来源:http://www.cnblogs.com/hackpig/archive/2016/08/18/5783604.html
-Advertisement-
Play Games

這段代碼很有意義,用於把一個程式的界面嵌入到我們自己程式的某個指定窗體上. 比如在某個項目里,我需要把基恩士的激光掃描輪廓顯示給客戶看,但是激光的DLL中並沒有這種功能提供. 於是我想先啟動激光的官方程式用以顯示輪廓, 然後再把這種顯示界面嵌入到我自己程式的界面上指定的位置上. 在筆者構想的PLC仿 ...


這段代碼很有意義,用於把一個程式的界面嵌入到我們自己程式的某個指定窗體上.

比如在某個項目里,我需要把基恩士的激光掃描輪廓顯示給客戶看,但是激光的DLL中並沒有這種功能提供. 於是我想先啟動激光的官方程式用以顯示輪廓, 然後再把這種顯示界面嵌入到我自己程式的界面上指定的位置上.

在筆者構想的PLC模擬器由梯形圖編輯器, 3D模擬組態環境兩部分組成, 這兩部分就可以考慮開發成獨立的軟體,然後嵌入到我需要的另外的一款PLC模擬教學軟體中去.

源代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Runtime.InteropServices;
 10 using System.Diagnostics;
 11 using System.Threading;
 12 
 13 namespace WindowsFormsApplication1
 14 {
 15     public partial class Form1 : Form
 16     {
 17         Process p;
 18 
 19         public Form1()
 20         {
 21             InitializeComponent();
 22         }
 23 
 24         #region API
 25         [DllImport("user32.dll")]
 26         private static extern int SetParent(IntPtr hWndChild, IntPtr hWndParent);
 27 
 28         [DllImport("user32.dll")]
 29         private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
 30 
 31         [DllImport("user32.dll", SetLastError = true)]
 32         private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 33 
 34         [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
 35         private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter,
 36                     int X, int Y, int cx, int cy, uint uFlags);
 37 
 38         [DllImport("user32.dll")]
 39         private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 40 
 41         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
 42         private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint newLong);
 43 
 44         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
 45         private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
 46 
 47         [DllImport("user32.dll", CharSet = CharSet.Auto)]
 48         private static extern bool ShowWindow(IntPtr hWnd, short State);
 49 
 50         private const int HWND_TOP = 0x0;
 51         private const int WM_COMMAND = 0x0112;
 52         private const int WM_QT_PAINT = 0xC2DC;
 53         private const int WM_PAINT = 0x000F;
 54         private const int WM_SIZE = 0x0005;
 55         private const int SWP_FRAMECHANGED = 0x0020;
 56         public enum ShowWindowStyles : short
 57         {
 58             SW_HIDE = 0,
 59             SW_SHOWNORMAL = 1,
 60             SW_NORMAL = 1,
 61             SW_SHOWMINIMIZED = 2,
 62             SW_SHOWMAXIMIZED = 3,
 63             SW_MAXIMIZE = 3,
 64             SW_SHOWNOACTIVATE = 4,
 65             SW_SHOW = 5,
 66             SW_MINIMIZE = 6,
 67             SW_SHOWMINNOACTIVE = 7,
 68             SW_SHOWNA = 8,
 69             SW_RESTORE = 9,
 70             SW_SHOWDEFAULT = 10,
 71             SW_FORCEMINIMIZE = 11,
 72             SW_MAX = 11
 73         }
 74         #endregion
 75 
 76         private void Form1_Load(object sender, EventArgs e)
 77         {
 78             p = new Process();
 79             //需要啟動的程式
 80             p.StartInfo.FileName = @"calc.exe";
 81             //為了美觀,啟動的時候最小化程式
 82             p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
 83             //啟動
 84             p.Start();
 85 
 86             //這裡必須等待,否則啟動程式的句柄還沒有創建,不能控製程序
 87             Thread.Sleep(10000);
 88             //最大化啟動的程式
 89             ShowWindow(p.MainWindowHandle, (short)ShowWindowStyles.SW_MAXIMIZE);
 90             //設置被綁架程式的父視窗
 91             SetParent(p.MainWindowHandle, this.Handle);
 92             //改變尺寸
 93             ResizeControl();
 94         }
 95 
 96         //控制嵌入程式的位置和尺寸
 97         private void ResizeControl()
 98         {
 99             SendMessage(p.MainWindowHandle, WM_COMMAND, WM_PAINT, 0);
100             PostMessage(p.MainWindowHandle, WM_QT_PAINT, 0, 0);
101 
102             SetWindowPos(
103             p.MainWindowHandle,
104               HWND_TOP,
105               0 - 10,//設置偏移量,把原來視窗的菜單遮住
106                0 - 32,
107               (int)this.Width + 32,
108               (int)this.Height + 32,
109               SWP_FRAMECHANGED);
110 
111             SendMessage(p.MainWindowHandle, WM_COMMAND, WM_SIZE, 0);
112         }
113 
114         private void Form1_SizeChanged(object sender, EventArgs e)
115         {
116             ResizeControl();
117         }
118 
119         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
120         {
121             p.Kill();
122             p.Dispose();
123         }
124     }
125 }

 

核心功能利用了windows API中的SetParent()

程式運行後, 先啟動calc.exe(windows計算器), 然後等待10秒後再顯示本程式自己的窗體, 這時你會發現這個窗體已經把calc.exe的界麵包含進來的.

這樣你就可以清楚的看到嵌入的效果是怎麼樣的.

 

效果如上圖所示. 但是你的程式在退出前,要自己"殺掉"計算器的進程, 否則你的程式退出它還在.

 

本文源代碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天學的新東西是WPF的模板,以後會學習更多關於WPF的東東的 ...
  • jquery easyui使用(四)······添加,編輯,刪除 ...
  • 警告:這是一個入門級日誌,如果你很瞭解CodeFirst,那請繞道 背景:這篇日誌記錄我使用Entity FrameWork CodeFirst時出現的錯誤和解決問題的過程,雖然有點曲折……勿噴 備註:這確實算是Entity FrameWork CodeFirst的問題個人也不知道應該給文章加什麼樣 ...
  • 本文想通過配置VS Code來實現對AngularJS的智能提示。在一般的情況下對於在HTML頁面是支持提示的。但是在js頁面就不是很友好,它是記憶你之前的輸入,要是之後有重覆的輸入,VS Code會提示您,僅此而已。 VS Code各種屌炸天的功能,將來必定是強大的前端IDE。 通過下列5步讓VS ...
  • 前些日子,Insus.NET有實現《ASP.NET MVC使用jQuery實現Autocomplete》http://www.cnblogs.com/insus/p/5638895.html 。 但今天嘗試把此功能移到ASP.NET Ajax UpdatePanel環境中使用。網頁在第一次載入時是沒 ...
  • Networkcomms 是一款C# 語言編寫的TCP/UDP通信框架 作者是英國人 以前是收費的 目前作者已經開源 開源地址是:https://github.com/MarcFletcher/NetworkComms.Net networkcomms通訊框架使用簡單方便,性能穩定. 從github ...
  • 傻了吧唧的裝雙系統.成功的乾崩了原本的系統.現在重裝VS.閑的沒事胡扯幾句. WindowsAPI在每一臺Windows系統上開放標準API供開發人員調用.功能齊全.在這裡只介紹三個部分. 1.利用API控制滑鼠鍵盤. 2.對外部程式的讀寫和監聽 3.對外部程式視窗的改動. 外部程式的意思就是.假設 ...
  • Hibernate提供了兩種映射一對一映射關聯關係的方式: 01.按照外鍵映射 02.按照主鍵映射 下麵以員工賬號表和員工檔案表(員工賬號和檔案表之間是一對一的關係)為例,介紹這兩種映射關係,並使用這兩種 映射方式分別完成以下持久化操作 (1)保存員工檔案的同時分配給員工一個賬號 (2)載入員工檔案 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...