重定向启动进程输出并将其打印回C#中的控制台

时间:2016-06-21 08:34:10

标签: c# winforms redirect console output

我有一个WinForms应用程序。在该应用程序内部我正在开始一个新进程,我希望将此特定进程(而不是整个winforms应用程序)的输出重定向到控制台。 本机方法AllocConsole()对我来说不够好,因为它接管了整个WinForms应用程序的控制权,当我关闭控制台时它也会关闭GUI表单。

我试图使用AttachConsole(int dwProcessId) 并将输出重定向到我正在启动的进程的控制台,但我无法弄清楚它为什么不起作用。

我无法将AttachConsole放在其他地方,因为只有在流程开始运行后才能获取流程ID。

有什么建议吗?

P.S。我这样做是因为我需要对输出进行操作并将其“实时”打印给用户,如果您有任何其他与我在此处写的内容无关的建议,我会很高兴听到它们。

由于

public static void RedirectOutput(string program, string parameters)
{

    Process process = new Process();          

    process.StartInfo.FileName = program;
    process.StartInfo.Arguments = parameters;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;

    process.OutputDataReceived += new DataReceivedEventHandler(OutputConsoleHandler);
    process.ErrorDataReceived += new DataReceivedEventHandler(OutputConsoleHandler);

    process.Start();

    AttachConsole(process.Id);

    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    process.WaitForExit();

}

public static void OutputConsoleHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
    Console.WriteLine(outLine.Data);
}

[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);

1 个答案:

答案 0 :(得分:0)

您需要实现自定义跟踪侦听器。在这个类中产生一个控制台窗口和内部的Write / Write Line方法,你可以将内容打印到窗口