Conmajia

Stop stealing sheep!

导航

< 20253 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

命令行程序增加 GUI 外壳

Conmajia © 2012
Updated on Feb. 21, 2018

命令行大家都用过

图 1 命令行程序工作界面

现在想办法为它做一个 GUI 外壳实际效果参考图 2.

图 2 带 GUI 外壳的命令行程序

程序思路是这样的

通过运行 cmd.exe 来操作命令行现在要给它一个 GUI.

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 里是不能直接修改输出 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.

posted on2018-02-21   Conmajia  阅读(2116)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-02-21 字符型液晶屏模拟控件(En)
点击右上角即可分享
微信分享提示