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
里是不能直接修改輸出 TextBox
的 Text
屬性的(不是同一個線程). 用一個簡單的委托解決這個問題.
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\)