命令行程序增加 GUI 外壳
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
里是不能直接修改输出 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;
}
参考源代码:Download
The End. \(\Box\)
命令行程序增加 GUI 外壳的更多相关文章
- myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...
- c#词频统计命令行程序
这里将用c#写一个关于词频统计的命令行程序. 预计时间分配:输入处理3h.词条排序打印2h.测试3h. 实际时间分配:输入处理1h.词条排序打印2h.测试3h.程序改进优化6h. 下面将讲解程序的完成 ...
- 手写笔记变PDF-几行代码变命令行程序为图形化界面
前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...
- Node.js 命令行程序开发教程
nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...
- JMeter学习-023-JMeter 命令行(非GUI)模式详解(一)-执行、输出结果及日志、简单分布执行脚本
前文 讲述了JMeter分布式运行脚本,以更好的达到预设的性能测试(并发)场景.同时,在前文的第一章节中也提到了 JMeter 命令行(非GUI)模式,那么此文就继续前文,针对 JMeter 的命令行 ...
- 使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空
使用mysql 命令行,增加 ,删除 字段 并 设置默认值 及 非空 添加 alter table table_name add field_name field_type; 添加,并设置默认值,及非 ...
- 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- C# 控制台程序(命令行程序)设置字体颜色,窗口宽高,光标行数
控制台程序(命令行程序)设置窗口宽度高度,如下代码: Console.WriteLine(Console.WindowHeight); Console.WriteLine(Console.Buffer ...
- 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序
软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...
随机推荐
- Python3字符串替换replace(),translate(),re.sub()
Python3的字符串替换,这里总结了三个函数,replace()和translate()和re.sub() replace() replace() 方法把字符串中的 old(旧字符串) 替换成 ne ...
- 从壹开始 [Admin] 之四 || NetCore + SignalR 实现日志消息推送
缘起 哈喽大家周一好呀,感觉好久没有写文章了,上周出差了一次,感觉还是比坐办公室好的多,平时在读一本书<时生>,感兴趣的可以看看
- 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总
偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...
- Vue 进阶之路(八)
之前的文章我们对组件 component 进行了简单的介绍,本章我们将深入了解一下组件,并实现父子组件间的传值. <!DOCTYPE html> <html lang="e ...
- 我眼中的 Nginx(三):Nginx 变量和变量插值
张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...
- Spring Boot 中实现定时任务的两种方式
在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Qua ...
- Go:学习笔记兼吐槽(2)
Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 基本数据类型和string之间的转换 (1) 基本类型转string 使用 fmt.Sprintf(“%参数”, 表 ...
- JS 实现的年月日三级联动
js文件 SYT="-请选择年份-"; SMT="-请选择月份-"; SDT="-请选择日期-"; BYN=50;//年份范围往前50年 A ...
- 结合JDK源码看设计模式——单例模式
定义: 保证一个类仅有一个实例,并提供一个全局访问点 适用场景: 确保任何情况下这个对象只有一个实例 详解: 私有构造器 单利模式中的线程安全+延时加载 序列化和反序列化安全, 防止反射攻击 结合JD ...
- openlayers4 入门开发系列之地图属性查询篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...