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. Java Applet 与Servlet之间的通信

    1 Applet对Servlet的访问及参数传递的实现 2.1.1创建URL对象 在JAVA程序中,可以利用如下的形式创建URL对象 URL servletURL = new URL( "h ...

  2. mysql中利用group by过滤删除重复行

    DELETEFROM peopleWHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING count(peopl ...

  3. 前端学习笔记之HTML body内常用标签

    阅读目录 一 HTML语义化 二 字符实体 三 h系列标签 四 p标签 五 img标签 六 a标签 七 列表标签 八 table标签 九 form标签 一 HTML语义化 body中的标签是会显示到浏 ...

  4. Shell 脚本中调用另一个 Shell 脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  5. 安卓开发笔记(三十一):shape标签下子类根结点的具体使用

    在我的上一篇博文当中阐述了我们如何使用shape标签进行自定义控件,这里对shape控件的属性进行阐述,不知道如何使用这些属性的可以参见我的上一篇博文(自定义Button):https://www.c ...

  6. 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率

    在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...

  7. 【Python3爬虫】用Python中的队列来写爬虫

    一.写在前面 当你看着你的博客的阅读量慢慢增加的时候,内心不禁有了些小激动,但是不得不吐槽一下--博客园并不会显示你的博客的总阅读量是多少.而这一篇博客就将教你怎么利用队列这种结构来编写爬虫,最终获取 ...

  8. DSAPI DS密法

    DS密法是DYLIKE本人研发的一种针对文本字符串的高强度加密方法,本加密方法的优点是同源不同密,同一个源文本每次加密的结果都不同,长度也不同.密钥最大可达String类型的字符最大长度.缺点是解密时 ...

  9. python的学习笔记01_1 python2和python3的区别和环境

    1.python2 与 python3 区别: 关于这两个版本的区别,从宏观上来讲: python2:源码不标准,混乱(很多技术大佬写的都有自己语言的特点,看起来很不pythoner)由于python ...

  10. Mapbox使用详解

    一.简介: Mapbox致力于打造全球最漂亮的个性化地图.   在一次偶然的地图相关资料搜索过程中发现了一个很神奇又很漂亮的地图,这个地图支持高度自定义各种地图元素,比如,道路,水系,绿地,建筑物,背 ...