zoukankan      html  css  js  c++  java
  • 命令行程序增加 GUI 外壳

    Conmajia © 2012
    Updated on Feb. 21, 2018

    命令行大家都用过:

    图 1 命令行程序工作界面

    现在想办法为它做一个 GUI 外壳,实际效果参考图 2.

    图 2 带 GUI 外壳的命令行程序

    程序思路是这样的:

    通过运行 cmd.exe 来操作命令行,现在要给它一个 GUI.

    Windows 的命令行 cmd.exe ( ightarrow) 新进程 Process ( ightarrow) WinForm ( ightarrow) 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)

  • 相关阅读:
    残缺的字符串
    [BZOJ3513: [MUTC2013]idiots]
    FFT感性瞎扯
    Quartz框架简介
    异常状态码总结
    【SSM】拦截器的原理、实现
    FastDFS实现文件上传下载实战
    分布式文件系统FastDFS设计原理(转)
    FastDFS简介
    【设计模式】观察者模式
  • 原文地址:https://www.cnblogs.com/conmajia/p/gui-shell-for-cmd-line.html
Copyright © 2011-2022 走看看