Консольный вывод в приложении winforms GUI - PullRequest
0 голосов
/ 01 апреля 2020

все!

Пожалуйста, помогите мне с любым советом по моей проблеме: я создаю GUI приложение WinForms и теперь я хочу подключить консоль к нему. Я обнаружил, что это не так просто, как кажется раньше. Но я нашел хорошее решение здесь: Как показать вывод консоли / окно в приложении форм? Ниже кода из rag answer.

using System;
using System.Runtime.InteropServices;

namespace SomeProject
{
    class GuiRedirect
    {
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetStdHandle(StandardHandle nStdHandle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetStdHandle(StandardHandle nStdHandle, IntPtr handle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern FileType GetFileType(IntPtr handle);

    private enum StandardHandle : uint
    {
        Input = unchecked((uint)-10),
        Output = unchecked((uint)-11),
        Error = unchecked((uint)-12)
    }

    private enum FileType : uint
    {
        Unknown = 0x0000,
        Disk = 0x0001,
        Char = 0x0002,
        Pipe = 0x0003
    }

    private static bool IsRedirected(IntPtr handle)
    {
        FileType fileType = GetFileType(handle);

        return (fileType == FileType.Disk) || (fileType == FileType.Pipe);
    }

    public static void Redirect()
    {
        if (IsRedirected(GetStdHandle(StandardHandle.Output)))
        {
            var initialiseOut = Console.Out;
        }

        bool errorRedirected = IsRedirected(GetStdHandle(StandardHandle.Error));
        if (errorRedirected)
        {
            var initialiseError = Console.Error;
        }

        AttachConsole(-1);

        if (!errorRedirected)
            SetStdHandle(StandardHandle.Error, GetStdHandle(StandardHandle.Output));
    }
}

This код работает как прелесть, за исключением одного недостатка: нелатинские буквы выводятся на консоль в странной кодировке (но если перенаправлены в файл, они в правильной кодировке) Мне нужно перенаправить как StdOut, так и StdErr, и если я изменю какую-либо часть кода, он перестанет перенаправлять.

1 Ответ

0 голосов
/ 02 апреля 2020

Спасибо всем, кто поделился со мной своей мудростью в комментариях!

SetConsoleOutputCP был ответом.

Не забудьте указать это в других определениях класса.

[DllImport("kernel32.dll")]
static extern bool SetConsoleOutputCP(uint wCodePageID);

А потом добавить вызов SetConsoleOutputCP ( нужная кодовая страница ); метод Redirect ().

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