Как использовать отдельную консоль windows для дочерних консольных приложений? - PullRequest
2 голосов
/ 16 января 2020

Windows 10, C#,. NET Core 3.1

Я хочу иметь несколько консолей windows для вывода. Например, на одном дисплее я хочу разместить одно окно консоли, которое будет отображать только ошибки, на другом дисплее я хочу разместить набор другой консоли windows, который будет отображать различные отчеты. Все эти консоли windows предназначены только для чтения. Кроме того, в то же время я хочу иметь главное окно консоли, которое я буду использовать в качестве терминала (для ввода ключевых слов). Я видел подобное в фильмах о программистах и ​​хочу попробовать сделать то же самое:)

Я ожидал, что смогу создать дочерние процессы и записать в Input каждый из них из родительского процесса. Я ожидал, что у каждого дочернего процесса будет свое собственное окно консоли, но я вижу, что они используют окно консоли основного процесса.

Это мой основной код приложения:

using System;
using System.Diagnostics;

namespace ConsoleClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Console app...";

            Console.WriteLine("This is the message for the main console application.");

            var procInfo = new ProcessStartInfo(
                @".\logger\ConsoleLogger.exe");

            procInfo.UseShellExecute = false;
            procInfo.RedirectStandardInput = true;
            procInfo.CreateNoWindow = false;

            using (var proc = new Process())
            {
                proc.StartInfo = procInfo;
                proc.Start();

                var sw = proc.StandardInput;

                sw.WriteLine("This is the message for the child console application.");

                Console.WriteLine("Press ENTER for exit...");
                Console.ReadLine();
                proc.Kill();
            }
        }
    }
}

Это мой дочерний код приложения:

using System;
using System.Diagnostics;

namespace ConsoleLogger
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = $"Process #{Process.GetCurrentProcess().Id} (logger)";
            while (true)
            {
                var line = Console.In.ReadLine();
                Console.WriteLine(line);
            }
        }
    }
}

В результате получается общее окно консоли для обоих процессов (parrent и ребенок):

enter image description here

Как мне решить эту проблему?

UPD

Я думаю, что проблема в RedirectStandardInput использование. Я пытаюсь найти другое решение.

1 Ответ

0 голосов
/ 16 января 2020

Я попробовал следующее в VS 2019.

Я предполагаю, что ваши процессы не инициализированы правильно:

Приложение главной консоли код (запускает 2x процесса):

static void Main(string[] args)
    {
        Console.Title = "Main app...";
        Console.WriteLine("This is the message for the main console application.");

        using (var process1 = new Process())
        {
            process1.StartInfo.UseShellExecute = true;
            process1.StartInfo.CreateNoWindow = false;
            process1.StartInfo.FileName = @"../../../../ConsoleAppAdditional/bin\Debug\netcoreapp3.1/ConsoleAppAdditional.exe";
            process1.Start();
        }

        using (var process2 = new Process())
        {
            process2.StartInfo.UseShellExecute = true;
            process2.StartInfo.CreateNoWindow = false;
            process2.StartInfo.FileName = @"../../../../ConsoleAppAdditional/bin\Debug\netcoreapp3.1/ConsoleAppAdditional.exe";
            process2.Start();
        }

        Console.WriteLine("Press ENTER (MainApp) for exit...");
        Console.ReadLine();
    }

Вторичный код консольного приложения (в новом консольном проекте):

        static void Main(string[] args)
    {
        Console.Title = $"Process #{Process.GetCurrentProcess().Id} (logger additional)";
        {
            Console.WriteLine("New additionnal app started... " + Process.GetCurrentProcess().Id);
            var line = Console.In.ReadLine();
            Process.GetCurrentProcess().Kill();
        }
    }

Результат: Result of multiple consoles

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...