Mar*_*ers 17 c# dos winforms c#-2.0
是否可以在Windows窗体或C#2.0中的用户控件中嵌入DOS控制台?
我们有一个我的Windows应用程序必须与之交互的遗留DOS产品,并且已经请求遗留产品的实例应该在Windows应用程序中运行.
目前,我正在使用user32.dll找到运行DOS产品的窗口,最小化然后最大化窗口,并在窗口中键入字符.这不是解决问题的非常好的解决方案,因为这意味着我的应用程序必须将窗口名称存储在应用程序设置中,并要求用户在使用交互功能之前返回到DOS应用程序的正确页面.
编辑:更多信息
遗留应用程序需要对用户可见,但不能在单独的窗口中显示.
我已经尝试了TimothyP的答案并且效果很好,但它是否可以实现相同的功能,但DOS窗口可视化地嵌入在窗体或用户控件中,而不是弹出它自己的窗口?优选地,以ShowDialog()方式使得用户不能与应用程序交互,他们处于"传统模式",可以这么说.
Tim*_*hyP 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();
Run Code Online (Sandbox Code Playgroud)
您现在可以使用流与应用程序进行交互.通过将processStartInfo.CreateNoWindow设置为true,将隐藏原始应用程序.
我希望这有帮助.
关于如何在 Windows 应用程序中显示 DOS 应用程序的问题。
有几种解决方案。
第一个是根本不显示 DOS 应用程序(使用 CreateNoWindow)并通过读取和写入流来“模拟”Windows 应用程序中 DOS 应用程序的 UI。
另一种解决方案是使用 Win32API,获取控制台/DOS 应用程序窗口的 Windows 句柄 (Whnd),并将其父级设置为您的窗体。我现在不在家,而且自从我做这件事以来已经很久了,我记不清是怎么做的了。如果我没记错的话,您将需要使用以下 Win32 API 调用:
如果今天晚些时候还有时间,我会看看是否能找到更好的样品。