Я не уверен, что это даже возможно - по крайней мере, не используя какой-то простой простой API.
Обратите внимание, что я не нашел (хотя я пытался) никакой информации в Интернете, которая прямо подтверждает это , но вот как я пришел к такому выводу.
Консоль в Windows является собственной подсистемой, управляемой csrss.exe
(и начиная с Windows Vista также conhost.exe
, но я отвлекся). Он имеет свой собственный набор API (AttachConsole
, WriteConsole
и т. Д.), И вы можете иметь только одну «консоль» на процесс.
CMD.EXE
с другой стороны, это просто еще одно приложение в режиме консоли, которое просто использует консоль и запускает ее в окне консоли. Вы можете наблюдать этот эффект, запустив другое приложение режима консоли и наблюдая за деревом процессов, например, Process Explorer: родительский процесс CMD.EXE отсутствует (скорее это Explorer или что-то еще, что вы использовали для его запуска - включая, конечно, CMD.EXE).
До сих пор я пытался показать разницу между «консолью» и CMD.EXE
, пакетными файлами или приложениями консольного режима в целом.
Поэтому, когда в CMD.EXE
вы используете > CON
, вы фактически вызываете тот же эффект, что и запись в CONOUT$
в собственных приложениях (или обычную запись в /dev/console
в UNIX-подобной ОС). Кажется, что нет прямого эквивалента для управляемого кода, так как Console.Out
и Console.Error
равны stdout
и stderr
в собственных приложениях (или 1
и 2
как дескрипторы файлов в CMD.EXE
) .
С учетом всего вышесказанного, когда вы запускаете процесс, вы можете только перенаправлять его стандартные выходные данные и стандартные потоки ошибок, но не (по сути) сообщения, которые он записывает на консоль (или дескриптор CONOUT$
). Я думаю, это было бы то же самое, что пытаться перенаправить вывод, который процесс записывает в какой-либо файл, что также (вообще) невозможно.
Этого можно достичь, используя некоторые перехваты или вводя что-то внутри дочернего процесса, чтобы получить вывод консоли.
Отсутствие возможности легко сделать это также (одна из) причин (ы), почему написать полную замену терминала (т. Е. Окна консоли, а не CMD.EXE
!) Для Windows нелегко и требует некоторых хаков или обходные пути.