命令行程序增加 GUI 外壳
Conmajia ? 2012
Updated on Feb. 21, 2018
命令行大家都用過(guò):
圖 1 命令行程序工作界面
現(xiàn)在想辦法為它做一個(gè) GUI 外殼,實(shí)際效果參考圖 2.
圖 2 帶 GUI 外殼的命令行程序
程序思路是這樣的:
通過(guò)運(yùn)行 cmd.exe 來(lái)操作命令行,現(xiàn)在要給它一個(gè) GUI.
Windows 的命令行
cmd.exe\(\rightarrow\) 新進(jìn)程Process\(\rightarrow\) WinForm \(\rightarrow\) GUI
這一過(guò)程用到了 System.Diagnostics.Process 進(jìn)程類來(lái)運(yùn)行和管理 cmd.exe.
Process 介紹如下:
提供對(duì)本地和遠(yuǎn)程進(jìn)程的訪問(wèn)并使您能夠啟動(dòng)和停止本地系統(tǒng)進(jìn)程.
Process組件提供對(duì)正在計(jì)算機(jī)上運(yùn)行的進(jìn)程的訪問(wèn). 用最簡(jiǎn)短的話來(lái)說(shuō),進(jìn)程就是當(dāng)前運(yùn)行的應(yīng)用程序. 線程是操作系統(tǒng)向其分配處理器時(shí)間的基本單位. 線程可執(zhí)行進(jìn)程的任何一部分代碼,包括當(dāng)前由另一線程執(zhí)行的部分.對(duì)于啟動(dòng)、停止、控制和監(jiān)視應(yīng)用程序等任務(wù),
Process組件是很有用的工具. 使用Process組件,可以獲取正在運(yùn)行的進(jìn)程的列表,或者可以啟動(dòng)新的進(jìn)程.Process組件用于訪問(wèn)系統(tǒng)進(jìn)程. 初始化Process組件后,可使用該組件來(lái)獲取有關(guān)當(dāng)前運(yùn)行的進(jìn)程的信息. 此類信息包括線程集、加載的模塊(.dll和.exe文件)和性能信息(如進(jìn)程當(dāng)前使用的內(nèi)存量).
先給 cmd.exe 一個(gè)進(jìn)程 p.
Process p; // 進(jìn)程
StreamWriter input; // 輸入數(shù)據(jù)流public Form1()
{InitializeComponent();p = new Process();p.StartInfo.FileName = "cmd.exe";p.StartInfo.UseShellExecute = false; // 自定義 shellp.StartInfo.CreateNoWindow = true; // 避免顯示原始窗口p.StartInfo.RedirectStandardInput = true; // 重定向標(biāo)準(zhǔn)輸入(原來(lái)是 CON)p.StartInfo.RedirectStandardOutput = true; // 重定向標(biāo)準(zhǔn)輸出p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);// 數(shù)據(jù)接收事件(標(biāo)準(zhǔn)輸出重定向至此)p.Start();//GOinput = p.StandardInput; // 重定向輸入p.BeginOutputReadLine(); // 開(kāi)始監(jiān)控輸出(異步讀取)
} 執(zhí)行命令:
private void button1_Click(object sender, EventArgs e)
{input.WriteLine(textBox1.Text); // 直接寫入流即可
} 讀取命令行的響應(yīng):
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{update(e.Data + Environment.NewLine);
} 因?yàn)槭窃诹硪粋€(gè)進(jìn)程中異步讀取數(shù)據(jù),所以 update 里是不能直接修改輸出 TextBox 的 Text 屬性的(不是同一個(gè)線程). 用一個(gè)簡(jiǎn)單的委托解決這個(gè)問(wèn)題.
delegate void updateDelegate(string msg);
void update(string msg)
{if (this.InvokeRequired)Invoke(new updateDelegate(update), new object[] { msg });elsetextBox2.Text += msg;
} 參考源代碼:Download
The End. \(\Box\)
轉(zhuǎn)載于:https://www.cnblogs.com/conmajia/p/gui-shell-for-cmd-line.html
總結(jié)
以上是生活随笔為你收集整理的命令行程序增加 GUI 外壳的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个困扰了我三个月的帖子跪求大神帮忙找到
- 下一篇: “草拆花心开”上一句是什么