在调试期间拥有多个控制台窗口会非常方便(不是多个监视器,我已经有了)。 我想象中的解决方案是类似于 Console.WriteLine(1, String1),这将把 String1 发送到控制台窗口 1,而 Console.WriteLine(2, String2) 则将 String2 发送到控制台窗口 2。
Nope
一个进程只能关联一个控制台,因此如果调用进程已经有控制台,则 AllocConsole 函数会失败。进程可以使用 FreeConsole 函数从当前控制台中分离自己,然后可以调用 AllocConsole 创建一个新控制台或 AttachConsole 附加到另一个控制台。
您可以使用 WinForms 或 WPF 创建多个“控制台”窗口,并编写一个简单的 WriteLine
方法将文本附加到文本框或类似对象。
另一种选择是打开日志文件,并将其用作第二个“控制台”。
我有同样的需求,并在Stack Overflow上找到了你的问题。这是许多年以后的事情 :)
实际上,.NET没有这个功能,但我们可以通过使用网格将屏幕分割并使用一些缓冲来模拟它。
这里是一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void print(int x, int y, int n)
{
for(int i = 0; i < 20; i++)
{
Console.CursorLeft = x; Console.CursorTop = y++;
Console.Write(new string(n.ToString().Last(), 60));
}
}
static void Main(string[] args)
{
var l = new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
while (true)
{
Console.Clear();
Console.CursorVisible = false;
for (int i = 0; i < l.Count; i++)
{
print((i % 3) * 60, (i / 3) * 20, l[i]++);
}
Task.Delay(1000).Wait();
}
}
}
}
屏幕被分成一个 3x3 的网格,每个屏幕都使用光标位置进行更新。
它可以打包成一个库和通用的 API,就像你描述的一样:
Console.WriteLine(1, String1)
Console.WriteLine(2, String2)
不行。Console类只是Win32控制台的一个非常薄的包装器,基本上你使用cmd.exe时看到的所有内容。在单个进程中无法创建两个这样的控制台。
可以。在WPF或WinForms中,可以构建一个非常类似控制台的类,并将其用于向命令行应用程序输出文本。