2008-12-10 22 views
16

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

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

Por el momento, estoy usando el archivo 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.

EDIT: Algunas más información

La aplicación legado tiene que 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 incrustada visualmente en un formulario de Windows o control de usuario en lugar de aparecer en su propia ventana? Preferiblemente en una forma de ShowDialog() para que el usuario no pueda interactuar con la aplicación mientras están en 'Modo heredado', por así decirlo.

Respuesta

22

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, se ocultará la aplicación original.

Espero que esto ayude.

+0

¿Cómo uso el 'outputReader' con una aplicación que se ejecuta y se emite constantemente hasta que el usuario lo exista? ¿Algo así como un servidor http de nodejs, donde hay un nuevo resultado de línea cada vez que se realiza una solicitud? – Ace

1

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.

4

Acerca de su pregunta sobre cómo mostrar la aplicación DOS dentro de la aplicación Windows.

Existen algunas soluciones.

  • La primera de ellas es que simplemente no mostrar la aplicación de DOS (con CreateNoWindow) y "simular" la interfaz de usuario de la aplicación de DOS en su aplicación de Windows mediante la lectura y la escritura en los arroyos.

  • 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 como han pasado años desde que hice esto, no recuerdo de memoria cómo se hace.Si no me equivoco tendrá que utilizar las siguientes llamadas a la API de Win32:

Si tengo algo de tiempo el día de hoy , Veré si puedo encontrar mejores muestras.

+0

Gracias Timothy, ya he usado las llamadas FindWindow y GetWindow API. Hoy buscaré en SetParent. ¡Gracias de nuevo por su ayuda! Espero poder devolver el favor algún día. –

Cuestiones relacionadas