I was trying to build an interactive console interceptor / wrapper in C # on the weekend, re-mixing several code samples that I found in SO and other sites.
With what I currently have, I cannot reliably read from the console. Any quick pointers?
public class ConsoleInterceptor
{
Process _interProc;
public event Action<string> OutputReceivedEvent;
public ConsoleInterceptor()
{
_interProc = new Process();
_interProc.StartInfo = new ProcessStartInfo("cmd");
InitializeInterpreter();
}
public ConsoleInterceptor(string command)
{
_interProc = new Process();
_interProc.StartInfo = new ProcessStartInfo(command);
InitializeInterpreter();
}
public Process InterProc
{
get
{
return _interProc;
}
}
private void InitializeInterpreter()
{
InterProc.StartInfo.RedirectStandardInput = true;
InterProc.StartInfo.RedirectStandardOutput = true;
InterProc.StartInfo.RedirectStandardError = true;
InterProc.StartInfo.CreateNoWindow = true;
InterProc.StartInfo.UseShellExecute = false;
InterProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
bool started = InterProc.Start();
Redirect(InterProc.StandardOutput);
Redirect(InterProc.StandardError);
}
private void Redirect(StreamReader input)
{
new Thread((a) =>
{
var buffer = new char[1];
while (true)
{
if (input.Read(buffer, 0, 1) > 0)
OutputReceived(new string(buffer));
};
}).Start();
}
private void OutputReceived(string text)
{
if (OutputReceivedEvent != null)
OutputReceivedEvent(text);
}
public void Input(string input)
{
InterProc.StandardInput.WriteLine(input);
InterProc.StandardInput.Flush();
}
}
What am I trying to do? Here is a mini-use case. Suppose I have two text fields.
ConsoleInterceptor interc = new ConsoleInterceptor("cmd");
interc.OutputReceivedEvent += (data) =>
{
this.Invoke(new Action<string>((s)=> this.textBoxOut.Text += s) ,data);
};
private void textInput_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
interc.Input(textInput.Text);
}
}
source
share