如何把命令行程序封装成有GUI的程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把命令行程序封装成有GUI的程序?相关的知识,希望对你有一定的参考价值。

参考技术A 操作系统(无论Linux还是Windows)有一种“管道”的概念,可以把一个程序的标准输入/输出改到其他的地方。你说的那些GUI外壳,就是为命令行程序创建了一个管道,标准输入和标准输出被改到了GUI外壳程序的内部。所以就不会再弹出命令行窗口了。GUI外壳会根据你在窗口上的操作,通过管道,向命令行程序发送指令,就像你手动在命令行窗口上敲命令一样。命令行程序的标准输出也会通过管道传送到GUI外壳的内部,加以处理后在窗口上显示个给你.本回答被提问者采纳

命令行程序增加 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 里是不能直接修改输出 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的程序?的主要内容,如果未能解决你的问题,请参考以下文章

C# 应用程序 GUI 和命令行

如何为命令行程序制作 gui?

如何使 Python PyQT 程序无法在 Windows 中打开命令行

Java IPC:GUI 和命令行

如何在 PySide2 中检查 gui 与命令行模式?

从命令行自动执行 iOS monotouch GUI 测试