把控制台程序嵌入到 WinForm 中执行
我们经常有一些用控制台实现的简单应用,这种应用一般都是一步一步“向导”式执行,在每一步上收集用户的输入,最后得到程序执行的结果。但有些用户可能不喜欢用键盘操作的命令行界面,还是愿意用鼠标点点按钮的 Windows 窗体。另外控制台程序的参数输入是按顺序执行,到了下一步就不能再更改前面的输入了,而在 Windows 窗体上我们可以等用户把所有需要的参数都已录入完成并进行了验证后,再一次性提交执行。要实现这两种需求,一个好的办法就是把控制台程序“嵌入”到 WinForm 中执行,这样既能给用户以良好的使用体验,又能复用已有的控制台程序。
所谓“嵌入”执行,是指写一个 WinForm 程序去调用控制台程序,并向控制台程序传入参数数据,读取控制台的输出。其中的关键是重定向控制台程序的输入输出,用到的主要类型为 Process、ProcessStartInfo、StreamWriter。
假设已有控制台程序 DemoConsole.exe,具体步骤如下:
1. 新建 Windows 应用程序,在 Form 窗体中设置启动 DemoConsole、接受用户输入数据和显示 DemoConsole 输出的界面元素,比如按钮、文本框等。
2. 用 DemoConsole.exe 文件名初始化 ProcessStartInfo,并设置 ProcessStartInfo 对象的相关属性值,使其不再使用 Windows 外壳程序执行,不显示窗体,还要重定向标准输入和输出。
3. 初始化 Process,设置 Process 对象的 StartInfo 属性值为步骤 2 中得到的 ProcessStartInfo 对象。处理 Process 对象的 OutputDataReceived 事件,可以获取并显示 DemoConsole 的输出。调用 Process 对象的 Start 方法启动 DemoConsole 进程。
4. 访问步骤 3 中得到的 Process 对象的 StandardInput 属性,可以得到一个 StreamWriter 类型的对象,在调用 Process 对象的 BeginOutputReadLine 方法后,就可以通过 StreamWriter 对象的 WriteLine 方法向 DemoConsole 传入参数数据,驱动 DemoConsole 执行。
5. DemoConsole 执行完毕后,把 StreamWriter 和 Process 对象关闭。
我们这里用到的 Process 类型其功能是非常强大的,当然不仅仅可以访问控制台程序,实际上它对本地和远程的各种 Windows 程序都可以控制和监视。但本文重点不在此,就不再赘述了。
示例程序下载