C#: Неправильная кодировка при скрытом консольном окне

Рейтинг: 1Ответов: 0Опубликовано: 17.04.2023

Есть WPF-приложение. К нему подключен класс ConsoleWindow.cs для отображения консольного окна приложения.

Иногда возникает необходимость выполнить процесс и вывести в окно приложения его StandartOutput или StandartError.

Делаю это так:

ProcessStartInfo process = new ProcessStartInfo("cmd.exe", $"/c \"{command}\"");
process.CreateNoWindow = true;
process.RedirectStandardOutput = true;
process.RedirectStandardError = true;
Process proc = Process.Start(process);

string output = proc.StandardOutput.ReadToEnd();
string error = proc.StandardError.ReadToEnd();

Если в момент выполнения команды консольное окно отображено, то ошибка выполнения команды выводится в диалоговое окно корректно.

введите сюда описание изображения

Но если консоль скрыта, то выводится что-то такое:

введите сюда описание изображения

С чем это связано и как можно исправить? Я пробовал вручную устанавливать кодировку для ошибки и вывода, но это не помогло.


ConsoleWindow.cs:

using System;
using System.Runtime.InteropServices;

namespace TestWpfApp
{
    public class ConsoleWindow
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool AllocConsole();

        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int SW_HIDE = 0;
        const int SW_SHOW = 5;

        public static void ShowConsoleWindow()
        {
            var handle = GetConsoleWindow();

            if (handle == IntPtr.Zero)
                AllocConsole();
            else
                ShowWindow(handle, SW_SHOW);
        }

        public static void HideConsoleWindow()
        {
            var handle = GetConsoleWindow();
            ShowWindow(handle, SW_HIDE);
        }
    }
}

Ответы

Ответов пока нет.