给命令行(cmd)做一个GUI——Process的应用

给命令行下的「DOS」程序,穿上一层WinForm的外衣,给原来只有命令行的程序制作一个精美的GUI。。

比如uharc.exe,比如csc.exe

程序思路是这样的:
我可以通过运行cmd.exe来操作命令行,现在要给它一个GUI
Windows的命令行cmd.exe --> 新进程Process --> 你的WinForm --> 对玩家来说,看到的只有GUI
用到了System.Diagnostics.Process进程类来运行和管理cmd.exe.

 

先给cmd.exe一个进程p

     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;
            }
        }

嗯,没了,就这么简单。

posted on 2012-07-04 15:12  仝师傅  阅读(469)  评论(0)    收藏  举报