2009-01-16 12 views
7

Este es mi problema. Tengo un programa que debe ejecutarse en un TTY, cygwin brinda este TTY. Cuando redirijo a stdIn, el programa falla porque no tiene un TTY. No puedo modificar este programa y necesito alguna forma de automatizarlo.¿Cómo enviar entrada a la consola como si el usuario estuviera escribiendo?

¿Cómo puedo tomar la ventana de cmd.exe y enviar datos y hacer que piense que el usuario está tipeando?

Estoy usando C#, creo que hay una manera de hacerlo con java.awt.Robot pero tengo que usar C# por otras razones.

+0

ver también la otra pregunta acerca de esto: http: //stackoverflow.com/questions/450741/getting-the-pipe-from-rsync-to-run-as-a-script –

+0

esa fue mi otra pregunta, decidí probar de otra manera, de ahí una pregunta diferente – Malfist

Respuesta

1

Esto suena como una tarea para SendKeys(). No es C#, pero VBScript, pero nontheless - que pidió algunos forma de automatizar que:

Set Shell = CreateObject("WScript.Shell") 

Shell.Run "cmd.exe /k title RemoteControlShell" 
WScript.Sleep 250 

Shell.AppActivate "RemoteControlShell" 
WScript.Sleep 250 

Shell.SendKeys "dir{ENTER}" 
+0

En realidad, ya estaba mirando SendKeys. SendKey's es parte del framework .NET 2.0, así que puedo usarlo desde C#. Veré si esto funciona. – Malfist

+0

¿Cómo puedo hacer para que funcione en C#? – Malfist

+1

El uso de la clase SendKeys básicamente requiere que active el TTY, entonces simplemente llama a SendKeys.Send y envía las teclas. –

1

¿Puede iniciar el programa (o cygwin) dentro de su código, usando ProcessStartInfo.RedirectStandardInput (y salida/error) para controlar el flujo de datos?

+0

I puede comenzarlo con eso. Pero una vez que llega es el punto donde el programa tiene que tener el TTY falla. El programa solicita una contraseña y modifica el TTY para ocultar las pulsaciones de teclas. No puede hacer esto con una secuencia redirigida, por lo que falla. – Malfist

+0

¿Tiene un buen ejemplo de esto Jon? –

+0

@ Longhorn213: No sin una buena cantidad de trabajo, no :( –

0

tuve un problema similar hace algún tiempo, cygwin debe escribir alguna información útil (exacta cygwin funciones, texto de error y Código de error WINAPI) a la secuencia de error, debe redirigirlo a algún lugar y leer lo que escribe.

+0

no, cygwin escribe _everything_ en StandardErrorStream.El error se trata de ioclt inapropiado para el dispositivo, lo que significa que necesito un TTY real para usarlo. – Malfist

+0

¿Puede incluir un mensaje de error completo de cygwin aquí? – okutane

+0

bash: [####: #] tcsetattr: ioctl inapropiado para el dispositivo – Malfist

5

He descubierto cómo enviar la entrada a la consola. Usé lo que dijo Jon Skeet. No estoy 100% seguro de que esta es la forma correcta de implementar esto.

Si hay algún comentario para mejorar esto, me encantaría aquí. Hice esto solo para ver si podía resolverlo.

Aquí es el programa me quedé que esperaron para la entrada de forma que el usuario

class Program 
{ 
    static void Main(string[] args) 
    { 
     // This is needed to wait for the other process to wire up. 
     System.Threading.Thread.Sleep(2000); 

     Console.WriteLine("Enter Pharse: "); 

     string pharse = Console.ReadLine(); 

     Console.WriteLine("The password is '{0}'", pharse); 


     Console.WriteLine("Press any key to exit. . ."); 
     string lastLine = Console.ReadLine(); 

     Console.WriteLine("Last Line is: '{0}'", lastLine); 
    } 
} 

Esta es la escritura aplicación de consola a la otra

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Find the path of the Console to start 
     string readFilePath = System.IO.Path.GetFullPath(@"..\..\..\ReadingConsole\bin\Debug\ReadingConsole.exe"); 

     ProcessStartInfo startInfo = new ProcessStartInfo(readFilePath); 

     startInfo.RedirectStandardOutput = true; 
     startInfo.RedirectStandardInput = true; 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     startInfo.CreateNoWindow = true; 
     startInfo.UseShellExecute = false; 

     Process readProcess = new Process(); 
     readProcess.StartInfo = startInfo; 

     // This is the key to send data to the server that I found 
     readProcess.OutputDataReceived += new DataReceivedEventHandler(readProcess_OutputDataReceived); 

     // Start the process 
     readProcess.Start(); 

     readProcess.BeginOutputReadLine(); 

     // Wait for other process to spin up 
     System.Threading.Thread.Sleep(5000); 

     // Send Hello World 
     readProcess.StandardInput.WriteLine("Hello World"); 

     readProcess.StandardInput.WriteLine("Exit"); 

     readProcess.WaitForExit(); 
    } 

    static void readProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     // Write what was sent in the event 
     Console.WriteLine("Data Recieved at {1}: {0}", e.Data, DateTime.UtcNow.Ticks); 
    } 
} 
Cuestiones relacionadas