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\)

命令行程序增加 GUI 外壳的更多相关文章

  1. myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)

    1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...

  2. c#词频统计命令行程序

    这里将用c#写一个关于词频统计的命令行程序. 预计时间分配:输入处理3h.词条排序打印2h.测试3h. 实际时间分配:输入处理1h.词条排序打印2h.测试3h.程序改进优化6h. 下面将讲解程序的完成 ...

  3. 手写笔记变PDF-几行代码变命令行程序为图形化界面

    前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...

  4. Node.js 命令行程序开发教程

    nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...

  5. JMeter学习-023-JMeter 命令行(非GUI)模式详解(一)-执行、输出结果及日志、简单分布执行脚本

    前文 讲述了JMeter分布式运行脚本,以更好的达到预设的性能测试(并发)场景.同时,在前文的第一章节中也提到了 JMeter 命令行(非GUI)模式,那么此文就继续前文,针对 JMeter 的命令行 ...

  6. 使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空

    使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空 添加 alter table table_name add field_name field_type; 添加,并设置默认值,及非 ...

  7. 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  8. C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数

    控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...

  9. 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

    软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...

随机推荐

  1. TensorFlow之DNN(一):构建“裸机版”全连接神经网络

    博客断更了一周,干啥去了?想做个聊天机器人出来,去看教程了,然后大受打击,哭着回来补TensorFlow和自然语言处理的基础了.本来如意算盘打得挺响,作为一个初学者,直接看项目(不是指MINIST手写 ...

  2. asp.net core系列 54 IS4用客户端凭据保护API

    一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景.该示例涉及到三个项目包括:Identity ...

  3. 解决Google Play审核中的WebViewClient.onReceivedSslError问题

    Google Play应用市场提交应用审核,出现因WebViewClient.onReceivedSslError问题导致拒绝通过. Google Paly给出的详情地址:support.google ...

  4. Java学习路线图分析

     Java学习路线分析图 第一阶段 技术名称 技术内容 J2SE(java基础部分) java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置, ...

  5. Fiddler 接口测试(Composer)的使用方法及并发测试

    下载地址:https://www.telerik.com/download/fiddler 一.Composer简介 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾 ...

  6. C# 语音合成

    1. 引用System.Speech 2. 通过SpeechSynthesizer类朗读文本 new SpeechSynthesizer().SpeakAsync("我们都是好孩子We're ...

  7. java中用swing做一个windows计算器

    目录 主函数 普通计数器 科学计算器 注意: @(java中用swing做一个windows计算器) 前言: 来看这篇教程估计都是java课程设计吧,现在已经没有公司很少使用swing组件了,java ...

  8. SQLServer之删除用户自定义数据库用户

    删除用户自定义数据库用户注意事项 不能从数据库中删除拥有安全对象的用户. 必须先删除或转移安全对象的所有权,才能删除拥有这些安全对象的数据库用户. 不能删除 guest 用户,但可在除 master ...

  9. JVM之垃圾收集器

    前一篇讲了垃圾收集算法--JVM之GC算法.垃圾收集算法——标记-清除算法.复制算法.标记-整理算法.分代收集算法,如果把它看作是方法论,那么下面说的就应该是内存回收的具体实现. 先看一下JVM中有哪 ...

  10. Storm入门(十一)Twitter Storm源代码分析之CoordinatedBolt

    作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/811/twitter-stor ...