命令行程序增加 GUI 外壳
Conmajia © 2012
Updated on Feb. 21, 2018
命令行大家都用过
图 1 命令行程序工作界面
现在想办法为它做一个 GUI 外壳
图 2 带 GUI 外壳的命令行程序
程序思路是这样的
通过运行 cmd.exe
来操作命令行
Windows 的命令行
cmd.exe
新进程Process
WinForm 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;
}
参考源代码
The End.
if(jQuery('#no-reward').text() == 'true') jQuery('.bottom-reward').addClass('hidden');
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-02-21 字符型液晶屏模拟控件(En)