有没有一种方法可以将ac#winforms程序写入控制台窗口?
基本上有两件事情可以在这里发生。
一个winforms程序可以将自己附加到创建它的控制台窗口(或者不同的控制台窗口,或者如果需要,也可以添加到新的控制台窗口)。 一旦连接到控制台窗口Console.WriteLine()等按预期工作。 这种方法的一个问题是,程序立即将控制权交还给控制台窗口,然后继续写入,所以用户也可以在控制台窗口中输入。 你可以用/ wait参数来处理这个问题。
链接启动命令语法
这是当别人从别的地方输出程序的输出,例如。
yourapp> file.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); } }