命令行程序增加 GUI 外殼


Conmajia © 2012
Updated on Feb. 21, 2018

命令行大家都用過:

圖 1 命令行程序工作界面

現在想辦法為它做一個 GUI 外殼,實際效果參考圖 2.

圖 2 帶 GUI 外殼的命令行程序

程序思路是這樣的:

通過運行 cmd.exe 來操作命令行,現在要給它一個 GUI.

Windows 的命令行 cmd.exe \(\rightarrow\) 新進程 Process \(\rightarrow\) WinForm \(\rightarrow\) GUI

這一過程用到了 System.Diagnostics.Process 進程類來運行和管理 cmd.exe.

Process 介紹如下:

提供對本地和遠程進程的訪問並使您能夠啟動和停止本地系統進程.

Process 組件提供對正在計算機上運行的進程的訪問. 用最簡短的話來說,進程就是當前運行的應用程序. 線程是操作系統向其分配處理器時間的基本單位. 線程可執行進程的任何一部分代碼,包括當前由另一線程執行的部分.

對於啟動、停止、控制和監視應用程序等任務,Process 組件是很有用的工具. 使用 Process 組件,可以獲取正在運行的進程的列表,或者可以啟動新的進程. Process 組件用於訪問系統進程. 初始化 Process 組件后,可使用該組件來獲取有關當前運行的進程的信息. 此類信息包括線程集、加載的模塊(.dll.exe 文件)和性能信息(如進程當前使用的內存量).

先給 cmd.exe 一個進程 p.

Process p; // 進程
StreamWriter input; // 輸入數據流
 
public Form1()
{
    InitializeComponent();
 
    p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.UseShellExecute = false; // 自定義 shell
    p.StartInfo.CreateNoWindow = true; // 避免顯示原始窗口
    p.StartInfo.RedirectStandardInput = true; // 重定向標准輸入(原來是 CON)
    p.StartInfo.RedirectStandardOutput = true; // 重定向標准輸出
 
    p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    // 數據接收事件(標准輸出重定向至此)
 
    p.Start();//GO
    input = p.StandardInput; // 重定向輸入
    p.BeginOutputReadLine(); // 開始監控輸出(異步讀取)
}

執行命令:

private void button1_Click(object sender, EventArgs e)
{
    input.WriteLine(textBox1.Text); // 直接寫入流即可
}

讀取命令行的響應:

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    update(e.Data + Environment.NewLine);
}

因為是在另一個進程中異步讀取數據,所以 update 里是不能直接修改輸出 TextBoxText 屬性的(不是同一個線程). 用一個簡單的委托解決這個問題.

delegate void updateDelegate(string msg);
void update(string msg)
{
    if (this.InvokeRequired)
        Invoke(new updateDelegate(update), new object[] { msg });
    else
        textBox2.Text += msg;
}

參考源代碼:Download

The End. \(\Box\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM