将输出从C# winforms应用程序写入主控台[duplicate]

tkqqtvp1  于 2022-11-17  发布在  C#
关注(0)|答案(1)|浏览(136)

此问题在此处已有答案

9年前关闭了。

可能重复:

How do I show console output/window in a forms application?
有没有办法让c# winforms程序写入控制台窗口?

ff29svar

ff29svar1#

这里基本上会发生两件事。
1.控制台输出
winforms程序可以将自身附加到创建它的控制台窗口(或者添加到不同的控制台窗口,或者如果需要的话,添加到新的控制台窗口)。一旦附加到控制台窗口Console。WriteLine()等按预期工作。这种方法的一个陷阱是程序立即将控制返回到控制台窗口,然后继续向其写入,所以用户也可以在控制台窗口中输入。我认为可以使用带有/wait参数的start来处理这个问题。
Start commsnd syntax
1.重定向的控制台输出
这是当有人管道的输出从您的程序在其他地方,例如。
yourapp〉文件. txt
在这种情况下,附加到控制台窗口实际上忽略了管道。要实现此功能,您可以调用Console.OpenStandardOutput()来获取输出应该通过管道传输到的流的句柄。这仅在输出通过管道传输时有效,因此,如果您希望处理这两种情况,则需要打开标准输出并写入其中,然后附加到控制台窗口。这确实意味着输出被发送到控制台窗口到管道,但这是我能找到的最好的解决方案。下面的代码我用来做这件事。

// This always writes to the parent console window and also to a redirected stdout if there is one.
// It would be better to do the relevant thing (eg write to the redirected file if there is one, otherwise
// write to the console) but it doesn't seem possible.
public class GUIConsoleWriter : IConsoleWriter
{
    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern bool AttachConsole(int dwProcessId);

    private const int ATTACH_PARENT_PROCESS = -1;

    StreamWriter _stdOutWriter;
  
    // this must be called early in the program
    public GUIConsoleWriter()
    {
        // this needs to happen before attachconsole.
        // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere
        // I guess it probably does write somewhere, but nowhere I can find out about
        var stdout = Console.OpenStandardOutput();
        _stdOutWriter = new StreamWriter(stdout);
        _stdOutWriter.AutoFlush = true;

        AttachConsole(ATTACH_PARENT_PROCESS);
    }

    public void WriteLine(string line)
    {
        _stdOutWriter.WriteLine(line);
        Console.WriteLine(line);
    }
}

相关问题