在Windows窗体中嵌入DOS控制台

时间:2008-12-10 11:14:35

标签: c# winforms c#-2.0 dos

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

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

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

编辑:更多信息

遗留应用程序需要对用户可见,但不能在单独的窗口中显示。

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

3 个答案:

答案 0 :(得分:22)

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

我希望这会有所帮助。

答案 1 :(得分:4)

关于如何在Windows应用程序中显示DOS应用程序的问题。

有一些解决方案。

  • 第一个是不显示DOS应用程序(使用CreateNoWindow) 并通过读取和写入流来“模拟”Windows应用程序中DOS应用程序的UI。

  • 另一种解决方案是使用Win32API,获取Console / DOS应用程序窗口的Windows句柄(Whnd)并将其父级设置为您的表单。我现在不在家 自从我这么做以来已经很久了,我不记得它是如何完成的。如果我没弄错的话,你需要使用以下Win32 API调用:

如果我今天晚些时候剩下一些时间,我会看看能不能找到更好的样品。

答案 2 :(得分:1)

您可以使用CreateProcess函数以及STARTUPINFO参数的hStdInput,Output和Error成员,这将允许您拦截应用程序的标准输入和输出。