在Windows窗体中嵌入DOS控制台

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

我们有一个我的Windows应用程序必须与之交互的遗留DOS产品,并且已经请求遗留产品的实例应该在Windows应用程序中运行。

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

编辑:更多信息

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

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

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

我希望这有帮助。

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

有一些解决方案。

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

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

    • FindWindow函数
    • GetWindow
    • 的setparent

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

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