我正在使用调用创建一个进程:
的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为控制台分配了一个单独的缓冲区。
答案 0 :(得分:1)
您可以使用freopen重定向stdout
和stdin
。
示例:
freopen ("file.txt","w", stdout); //or stdin
修改强>
您也可以使用createpipe()
并从管道末尾读取。然后,您可以告诉管道,您希望在何处读取或存储/显示数据。如果这不是您想要的,请通过评论详细说明。