Powered By Blogger

關於我自己

我的相片
網站經營斷斷續續,現在以分享程式練習為主。 因為工作需要,不時會有練習程式的需要。 所以將自己練習的過程分享給大家。 如果有幫助到各位,那就太好了! 如果針對本人或網站內容有任何問題, 歡迎與我聯絡。

2020年9月1日 星期二

【C# 語言】利用 SetParent,Process Start 加入、開啟外部程式

這次要跟大家分享的是,在某次的情境下,
居裡貓需要將「外部的程式加入到主要的程式中執行」,
因此呢找到了這次要跟大家分享的東西。
這次就是要分享幾個將「外部程式」加入到主要程式中執行的方法。
主要有兩種方法,分別是:
1. SetParent - 這是來自 user32.dll 中所提供的方法。
2. Process - 這次來自 System.Diagnostics 底下提供的方法。

那麼接下來就開始解說這次的練習範例吧!
首先是整體視窗內容說明。

本次內容利用 TabControl 來將功能做區分,
首先看到的是 SetParent 功能的 Tabpage,


這裡還有幾個元件,分別是:
Add - 將外部程式加入到 panel 中
Hide - 將程式隱藏
Panel - 位於右手邊的黑色外框即為 panel 


接下來看到的是 Process 功能的 Tabpage,


這裡有一個元件為:
Process Start - 將外部程式從主程式開啟


接下來看到的是 SetParent + Process 功能的 Tabpage,


這裡有幾個元件,分別是:
Set Parent + Process Start - 將外部程式從主程式開啟並加入到 panel 中
Panel - 位於右手邊的黑色外框即為 panel

接下來我們就來看但執行的結果吧!

首先是 Set Parent 的結果,


沒有意外的他就是這樣加入到 panel 中,
但這裡要先說明一下,
這裡使用的是 SetParent 沒錯,但來源呢並不能算是外部程式,
這裡居裡貓使用的是 MainForm 的類別,
取得這個變數的 handle 之後利用 SetParent 加入到 panel 中,
這裡大家需要特別注意一下。


接下來是 Process Start 的結果,


是的,Process Start 就是這樣的把一個指定的外部程式給開啟來,
這樣就是百分百的把你想要用的程式好好的開啟,提供使用。


那個在某些特殊的情況下,真的是要開啟一個外部的程式,
然後又不是主程式自帶的類別,又要加入到主程式視窗中,
那該怎麼辦呢?
那就讓我們來看看第三部份 Set Parent + Process Start 的結果,



由上面大家可以看到,經過這兩種方法的組合,是可以完成那樣的條件設定,
真實的外部程式,並且要加入到主視窗中顯示。
不過這裡有個有趣的部份在於,當使用 Process Start 啟動外部程式的時候,
會有短暫的時間看到外部程式獨立的視窗出現,
之後才會被加入到 panel 中,這個大家要注意一下。

那個接下來就是展示程式碼的部份,
今天居裡貓就不太別針對程式碼的部份做說明了,
請大家自行研究一下下吧!

-----------------------------------------------------------------------------------------------------------------------

MainForm.cs 的部份

  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.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace NewTestFormApp  
  12. {  
  13.     public partial class MainForm : Form  
  14.     {  
  15.         public MainForm()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.  
  20.         #region Set Parent  
  21.   
  22.         [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetParent")]  
  23.         public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);  
  24.   
  25.         Form fm = new Form();  
  26.         private void btnAddWindow_Click(object sender, EventArgs e)  
  27.         {  
  28.             fm = new MainForm();  
  29.   
  30.             SetParent(fm.Handle, palNewWindow.Handle);  
  31.             fm.Location = new Point(0, 0);  
  32.             fm.Size = palNewWindow.Size;  
  33.   
  34.             fm.Show();  
  35.         }  
  36.   
  37.         private void btnHideWindow_Click(object sender, EventArgs e)  
  38.         {  
  39.             fm.Hide();  
  40.         }  
  41.  
  42.         #endregion // Set Parent  
  43.  
  44.         #region Process Start  
  45.   
  46.         System.Diagnostics.Process m_Process = new System.Diagnostics.Process();  
  47.         private void btnProcessStart_Click(object sender, EventArgs e)  
  48.         {  
  49.             m_Process = new System.Diagnostics.Process()  
  50.             {  
  51.                 SynchronizingObject = this,  
  52.                 EnableRaisingEvents = true,  
  53.                 StartInfo = new System.Diagnostics.ProcessStartInfo()  
  54.                 {  
  55.                     FileName = Application.StartupPath + @"\NewTestFormApp.exe",  
  56.                     CreateNoWindow = true,  
  57.                     UseShellExecute = false,  
  58.                     RedirectStandardOutput = true,  
  59.                     WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized  
  60.   
  61.                 }  
  62.             };  
  63.   
  64.             m_Process.Start();  
  65.         }  
  66.  
  67.         #endregion // Process Start  
  68.  
  69.         #region Set Parent + Process Start  
  70.   
  71.         private void btnSetParentProcessStart_Click(object sender, EventArgs e)  
  72.         {  
  73.             m_Process = new System.Diagnostics.Process()  
  74.             {  
  75.                 SynchronizingObject = this,  
  76.                 EnableRaisingEvents = true,  
  77.                 StartInfo = new System.Diagnostics.ProcessStartInfo()  
  78.                 {  
  79.                     FileName = Application.StartupPath + @"\NewTestFormApp.exe",  
  80.                     CreateNoWindow = true,  
  81.                     UseShellExecute = false,  
  82.                     RedirectStandardOutput = true,  
  83.                     WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized  
  84.                       
  85.                 }  
  86.             };  
  87.   
  88.             m_Process.Start();  
  89.   
  90.             System.Threading.Thread.Sleep(1000);  
  91.   
  92.             SetParent(m_Process.MainWindowHandle, this.palSetParentProcessStart.Handle);  
  93.         }  
  94.  
  95.         #endregion // Set Parent + Process Start  
  96.   
  97.     }  

MainForm.Designer.cs 的部份

  1. namespace NewTestFormApp  
  2. {  
  3.     partial class MainForm  
  4.     {  
  5.         /// <summary>  
  6.         /// 設計工具所需的變數。  
  7.         /// </summary>  
  8.         private System.ComponentModel.IContainer components = null;  
  9.   
  10.         /// <summary>  
  11.         /// 清除任何使用中的資源。  
  12.         /// </summary>  
  13.         /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param>  
  14.         protected override void Dispose(bool disposing)  
  15.         {  
  16.             if (disposing && (components != null))  
  17.             {  
  18.                 components.Dispose();  
  19.             }  
  20.             base.Dispose(disposing);  
  21.         }  
  22.  
  23.         #region Windows Form 設計工具產生的程式碼  
  24.   
  25.         /// <summary>  
  26.         /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器修改  
  27.         /// 這個方法的內容。  
  28.         /// </summary>  
  29.         private void InitializeComponent()  
  30.         {  
  31.             this.tabAddWindow = new System.Windows.Forms.TabControl();  
  32.             this.tabPage1 = new System.Windows.Forms.TabPage();  
  33.             this.txtMessageSetParent = new System.Windows.Forms.TextBox();  
  34.             this.palNewWindow = new System.Windows.Forms.Panel();  
  35.             this.btnHideWindow = new System.Windows.Forms.Button();  
  36.             this.btnAddWindow = new System.Windows.Forms.Button();  
  37.             this.tabPage2 = new System.Windows.Forms.TabPage();  
  38.             this.txtMessageProcess = new System.Windows.Forms.TextBox();  
  39.             this.btnProcessStart = new System.Windows.Forms.Button();  
  40.             this.tabPage3 = new System.Windows.Forms.TabPage();  
  41.             this.btnSetParentProcessStart = new System.Windows.Forms.Button();  
  42.             this.palSetParentProcessStart = new System.Windows.Forms.Panel();  
  43.             this.tabAddWindow.SuspendLayout();  
  44.             this.tabPage1.SuspendLayout();  
  45.             this.tabPage2.SuspendLayout();  
  46.             this.tabPage3.SuspendLayout();  
  47.             this.SuspendLayout();  
  48.             //   
  49.             // tabAddWindow  
  50.             //   
  51.             this.tabAddWindow.Controls.Add(this.tabPage1);  
  52.             this.tabAddWindow.Controls.Add(this.tabPage2);  
  53.             this.tabAddWindow.Controls.Add(this.tabPage3);  
  54.             this.tabAddWindow.Location = new System.Drawing.Point(12, 12);  
  55.             this.tabAddWindow.Name = "tabAddWindow";  
  56.             this.tabAddWindow.SelectedIndex = 0;  
  57.             this.tabAddWindow.Size = new System.Drawing.Size(824, 435);  
  58.             this.tabAddWindow.TabIndex = 0;  
  59.             //   
  60.             // tabPage1  
  61.             //   
  62.             this.tabPage1.Controls.Add(this.txtMessageSetParent);  
  63.             this.tabPage1.Controls.Add(this.palNewWindow);  
  64.             this.tabPage1.Controls.Add(this.btnHideWindow);  
  65.             this.tabPage1.Controls.Add(this.btnAddWindow);  
  66.             this.tabPage1.Location = new System.Drawing.Point(4, 22);  
  67.             this.tabPage1.Name = "tabPage1";  
  68.             this.tabPage1.Padding = new System.Windows.Forms.Padding(3);  
  69.             this.tabPage1.Size = new System.Drawing.Size(816, 409);  
  70.             this.tabPage1.TabIndex = 0;  
  71.             this.tabPage1.Text = "Set Parent";  
  72.             this.tabPage1.UseVisualStyleBackColor = true;  
  73.             //   
  74.             // txtMessageSetParent  
  75.             //   
  76.             this.txtMessageSetParent.Location = new System.Drawing.Point(25, 111);  
  77.             this.txtMessageSetParent.Name = "txtMessageSetParent";  
  78.             this.txtMessageSetParent.Size = new System.Drawing.Size(265, 22);  
  79.             this.txtMessageSetParent.TabIndex = 3;  
  80.             this.txtMessageSetParent.Visible = false;  
  81.             //   
  82.             // palNewWindow  
  83.             //   
  84.             this.palNewWindow.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;  
  85.             this.palNewWindow.Location = new System.Drawing.Point(296, 6);  
  86.             this.palNewWindow.Name = "palNewWindow";  
  87.             this.palNewWindow.Size = new System.Drawing.Size(514, 363);  
  88.             this.palNewWindow.TabIndex = 2;  
  89.             //   
  90.             // btnHideWindow  
  91.             //   
  92.             this.btnHideWindow.Location = new System.Drawing.Point(25, 70);  
  93.             this.btnHideWindow.Name = "btnHideWindow";  
  94.             this.btnHideWindow.Size = new System.Drawing.Size(75, 23);  
  95.             this.btnHideWindow.TabIndex = 1;  
  96.             this.btnHideWindow.Text = "Hide";  
  97.             this.btnHideWindow.UseVisualStyleBackColor = true;  
  98.             this.btnHideWindow.Click += new System.EventHandler(this.btnHideWindow_Click);  
  99.             //   
  100.             // btnAddWindow  
  101.             //   
  102.             this.btnAddWindow.Location = new System.Drawing.Point(25, 23);  
  103.             this.btnAddWindow.Name = "btnAddWindow";  
  104.             this.btnAddWindow.Size = new System.Drawing.Size(75, 23);  
  105.             this.btnAddWindow.TabIndex = 0;  
  106.             this.btnAddWindow.Text = "Add";  
  107.             this.btnAddWindow.UseVisualStyleBackColor = true;  
  108.             this.btnAddWindow.Click += new System.EventHandler(this.btnAddWindow_Click);  
  109.             //   
  110.             // tabPage2  
  111.             //   
  112.             this.tabPage2.Controls.Add(this.txtMessageProcess);  
  113.             this.tabPage2.Controls.Add(this.btnProcessStart);  
  114.             this.tabPage2.Location = new System.Drawing.Point(4, 22);  
  115.             this.tabPage2.Name = "tabPage2";  
  116.             this.tabPage2.Padding = new System.Windows.Forms.Padding(3);  
  117.             this.tabPage2.Size = new System.Drawing.Size(816, 409);  
  118.             this.tabPage2.TabIndex = 1;  
  119.             this.tabPage2.Text = "Process Start";  
  120.             this.tabPage2.UseVisualStyleBackColor = true;  
  121.             //   
  122.             // txtMessageProcess  
  123.             //   
  124.             this.txtMessageProcess.Location = new System.Drawing.Point(27, 64);  
  125.             this.txtMessageProcess.Name = "txtMessageProcess";  
  126.             this.txtMessageProcess.Size = new System.Drawing.Size(401, 22);  
  127.             this.txtMessageProcess.TabIndex = 2;  
  128.             this.txtMessageProcess.Visible = false;  
  129.             //   
  130.             // btnProcessStart  
  131.             //   
  132.             this.btnProcessStart.Location = new System.Drawing.Point(27, 24);  
  133.             this.btnProcessStart.Name = "btnProcessStart";  
  134.             this.btnProcessStart.Size = new System.Drawing.Size(75, 23);  
  135.             this.btnProcessStart.TabIndex = 1;  
  136.             this.btnProcessStart.Text = "Process Start";  
  137.             this.btnProcessStart.UseVisualStyleBackColor = true;  
  138.             this.btnProcessStart.Click += new System.EventHandler(this.btnProcessStart_Click);  
  139.             //   
  140.             // tabPage3  
  141.             //   
  142.             this.tabPage3.Controls.Add(this.palSetParentProcessStart);  
  143.             this.tabPage3.Controls.Add(this.btnSetParentProcessStart);  
  144.             this.tabPage3.Location = new System.Drawing.Point(4, 22);  
  145.             this.tabPage3.Name = "tabPage3";  
  146.             this.tabPage3.Size = new System.Drawing.Size(816, 409);  
  147.             this.tabPage3.TabIndex = 2;  
  148.             this.tabPage3.Text = "Set Parent + Process Start";  
  149.             this.tabPage3.UseVisualStyleBackColor = true;  
  150.             //   
  151.             // btnSetParentProcessStart  
  152.             //   
  153.             this.btnSetParentProcessStart.Location = new System.Drawing.Point(29, 30);  
  154.             this.btnSetParentProcessStart.Name = "btnSetParentProcessStart";  
  155.             this.btnSetParentProcessStart.Size = new System.Drawing.Size(140, 23);  
  156.             this.btnSetParentProcessStart.TabIndex = 0;  
  157.             this.btnSetParentProcessStart.Text = "Set Parent + Process Start";  
  158.             this.btnSetParentProcessStart.UseVisualStyleBackColor = true;  
  159.             this.btnSetParentProcessStart.Click += new System.EventHandler(this.btnSetParentProcessStart_Click);  
  160.             //   
  161.             // palSetParentProcessStart  
  162.             //   
  163.             this.palSetParentProcessStart.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;  
  164.             this.palSetParentProcessStart.Location = new System.Drawing.Point(299, 8);  
  165.             this.palSetParentProcessStart.Name = "palSetParentProcessStart";  
  166.             this.palSetParentProcessStart.Size = new System.Drawing.Size(514, 363);  
  167.             this.palSetParentProcessStart.TabIndex = 3;  
  168.             //   
  169.             // MainForm  
  170.             //   
  171.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);  
  172.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;  
  173.             this.ClientSize = new System.Drawing.Size(848, 459);  
  174.             this.Controls.Add(this.tabAddWindow);  
  175.             this.Name = "MainForm";  
  176.             this.Text = "Main Form";  
  177.             this.tabAddWindow.ResumeLayout(false);  
  178.             this.tabPage1.ResumeLayout(false);  
  179.             this.tabPage1.PerformLayout();  
  180.             this.tabPage2.ResumeLayout(false);  
  181.             this.tabPage2.PerformLayout();  
  182.             this.tabPage3.ResumeLayout(false);  
  183.             this.ResumeLayout(false);  
  184.   
  185.         }  
  186.  
  187.         #endregion  
  188.   
  189.         private System.Windows.Forms.TabControl tabAddWindow;  
  190.         private System.Windows.Forms.TabPage tabPage1;  
  191.         private System.Windows.Forms.Panel palNewWindow;  
  192.         private System.Windows.Forms.Button btnHideWindow;  
  193.         private System.Windows.Forms.Button btnAddWindow;  
  194.         private System.Windows.Forms.TabPage tabPage2;  
  195.         private System.Windows.Forms.Button btnProcessStart;  
  196.         private System.Windows.Forms.TextBox txtMessageProcess;  
  197.         private System.Windows.Forms.TextBox txtMessageSetParent;  
  198.         private System.Windows.Forms.TabPage tabPage3;  
  199.         private System.Windows.Forms.Button btnSetParentProcessStart;  
  200.         private System.Windows.Forms.Panel palSetParentProcessStart;  
  201.     }  
  202. }

沒有留言:

張貼留言