在C#中编写控制台包装器?

时间:2010-01-09 12:07:33

标签: c# winapi console

我正在尝试在C#中编写自己的Command Line包装器,如'Console2'。不幸的是,我还没有找到一个好办法。

有人能给我一个抓住控制台输入和输出并将其导入应用程序的例子吗?

NB 我不是要创建一个控制台应用程序,我正在尝试为控制台创建一个包装器 - 一个带有richtextedit的Windows窗体应用程序,它像一个控制台,可以像Windows一样处理IO控制台

2 个答案:

答案 0 :(得分:7)

您应该使用Process类和用户ProcessStartInfo类启动cmd.exe,以获取StandardInput,StandardOutput和StandardError流。

详细了解ProcessStartInfo class on MSDN

此外,还有nice sample project at CodeProject.

Console2是一个开源项目,所以你可以看看它的代码。我知道它是C ++,但你仍然可以通过查看源代码获得一些想法。

答案 1 :(得分:6)

通过仅重定向其标准句柄,您无法可靠地从进程获取所有控制台输出。一旦它使用原始控制台I / O功能,它们只能用于真正的控制台而不是文件句柄。

通常,默认的,未归档的STD_INPUT_HANDLESTD_OUTPUT_HANDLESTD_ERROR_HANDLE只是伪句柄,因为不是NT内核为该进程知道的句柄。 ReadFileWriteFile API中有一个hack,用于检查这些伪句柄,并根据需要将调用重定向到ReadConsoleAWriteConsoleA。但是,所有控制台API 仅在控制台伪句柄(名为控制台输入缓冲区控制台屏幕缓冲区)上运行,并且在传递时将失败真正的文件句柄。

现在,由于这种重定向,以及大多数程序在写入或从控制台读取时使用文件API的事实意味着 可能具有某种程度的重定向,但是你想做的是一个完整的控制台模拟器,这还不够。您将无法捕获任何调用,例如,更改屏幕缓冲区的大小或属性,从中读取,创建备用缓冲区等等。

如果您不害怕汇编语言和逆向工程,可以考虑将各种控制台API挂钩到目标进程(及其子级),或者在Windows 7的情况下,重新实现conhost.exe