Изменение цвета консоли после скрытия и показа снова - PullRequest
0 голосов
/ 24 апреля 2019

С кодом, который я нашел в этой теме

приложение no-output-to-console-from-a-wpf

я могу показать искрыть консоль, как и ожидалось, с помощью функции «Toggle ()».В первый раз, когда я это делаю, работает настройка «Console.BackgroundColor» и «Console.ForegroundColor».

После скрытия и повторного показа вывод на консоль с «Console.WriteLine» работает, но настройкацвет больше не влияет.

Что я также заметил, что функция "GetConsoleWindow ()" возвращает каждый раз новый IntPtr, может быть, это помогает.

Надеюсь, вы понимаете мою проблему иможет помочь мне.

Большое спасибо, Бфрей

[SuppressUnmanagedCodeSecurity]
public static class ConsoleManager
{
    private const string Kernel32DllName = "kernel32.dll";

    [DllImport(Kernel32DllName)]
    private static extern bool AllocConsole();
    [DllImport(Kernel32DllName)]
    private static extern bool AttachConsole();

    [DllImport(Kernel32DllName)]
    private static extern bool FreeConsole();

    [DllImport(Kernel32DllName)]
    public static extern IntPtr GetConsoleWindow();

    public static bool HasConsole
    {
        get { return GetConsoleWindow() != IntPtr.Zero; }
    }

    /// <summary>
    /// Creates a new console instance if the process is not attached to a console already.
    /// </summary>
    public static void Show()
    {

        //#if DEBUG
        if (!HasConsole)
        {
            AllocConsole();
            InvalidateOutAndError();
        }
        //#endif
    }

    /// <summary>
    /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown.
    /// </summary>
    public static void Hide()
    {
        //#if DEBUG
        if (HasConsole)
        {
            SetOutAndErrorNull();
            FreeConsole();
        }
        //#endif
    }

    public static void Toggle()
    {

        if (HasConsole)
        {
            Hide();
        }
        else
        {
            Show();

        }
    }

    static void InvalidateOutAndError()
    {

        Type lType = typeof(Console);

        System.Reflection.FieldInfo lOut = lType.GetField("_out",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.FieldInfo lError = lType.GetField("_error",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        System.Reflection.MethodInfo lInitializeStdOutError = lType.GetMethod("InitializeStdOutError",
            System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);

        Debug.Assert(lOut != null);
        Debug.Assert(lError != null);

        Debug.Assert(lInitializeStdOutError != null);

        lOut.SetValue(null, null);
        lError.SetValue(null, null);

        lInitializeStdOutError.Invoke(null, new object[] {true});

    }

    static void SetOutAndErrorNull()
    {
        Console.SetOut(TextWriter.Null);
        Console.SetError(TextWriter.Null);

    }
}
...