c#如何将stdout重定向到新的进程窗口?

时间:2015-05-27 16:48:15

标签: c# windows

我正在使用调用创建一个进程:

的Process.Start(StartInfo的);

startInfo.WindowStyle = ProcessWindowStyle.Normal;
startInfo.FileName = "cmd.exe";
startInfo.UseShellExecute = true;
startInfo.RedirectStandardInput = false;
startInfo.RedirectStandardOutput = false;

当进程使用这些参数运行时,它会输出到新进程的窗口。

但是,当我在不重定向标准输出的情况下使UseShellExecute为false时,该过程不再打印到屏幕上。这是预期的行为吗?

如果是这样,我如何写入流程开始的新窗口?

我可以使用StandardOutput.Read()手动从流程中获取数据,但我不知道如何将其写入新窗口。当我创建该窗口时,默认情况下它似乎有一个控制台。

我可以使用pinvoke在新进程上调用C ++函数:

[DllImport("kernel32", SetLastError = true)]
        private static extern bool AttachConsole(int dwProcessId);

我认为我可以使用函数" writeconsole"来编写新窗口的控制台。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401%28v=vs.85%29.aspx

但是,我想知道是否可以使用.net库来实现这一点。我觉得我想要的东西并不复杂,所以这是必要的。

我想要的就是能够启动一个新进程并将该进程的stdout重定向到该进程中创建的新窗口,同时保留写入stdin的能力。

编辑: 使用console.writeline写入只会写入程序的主控制台。我的应用程序是一个gui应用程序,所以说实话,我不知道它写到的确切位置,但我知道你可以在选项卡"输出"下看到这个输出。在视觉工作室,但不是在程序本身的窗口。我认为.net为控制台分配了一个单独的缓冲区。

1 个答案:

答案 0 :(得分:1)

您可以使用freopen重定向stdoutstdin

示例:

freopen ("file.txt","w", stdout); //or stdin

修改 您也可以使用createpipe()并从管道末尾读取。然后,您可以告诉管道,您希望在何处读取或存储/显示数据。如果这不是您想要的,请通过评论详细说明。