您是否可以拥有多个.NET控制台(比如Console.Writeline)?

5

在调试期间拥有多个控制台窗口会非常方便(不是多个监视器,我已经有了)。 我想象中的解决方案是类似于 Console.WriteLine(1, String1),这将把 String1 发送到控制台窗口 1,而 Console.WriteLine(2, String2) 则将 String2 发送到控制台窗口 2。

4个回答

6

Nope

一个进程只能关联一个控制台,因此如果调用进程已经有控制台,则 AllocConsole 函数会失败。进程可以使用 FreeConsole 函数从当前控制台中分离自己,然后可以调用 AllocConsole 创建一个新控制台或 AttachConsole 附加到另一个控制台。

[http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx](http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx)

您可以使用 WinForms 或 WPF 创建多个“控制台”窗口,并编写一个简单的 WriteLine 方法将文本附加到文本框或类似对象。

另一种选择是打开日志文件,并将其用作第二个“控制台”。


这些功能在 .Net 中有包装器吗? - configurator
我不知道。如果可以的话,应该可以使用P/Invoke。 - Logan Capaldo
问题是P/Invoke它们不会崩溃(和烧毁)控制台API。它肯定可能会... - configurator

5

我有同样的需求,并在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)

希望这能帮助到某些人。

5

一个应用程序中是否可以有两个Windows控制台?

不行。Console类只是Win32控制台的一个非常薄的包装器,基本上你使用cmd.exe时看到的所有内容。在单个进程中无法创建两个这样的控制台。

我能有两个类似控制台的窗口吗?

可以。在WPF或WinForms中,可以构建一个非常类似控制台的类,并将其用于向命令行应用程序输出文本。


2
与其使用多个控制台,您可能要考虑使用多个日志附加器的想法。我并不是很喜欢 printf 调试,但有时候我会觉得多个日志文件有用。使用类似于 log4net 的东西,您可以配置多个附加器和记录器,这些附加器和记录器对应不同的类/命名空间,并将它们记录到单独的文件中。您可以使用日志信息来帮助调试,使用像 TextPad 这样的工具查看日志文件,因为 TextPad 不像 NotePad 那样能检测并允许您查看打开文件时所做的任何更新的内容。可能还有其他编辑器也支持这一点,但我只熟悉 TextPad。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接