是否可以在Windows窗体或C#2.0中的用户控件中嵌入DOS控制台?
我们有一个旧版DOS产品,我的Windows应用程序必须与之交互,并且有人要求在Windows应用程序中运行旧版产品的实例。
目前,我正在使用user32.dll来定位DOS产品在其中运行的窗口,最小化然后最大化该窗口,并在该窗口中键入字符。这不是解决该问题的很好方法,因为这意味着我的应用程序必须在应用程序设置中存储窗口名称,并且要求用户在使用交互功能之前返回到DOS应用程序的正确页面。
编辑:更多信息
旧版应用需要对用户可见,但不能在单独的窗口中显示。
我已经尝试过TimothyP的答案,并且效果很好,但是是否有可能实现相同的功能,但是将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,原始应用程序将被隐藏。
我希望这有帮助。