从C#打开两个控制台窗口

12
[DllImport("kernel32.dll")]
private static extern Int32 AllocConsole();

我可以使用这个命令打开cmd.exe。但我只能打开一个控制台窗口并在其中编写命令。如何打开另一个控制台窗口?有没有一种干净快速的方法来打开两个控制台窗口?


4
AllocConsole不会启动cmd.exe进程实例,它只是创建一个控制台窗口并将其附加到您的进程。 - nobody
我可以创建两个控制台窗口吗? - senzacionale
不行,你不能这样做。Windows 不允许。 - Hans Passant
1
请编辑此帖以表明您正在引用控制台窗口,而不是cmd.exe。 - Timwi
4个回答

20

所以你可以在一个单独的C#窗口应用程序中使用多个控制台窗口,但要这样做,你需要一些东西。Process.start()和命令行参数。

如果你这样做,你的应用程序可以创建另一个实例,但是使用不同的命令行参数来让每个部分做不同的事情。

以下是如何实现的简单示例。

    namespace Proof_of_Concept_2
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (args.Length!= 0)
                {
                    if (args[0] == "1")
                    {
                        AlternatePathOfExecution();
                    }
                    //add other options here and below              
                }
                else
                {
                    NormalPathOfExectution();
                }
            }


            private static void NormalPathOfExectution()
            {
                Console.WriteLine("Doing something here");
                //need one of these for each additional console window
                System.Diagnostics.Process.Start("Proof of Concept 2.exe", "1");
                Console.ReadLine();

            }
            private static void AlternatePathOfExecution()
            {
                Console.WriteLine("Write something different on other Console");
                Console.ReadLine();
            }

        }
    }

这是它工作的截图。 输入图像描述

总之,

获得2个控制台窗口很容易,让它们相互通信是一个独立的问题。但是我建议使用命名管道。相关的Stackoverflow帖子

您必须改变思维方式,因为一旦两个控制台运行在不同的进程上,它们不会自动相互通信。无论您在其中一个上进行什么计算,另一个都完全不知情。


那么,如何在进程之间进行通信呢? - Mikael Dúi Bolinder
1
@MikaelDúiBolinder 你可以通过WCF让它们进行对话,WCF具有进程间通信的API。https://drdobbs.com/windows/interprocess-communication-with-wcf/196802111 - Alexander Ryan Baggett
那将是最好的方法。但当然还有更具创意的解决方案。它们都可以与数据库或消息服务器通信。它们可以轮流写入文件。更现实的是,它们都可以调用Rest API。 - Alexander Ryan Baggett
那么只需将文本输入转发给主进程并从中获取输出?作为在XAML应用程序中使用TextBox创建自己的控制台的替代方案? - Mikael Dúi Bolinder

3

您可以做到

Process.Start("cmd.exe");

你想表达的是你可以随意多次使用它。这是你的意思吗?

1

很抱歉,您不能在Windows中的一个应用程序中拥有多个控制台窗口。


你能不能用C++编写一个应用程序,然后将其导入到C#中呢?请参阅此帖子https://dev59.com/sWEi5IYBdhLWcg3w6PvZ。 - Alexander Ryan Baggett

0
  1. 运行控制台应用程序(第一个窗口)
  2. 转到 bin > debug 并打开 YourApplication.exe 文件(第二个窗口)

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