Написание консольной обертки на C #? - PullRequest
6 голосов
/ 09 января 2010

Я пытаюсь написать свою собственную оболочку командной строки, как 'Console2' в C #. К сожалению, я не нашел хороший способ сделать это.

Может ли кто-нибудь дать мне пример захвата ввода и вывода с консоли и направления его в приложение?

NB Я не пытаюсь создать консольное приложение, я пытаюсь создать оболочку для консоли - приложение windows-формы с richtextedit, которое действует как консоль и которое может обрабатывать ввод-вывод, как консоль Windows

Ответы [ 2 ]

7 голосов
/ 09 января 2010

Вы должны запустить cmd.exe с классом Process и пользовательским классом ProcessStartInfo, чтобы получить потоки StandardInput, StandardOutput и StandardError.

Подробнее о Класс ProcessStartInfo в MSDN .

Также на CodeProject есть хороший пример проекта. .

А Console2 - это проект с открытым исходным кодом, так что вы можете взглянуть на его код. Я знаю, что это C ++, но вы все еще получаете некоторые идеи, глядя на источник.

6 голосов
/ 13 января 2010

Вы не можете надежно получить весь вывод консоли из процесса, только перенаправив его стандартные дескрипторы. Как только он использует функции ввода / вывода в консоли, они будут работать только с реальной консолью, а не с дескрипторами файлов.

Как правило, по умолчанию, ненаправленные STD_INPUT_HANDLE, STD_OUTPUT_HANDLE и STD_ERROR_HANDLE являются только псевдо-дескрипторами, так как они не являются ядрами, известными ядру NT для этого процесса. API-интерфейсы ReadFile и WriteFile содержат хак, который проверяет эти псевдо-дескрипторы и перенаправляет вызов на ReadConsoleA и WriteConsoleA в зависимости от ситуации. Однако все консольные API работают только с псевдо-дескрипторами консоли (именуемые консольные входные буферы и консольные экранные буферы ) и завершатся ошибкой при передаче реального дескриптора файла .

Теперь, из-за этого перенаправления и того факта, что большинство программ используют файловые API при записи или чтении из консоли, это означает, что может иметь некоторый уровень перенаправления, но с тех пор, как вы хочу сделать это полный консольный эмулятор, этого будет недостаточно. Вы не сможете перехватывать любые вызовы, которые, например, изменяют размер или атрибуты экранного буфера, читают из него, создают альтернативные и т. Д.

Если вы не боитесь языка ассемблера и реверс-инжиниринга, вы можете изучить возможность подключения различных консольных API-интерфейсов к целевому процессу (и их дочерним элементам) или, в случае Windows 7, переопределить conhost.exe.

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