Встраивание консоли DOS в форму Windows - PullRequest
17 голосов
/ 10 декабря 2008

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

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

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

РЕДАКТИРОВАТЬ: Дополнительная информация

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

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

Ответы [ 3 ]

22 голосов
/ 10 декабря 2008

Можно перенаправить стандартный ввод / вывод консольных / душевых приложений, используя класс 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 исходное приложение будет скрыто.

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

4 голосов
/ 11 декабря 2008

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

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

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

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

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

1 голос
/ 10 декабря 2008

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

...