基本的にはコマンドプロンプトGUIを作成しています。ユーザーは、リッチテキストボックスにコマンドプロンプトの出力を表示し、その下のプレーンテキストボックスにコマンドを入力します。色情報が得られないように思える以外は、この作品を作ることに成功しました。たとえば、赤いエラーテキストを出力するプログラムを実行すると、カラーコードバイトが取得されず、単にストリームに含まれていません。
これが私が今していることです。プロセスを開始するには:
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Windows\System32\cmd.exe");
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
this.promptProcess = Process.Start(startInfo);
次に、出力ストリームから読み取り、それをテキストボックスに送信するスレッドを作成します。
while (true)
{
while (this.stream.EndOfStream) ;
//read until there's nothing left in the stream, writing to the (locked) output box
byte [] buffer = new byte[1000];
int numberRead;
StringBuilder builder = new StringBuilder();
do
{
numberRead = this.stream.BaseStream.Read(buffer, 0, buffer.Length);
char[] characters = UTF8Decoder.GetChars(buffer, 0, numberRead);
builder.Append(characters);
}
while (numberRead == buffer.Length);
this.writeToOutput(builder.ToString());
}
派手なコマンドプロンプトを使用して、色付きのテキストを出力するアプリケーションを起動しても、追加の色情報は取得されません(ANSIカラーコードがテキストに混在している場合もありません)。上記のように、BaseStreamに移動してバイトを読み取り、UTF8にデコードします。残念ながら、生のバイトでさえ元の色情報が含まれていないようです。
フィルタリングをまったく行わずに、実行しているアプリケーションから元のストリームを取得するにはどうすればよいですか?独自の色解析を実行し、正しい色のコンソール出力を表示できるように、生のバイトが必要です。
明確にするために、私はカラーコードをどのように解釈するかを尋ねていません。ストリームで利用できるようにしたいだけです。