【问题标题】:Embedding a DOS console in a windows form在 Windows 窗体中嵌入 DOS 控制台
【发布时间】:2010-09-26 05:23:20
【问题描述】:

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

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

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

编辑:更多信息

旧版应用需要对用户可见,但不能在单独的窗口中。

我已经尝试过 TimothyP 的答案,它运行良好,但是否有可能实现相同的功能,但 DOS 窗口可视地嵌入在 Windows 窗体或用户控件中,而不是在它自己的窗口中弹出?最好以 ShowDialog() 方式,这样用户就无法在他们处于“传统模式”时与应用程序交互。

【问题讨论】:

    标签: c# winforms c#-2.0 dos


    【解决方案1】:

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

    我希望这会有所帮助。

    【讨论】:

    • 如何将“outputReader”与不断运行和输出直到用户存在的应用程序一起使用?类似于 nodejs http 服务器,每次发出请求时都会输出一个新行?
    【解决方案2】:

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

    有几个解决方案。

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

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

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

    【讨论】:

    • 感谢 Timothy,我已经使用过 FindWindow 和 GetWindow API 调用,我今天将研究 SetParent。再次感谢你的帮助!希望有一天我能回报这个人情。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 2014-01-15
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多