今天学习用c#写了第一个带窗口的应用程序,相对来说比单纯的学习知识更有趣一些
我们的任务是通过对窗口程序操作来管理命令行程序(黑框框)
新建一个项目选择windows窗体应用程序
从工具箱中直接拖拽到目的地,并且可以命名在代码中的参数名字
我们需要完成以下任务,双击窗体的textbox进入代码区
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
Process process = new Process();
//提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。
建立外部调用线程
process.StartInfo.FileName = "try.exe";
//获取或设置要启动的应用程序或文档。
//如果 UseShellExecute 为 true,则可以使用 Process 组件启动任何文档并对文件执行操作(如打印)。
//如果 UseShellExecute 为 false,则只能使用 Process 组件启动可执行文件。
process.StartInfo.UseShellExecute = false;
//如果应在启动进程时使用 shell,则为 true;如果直接从可执行文件创建进程,则为 false。默认值为 true。
//UseShellExecute 是 false时,使用 Process 对象,可以开始仅可执行文件。
//将此属性设置为 false 使您能够重定向输入流、输出流和错误流。
process.StartInfo.CreateNoWindow = true;
//如果应启动该进程而不创建包含它的新窗口,则为 true;
//如果 UseShellExecute 属性是 true 或 UserName 和 Password 属性不是 null,CreateNoWindow 属性值被忽略,并且新的窗口中创建。
process.StartInfo.RedirectStandardInput = true; // 重定向输入流
//如果要将 RedirectStandardInput 设置为 true,必须先将 UseShellExecute 设置为 false。 否则,写入 StandardInput 流时将引发异常。
//通过重定向 StandardInput 流,可以通过编程方式指定进程的输入
process.StartInfo.RedirectStandardOutput = true; //重定向输出流
//通过重定向 StandardOutput 流,可以操作或取消进程的输出。 例如,您可以筛选文本、用不同方式将其格式化,也可以将输出同时写入控制台和指定的日志文件中
process.StartInfo.RedirectStandardError = true; //重定向错误流
process.Start();
process.StandardInput.WriteLine(textBox1.Text);
process.StandardInput.WriteLine(textBox2.Text);
textBox3.Text = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
}
catch (IOException ioEx)
{
throw ioEx;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
这里有一些需要注意的事情:
WaitForExit:设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。
也就是程序会卡在那里等你把缓存区的数据读完
StreamReader.ReadToEnd :从流的当前位置到末尾读取所有字符。
如果这两句话调换了位置,会导致:程序卡在那里等你把缓存区读完,而不能执行后面的读取缓存区的操作了,导致
一个死循环,程序卡机