2008-12-10 41 views
16

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

我们有一个传统的DOS产品,我的Windows应用程序必须与其进行交互,并且已请求旧产品的实例应在Windows应用程序中运行。

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

编辑:一些更多的信息

继承应用程序必须对用户可见,但不是在一个单独的窗口。

我试过TimothyP的答案,它工作得很好,但它可以实现相同的功能,但与DOS窗口视觉嵌入在窗体或用户控件,而不是弹出它自己的窗口?最好采用ShowDialog()方式,这样用户就不会与应用程序进行交互,只要它们处于“传统模式”即可。

回答

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

我希望这会有所帮助。

+0

我如何使用“outputReader”与运行,直到用户存在,它不断outputing的应用程序?像nodejs http服务器,每次发出请求时都有新的行输出? – Ace 2016-02-26 13:51:33

1

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

4

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

有几个解决方案。

  • 第一种是根本就没有显示DOS应用程序(与CreateNoWindow) 并通过读取和写入流“模拟”在您的Windows应用程序的DOS应用程序的UI。

  • 另一种解决方案是使用Win32API,获取控制台/ DOS应用程序窗口的Windows句柄(Whnd)并将其父窗口设置为您的窗体。我目前不在家 ,而且自从我做完这件事后已经过了很多年了,我不记得它是如何完成的。如果我没有记错的话,你就需要使用下面的Win32 API调用:

如果我有一段时间后今天离开,我会看看我能否找到更好的样本。

+0

谢谢蒂莫西,我已经使用了FindWindow和GetWindow API调用,我今天会研究SetParent。 再次感谢您的帮助!希望有一天我能够得到回报。 – 2008-12-12 09:19:52

相关问题