Встраивание консоли DOS в форму Windows

Можно ли встроить консоль DOS в форму Windows или пользовательский элемент управления в C # 2.0?

У нас есть устаревший продукт DOS, с которым мое приложение Windows должно взаимодействовать, и было запрошено, чтобы экземпляр старого продукта работал в приложении Windows.

В настоящее время я использую user32.dll, чтобы найти окно, в котором работает продукт DOS, сворачивая, затем увеличивая окно и вводя в него символы. Это не очень хорошее решение проблемы, поскольку оно означает, что мое приложение должно сохранять имя окна в настройках приложения и требует, чтобы пользователь вернулся на правильную страницу приложения DOS перед использованием функции взаимодействия.

РЕДАКТИРОВАТЬ: Еще немного информации

Устаревшее приложение должно быть видно пользователю, но не в отдельном окне.

Я попробовал ответ TimothyP, и он работает очень хорошо, но возможно ли достичь той же функциональности, но с окном DOS, визуально встроенным в форму окна или пользовательский элемент управления вместо всплывающего окна в собственном окне? Предпочтительно с помощью метода ShowDialog (), чтобы пользователь не мог взаимодействовать с приложением, так сказать, в «унаследованном режиме».

10.12.2008 11:14:34
3 ОТВЕТА
РЕШЕНИЕ

Можно перенаправить стандартный ввод / вывод консольных приложений, используя класс Process. Это может выглядеть примерно так:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters");

processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;

processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.CreateNoWindow = true;

Process process = new Process();
process.StartInfo = processStartInfo;
bool processStarted = process.Start();

StreamWriter inputWriter = process.StandardInput;
StreamReader outputReader = process.StandardOutput;
StreamReader errorReader = process.StandardError;
process.WaitForExit();

Теперь вы можете использовать потоки для взаимодействия с приложением. Если для свойства processStartInfo.CreateNoWindow задано значение true, исходное приложение будет скрыто.

Надеюсь, это поможет.

22
10.12.2008 11:26:11
Как я могу использовать «outputReader» с приложением, которое работает и постоянно выводит данные до тех пор, пока его не существует? Что-то вроде http-сервера nodejs, где каждый раз при выполнении запроса выводится новая строка?
Ace 26.02.2016 13:51:33

Вы можете использовать функцию CreateProcess и члены hStdInput, Output и Error аргумента STARTUPINFO, это позволит вам перехватывать стандартный ввод и вывод приложения.

1
10.12.2008 11:24:46

Относительно вашего вопроса о том, как отобразить приложение DOS в приложении Windows.

Есть несколько решений.

  • Во-первых, просто не отображать приложение DOS (с помощью CreateNoWindow) и «имитировать» интерфейс приложения DOS в приложении Windows путем чтения и записи в потоки.

  • Другое решение состоит в том, чтобы использовать Win32API, получить дескриптор Windows (Whnd) окна приложения Console / DOS и установить его родительский элемент в вашей форме. В настоящее время я не дома, и с тех пор, как я это сделал, прошло уже много лет, я не могу вспомнить, как это делается. Если я не ошибаюсь, вам нужно использовать следующие вызовы Win32 API:

Если сегодня у меня останется время, я посмотрю, смогу ли я найти лучшие образцы.

4
11.12.2008 13:16:19
Спасибо Тимоти, я уже использовал вызовы API FindWindow и GetWindow, сегодня я посмотрю на SetParent. В очередной раз благодарим за помощь! Надеюсь, я смогу вернуть услугу однажды.
Mark Withers 12.12.2008 09:19:52