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; // 自定义 shellp.StartInfo.CreateNoWindow = true; // 避免显示原始窗口p.StartInfo.RedirectStandardInput = true; // 重定向标准输入(原来是 CON)p.StartInfo.RedirectStandardOutput = true; // 重定向标准输出p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);// 数据接收事件(标准输出重定向至此)p.Start();//GOinput = 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 });elsetextBox2.Text += msg;
}

参考源代码:Download

The End. \(\Box\)

转载于:https://www.cnblogs.com/conmajia/p/gui-shell-for-cmd-line.html

命令行程序增加 GUI 外壳相关推荐

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

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

  2. linux命令为什么这么快,为什么这么多Linux用户更喜欢命令行而不是GUI?

    为什么这么多 Linux 用户更喜欢 CLI 而非 GUI? 上次我在 Reddit 关注该问题时,遇到了一些有帮助的投稿: "处于相同的原因我更喜欢谈论指指点点和七嘴八舌. 可以很好的传达 ...

  3. TensorRT 命令行程序trtexec常用用法

    安装TensorRT后,进入到/usr/src/tensorrt/bin目录下,可以看到有个trtexec二进制可执行文件,执行 ./trtexec --help可以看到命令行支持的所有参数项: == ...

  4. (cons '(壹 . 命令行程序界面) 《为自己写本-Guile-书》)

    (car <为自己写本-Guile-书>) 前言中,我说要写一个文式编程工具.它的名字叫 zero,是个命令行程序,运行时需要由使用者提供一些参数与文式编程元文档路径.zero 读取元文档 ...

  5. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

  6. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  7. ffmpeg mp4 提取h265命令行_安装FFmpeg多媒体库,以及命令行程序使用介绍

    FFmpeg是非常流行的多媒体框架,主要用于音视频的解码.编码.转码.混流.过滤.播放等操作. 2000年,法国著名的程序员Fabrice Bellard创建FFmpeg项目,前两个字母FF是Fast ...

  8. java 打印命令_Java 普通命令行程序main关掉 DEBUG 打印

    最近在写一个简单的java命令行程序,执行代码时,代码窗口出现了烦人的debug日志. 分析了一下,出现这种问题的原因是因为,maven项目的依赖包中传递依赖了一些日志框架,导致会出现日志内容的打印. ...

  9. 命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 在LoadRunner中执行命 ...

最新文章

  1. 2020应届生:今年秋招也太太太太太难了吧!
  2. 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR
  3. linux c 时间函数 time difftime 简介
  4. python list分成多个_Python3 把一个列表按指定数目分成多个列表的方式
  5. QMouseEvent鼠标事件简介
  6. 如何轻松拿到大厂面试offer | 掘金技术征文
  7. ios 标签 html,ios 显示HTML标签文本
  8. 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
  9. Python爬虫 ---(1)爬虫基础知识
  10. 随想录(学校作业和工程代码)
  11. LeetCode刷题(28)
  12. java opencv 之人脸识别
  13. 智能手机射频前端架构初识: Phase 2/3/5/6/6L/7/7L/7LE
  14. 快速傅里叶变换在信号处理中的应用
  15. Matlab线型、标记符号、颜色
  16. 软件工程导论学习笔记
  17. githup用户名密码怎么看_水星无线路由器的密码忘了如何解决【解决方法】
  18. iOS根据生日判断星座
  19. 2016锐捷网络云课堂云网络研讨会福州闭幕 根植教育彰显“变革之力”
  20. vue全家桶+koa2+mongoDB打造全栈社区博客

热门文章

  1. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓
  2. c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...
  3. java为什么序列化不一致_java – 为什么Jackson多态序列化在列表中不起作用?
  4. 慕课的原型图快速变html,分享一个html转换为pdf 利器 Pechkin
  5. mysql submission_date_UiPath如何连接MySQL
  6. linux下备份mysql上传到网盘_Linux命令行上传文件到百度网盘
  7. 红帽linux终端快捷键,二、回忆redhat各种基本命令
  8. java foreach order_Java 8流中的forEach vs forEachOrdered
  9. 十年“老司机”的私家锦囊:10个编程技巧、5个纠错步骤,让你的编程之路少点坎坷
  10. (OCR论文)Mask TextSpotter V3机翻