undermuz
@undermuz
Full-Stack Developer

Как получить вывод cmd.exe с сохранением цвета?

Проблема в том, что через конструкцию:

cmdProcess = new Process();
var procStartInfo = new ProcessStartInfo( "cmd", "/k \"C:\\Program Files (x86)\\Far Manager\\Far.exe\"" );

procStartInfo.RedirectStandardOutput = true;
procStartInfo.RedirectStandardInput = true;
procStartInfo.UseShellExecute = false;

procStartInfo.CreateNoWindow = true;
cmdProcess.OutputDataReceived += ( s, e ) => {
       callbackFn(e.Data + "\n");
};
cmdProcess.StartInfo = procStartInfo;

cmdProcess.Start();
cmdProcess.BeginOutputReadLine();


Нельзя получить цвет и нельзя получить вывод с far manager. С winAPi у меня не получилось разобраться - только создать процесс.

Я пробовал через ReadConsoleOutput но в итоге получаю только пустой буфер.

Подскажите как можно получить нормальный вывод?
  • Вопрос задан
  • 427 просмотров
Решения вопроса 1
undermuz
@undermuz Автор вопроса
Full-Stack Developer
Разобрался сам, примерный код:
ConsoleApi.PROCESS_INFORMATION _p = ConsoleApi.createConsoleTerminal(command);

            Thread.Sleep(1000);

            bool resultFree = ConsoleApi.FreeConsole();

            if (resultFree)
            {
                Debug.WriteLine("FreeConsole: {0}", true);
            }
            else
            {
                Debug.WriteLine("FreeConsole: {0}", false);
            }

            Debug.WriteLine("Process ID: {0}", _p.dwProcessId);

            bool result = ConsoleApi.AttachConsole(_p.dwProcessId);

            Debug.WriteLine("AttachConsole: {0}", result);

            IntPtr _consoleH = ConsoleApi.GetStdHandle(ConsoleApi.STD_OUTPUT_HANDLE);

            ConsoleApi.CONSOLE_SCREEN_BUFFER_INFO _bufferInfo;

            bool getInfo = ConsoleApi.GetConsoleScreenBufferInfo(_consoleH, out _bufferInfo);

            if (getInfo)
            {
                Debug.WriteLine("GetConsoleScreenBufferInfo: {0}x{1}", _bufferInfo.dwSize.X, _bufferInfo.dwSize.Y);
            }
            else
            {
                Debug.WriteLine("GetConsoleScreenBufferInfo: {0}", false);
            }

            while(true)
            {
                IEnumerable<string> rows = ConsoleApi.ReadFromBuffer(_consoleH, 0, 0, _bufferInfo.dwSize.X, _bufferInfo.dwSize.Y);

                foreach (string row in rows)
                {
                    Debug.WriteLine(row);
                }

                Thread.Sleep(1000);
            }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ты запускаешь командную оболочку "cmd.exe" а затем говоришь ей запустить Far, затем читаешь вывод "cmd.exe".
Почему бы сразу не запустить Far и не прочитать его вывод?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы