Вставка консоли DOS в виде окна
Можно ли встроить консоль DOS в Windows Form или User Control в С# 2.0?
У нас есть устаревший продукт DOS, с которым мне нужно взаимодействовать мое приложение Windows, и было предложено запустить экземпляр унаследованного продукта в приложении Windows.
В настоящее время я использую user32.dll для поиска окна, в котором работает DOS, с минимальным увеличением окна и ввода символов в окно. Это не очень хорошее решение проблемы, так как это означает, что мое приложение должно хранить имя окна в настройках приложения и требует, чтобы пользователь вернулся к правильной странице приложения DOS перед использованием функции взаимодействия.
EDIT: дополнительная информация
Устаревшее приложение должно быть видимым пользователю, но не в отдельном окне.
Я пробовал ответ TimothyP, и он работает очень хорошо, но возможно ли достичь той же функциональности, но с окном DOS, визуально встроенным в форму окна или пользовательский контроль, а не появляться в нем собственное окно? Предпочтительно в режиме ShowDialog(), чтобы пользователь не мог взаимодействовать с приложением, так как они находятся в режиме "Legacy Mode".
Ответы
Ответ 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, это позволит вам перехватывать стандартный ввод и вывод приложения.