2009-11-10 12 views
13

Ich verwende die Process-Klasse, um eine exe auszuführen.wartet mein Prozess auf Eingabe?

Die Exe ist eine Drittanbieter-Konsolenanwendung, die ich nicht kontrolliere.

Ich möchte wissen, ob der Prozess auf Eingabe in der Befehlszeile wartet.

Sollte es einen Unterschied machen, beabsichtige ich, die Anwendung zu beenden, sollte sie auf Eingaben warten.

Es gibt geeignete Ereignisse für die Ausgabe von dem Programm, das darauf wartet, gelesen zu werden, aber ich kann nichts Ähnliches sehen, wenn der Prozess geduldig auf die Eingabe wartet.

  ProcessStartInfo info = new ProcessStartInfo(); 
      info.FileName = "myapp.exe"; 
      info.CreateNoWindow = true; 
      info.UseShellExecute = false; 
      info.RedirectStandardError = true; 
      info.RedirectStandardInput = true; 
      info.RedirectStandardOutput = true; 
      process.StartInfo = info; 

      process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
      process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); 

      process.Start(); 

      process.BeginOutputReadLine(); 
      process.BeginErrorReadLine(); 


      process.WaitForExit(); 

Wie erkenne ich, dass mein Prozess auf Eingabe wartet?

+0

Ihr Problem steigt mein Interesse. Ich habe einige Macken gemacht, um modale Schleifen in GUI-Anwendungen zu erkennen (siehe meine Fragen), aber für Konsolen-Anwendungen habe ich bis jetzt noch keine gute Lösung gefunden ... – jdehaan

Antwort

14

Je nachdem, was der 3rd-Party-Prozess genau tut man Polling Staaten seine Threads versuchen könnte:

foreach(ProcessThread thread in process.Threads) 
    if (thread.ThreadState == ThreadState.Wait 
     && thread.WaitReason == ThreadWaitReason.UserRequest) 
      process.Kill(); 

dass Ausfallen ... Sie können versuchen, zu

process.StandardInput.Close(); 

nach lostelefonieren (), Vermute ich, dass eine Ausnahme im Kindprozess ausgelöst wird, wenn es versucht, von der Standardeingabe zu lesen.

+0

Dies scheint in meinem Test-Rig zu funktionieren. Ich werde es gegen das eigentliche Programm versuchen, was mir als nächstes Probleme bereitet. Für Info: Mit process.StandardInput.Close() mein Programm ausgeführt wurde keine Ausnahme erhalten, es hörte einfach auf, ruhig zu laufen. –

+1

Ich habe heute entdeckt, dass Sie überprüfen wollen, ob 'WaitReason'' ThreadWaitReason.LpcReply' ist. –

2

Wenn die Konsolenanwendung über eine Eingabeaufforderung verfügt, die auf Eingaben wartet, können Sie den Ausgabetext der Konsole regelmäßig mit der Process.StandardOutput-Eigenschaft des Prozesses analysieren und auf diese Eingabeaufforderung warten. Sobald die richtige Zeichenfolge erkannt wurde, wissen Sie, dass sie auf Eingabe wartet. Siehe http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx.

+0

Toller Ansatz. Es behandelt mein Problem nicht, ist aber ein gültiger Ansatz für Situationen, in denen Sie auf die Ausgabe setzen können. Danke noch einmal. –

+0

Dies funktioniert möglicherweise nicht immer, da einige Konsolenprogramme die Benutzereingabeaufforderung erst an die Konsole senden, nachdem sie eine Antwort erhalten hat. –

Verwandte Themen