Подтвердить что ты не робот

Вставка консоли DOS в виде окна

Можно ли встроить консоль DOS в Windows Form или User Control в С# 2.0?

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

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

EDIT: дополнительная информация

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Существует несколько решений.

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

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

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

Ответ 3

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