2010-03-25 11 views
5

Duplicar posible:
How do I send ctrl+c to a process in c#?C#: enviar ctrl + c al programa de la consola iniciado con Process.Start()?

no puedo encontrar la manera de simular el envío de Ctrl +C a un programa externo. Cuando ejecuto el programa manualmente a través de CMD, cuando presiono Ctrl + c, abortará y me preguntará si deseo guardar antes de que se cierre por completo. Intento simular esto a través de C#, pero parece que no funciona.

Esto es lo que estoy haciendo ahora:

// Create new process object 
process = new Process(); 

// Setup event handlers 
process.EnableRaisingEvents = true; 
process.OutputDataReceived += OutputDataReceivedEvent; 
process.ErrorDataReceived += ErrorDataReceivedEvent; 
process.Exited += ProgramExitedEvent; 

// Setup start info 
ProcessStartInfo psi = new ProcessStartInfo 
{ 
    FileName = ExePath, 
    UseShellExecute = false, // Must be false to redirect IO 
    RedirectStandardOutput = false, 
    RedirectStandardError = false, 
    RedirectStandardInput = true, 
    Arguments = arguments 
}; 

process.StartInfo = psi; 

// Start the program 
process.Start(); 

process.StandardInput.Write("\x3"); // 0x3 is Ctrl+C according to ASCII table 

El programa no responde a esto y simplemente continúa. ¿El problema es que Windows realidad no envía Ctrl +C a la corriente de entrada al hacer Ctrl +c en la consola, sino que envía una "interrupción" en el proceso? Pensé que enviar "\ x3" a la secuencia de entrada es EXACTAMENTE lo que hace Windows cuando se presiona Ctrl + c en la consola. ¿Me equivoco?

+0

Su consola probablemente está capturando el '^ C' y enviando una señal de algún tipo al programa. Necesitas emular ese comportamiento; en los sistemas Unixy sería 'SIGINT', no sé mucho sobre windows, me temo. –

+0

Esta es una de mis teorías también. No sé qué CMD en Windows está enviando a mi programa (si no es ctrl + c). – johnrl

Respuesta

0

Esta pregunta ha sido respondida en una ocasión anterior en la que publiqué una respuesta detallada en SO here.

+0

Esa es una buena biblioteca que tienes allí, pero realmente necesito algo más independiente de la plataforma. También necesito poder enviar las claves directamente al proceso y no solo a la ventana de primer plano. – johnrl

+0

@Johnrl: ¡No escribí esa biblioteca! :) que fue escrito por otra persona! :) pero lo incorporé a un equipo de prueba como se muestra en el enlace para demostrar que funciona y que se puede enviar directamente al proceso ... no solo a cualquier ventana en primer plano ... al obtener el control de la ventana, usar eso para ¡envía las llaves a ese mango! – t0mm13b

+0

El problema es que el programa que inicio no tiene una ventana ya que redirijo todo su resultado a mi propio programa. Por lo tanto, el envío de claves a Windows no funciona. – johnrl

Cuestiones relacionadas