一尘不染

在Windows窗体中嵌入DOS控制台

c#

是否可以在Windows窗体或C#2.0中的用户控件中嵌入DOS控制台?

我们有一个旧版DOS产品,我的Windows应用程序必须与之交互,并且有人要求在Windows应用程序中运行旧版产品的实例。

目前,我正在使用user32.dll来定位DOS产品在其中运行的窗口,最小化然后最大化该窗口,并在该窗口中键入字符。这不是解决该问题的很好方法,因为这意味着我的应用程序必须在应用程序设置中存储窗口名称,并且要求用户在使用交互功能之前返回到DOS应用程序的正确页面。

编辑:更多信息

旧版应用需要对用户可见,但不能在单独的窗口中显示。

我已经尝试过TimothyP的答案,并且效果很好,但是是否有可能实现相同的功能,但是将DOS窗口可视地嵌入到窗口窗体或用户控件中,而不是在自己的窗口中弹出?最好以ShowDialog()的方式进行操作,以便用户可以在处于“传统模式”的情况下无法与该应用进行交互。


阅读 625

收藏
2020-05-19

共1个答案

一尘不染

使用Process类可以重定向控制台/ DOS应用程序的标准输入/输出。它可能看起来像这样:

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,原始应用程序将被隐藏。

我希望这有帮助。

2020-05-19