Ошибки при работе с консолью в отдельном потоке

200
16 марта 2018, 11:23

Мне нужно, чтобы в моем приложении открывалась консоль (оно не консольное xD). Я создаю поток, который должен открыть консоль. Но после открытия, во-первых, не работают команды Console.WriteLine(), иногда выдает ошибку Неверный дескриптор на Console.Readline() и Console.Clear() (другие пока не использовал), еще при втором запуске не дает печатать текст. Помогите мне сделать так, чтобы в этом потоке консоль работала как в "Консольном приложении". Вот код:

public static class CMD
    {
        private static string InPut;
        private static bool StopConsole = false;
        private static bool StartConsole = false;
        public static void Console()
        {
            StartConsole = true;
            if (AllocConsole())
            {
                System.Console.WriteLine("Для выхода наберите exit");
                InPut = null;
                while (true)
                {                    
                    InPut = System.Console.ReadLine();
                    if (InPut == "exit")
                        break;
                    switch (InPut)
                    {
                        case "cls":
                            System.Console.Clear();
                            break;
                        default:
                            System.Console.WriteLine("Команда не найдена\n");
                            break;
                    }
                }
                FreeConsole();
                StopConsole = true;
            }
            StartConsole = false;
        }
        public static void SetConsole()
        {
            while (true)
                if (Keyboard.GetState().IsKeyDown(Keys.LeftControl) && Keyboard.GetState().IsKeyDown(Keys.S) && !StartConsole)
                {
                    Thread ConsoleThread = new Thread(Console);
                    ConsoleThread.Start();
                    if (StopConsole)
                    {
                        ConsoleThread.Abort();
                        StartConsole = false;
                    }
                }
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool AllocConsole();
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool FreeConsole();
    }
READ ALSO
Передать в делегат конструктор класса?

Передать в делегат конструктор класса?

Возможно ли в делегат в качестве параметра передать пользовательский конструктор - что бы при вызове конструктора срабатывал делегат а вместе...

224
Новое окно в WPF C#

Новое окно в WPF C#

Есть два окна: MainWindow и Window1 В MainWindow есть кнопка:

205
Как правильно организовать архитектуру Wep Api?

Как правильно организовать архитектуру Wep Api?

Как правильно организовать архитектуру Wep Api?

201
Конвертация даты C#

Конвертация даты C#

Получаю с сервера данные, дата имеет такой формат: 2018-03-15T00:00:00+03:00

241