Incrustar una consola de DOS en un formulario de Windows

¿Es posible incrustar una consola de DOS en Windows Form o Control de usuario en C # 2.0?

Tenemos un producto heredado de DOS con el que mi aplicación de Windows tiene que interactuar, y se ha solicitado que una instancia del producto heredado se ejecute dentro de la aplicación de Windows.

Por el momento, estoy usando user32.dll para ubicar la ventana en la que se está ejecutando el producto DOS, minimizando, luego maximizando la ventana y escribiendo caracteres en la ventana. Esta no es una solución muy buena para el problema, ya que significa que mi aplicación debe almacenar el nombre de la ventana en la configuración de la aplicación y requiere que el usuario regrese a la página correcta de la aplicación DOS antes de usar la función de interacción.

EDITAR: algo más de información

La aplicación heredada debe ser visible para el usuario, pero no en una ventana separada.

He intentado la respuesta de TimothyP y funciona muy bien, pero ¿es posible lograr la misma funcionalidad, pero con la ventana de DOS integrada visualmente en un formulario de Windows o control de usuario en lugar de aparecer en su propia ventana? Preferiblemente en un modo ShowDialog () para que el usuario no pueda interactuar con la aplicación mientras están en ‘Modo heredado’, por así decirlo.

Es posible redirigir la entrada / salida estándar de las aplicaciones de consola / dos utilizando la clase Process. Puede parecerse a esto:

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(); 

Ahora puede usar las transmisiones para interactuar con la aplicación. Al establecer processStartInfo.CreateNoWindow en true, la aplicación original estará oculta.

Espero que esto ayude.

Con respecto a su pregunta sobre cómo mostrar la aplicación DOS dentro de la aplicación de Windows.

Hay algunas soluciones.

  • El primero es simplemente no mostrar la aplicación DOS (con CreateNoWindow) y “simular” la interfaz de usuario de la aplicación DOS en su aplicación de Windows leyendo y escribiendo en las transmisiones.

  • La otra solución sería usar Win32API, obtener el identificador de Windows (Whnd) de la ventana de la aplicación de consola / DOS y establecer su elemento principal en su formulario. Actualmente no estoy en casa y dado que ha pasado años desde que hice esto, no recuerdo de memoria cómo se hace. Si no me equivoco, deberá usar las siguientes llamadas a la API de Win32:

    • FindWindow
    • GetWindow
    • SetParent

Si me queda algo de tiempo más tarde hoy, veré si puedo encontrar mejores muestras.

Puede usar la función CreateProcess y los miembros hStdInput, Output y Error del argumento STARTUPINFO, esto le permitirá interceptar entrada y salida estándar de la aplicación.