10

基本的にはコマンドプロンプト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にデコードします。残念ながら、生のバイトでさえ元の色情報が含まれていないようです。

フィルタリングをまったく行わずに、実行しているアプリケーションから元のストリームを取得するにはどうすればよいですか?独自の色解析を実行し、正しい色のコンソール出力を表示できるように、生のバイトが必要です。

明確にするために、私はカラーコードをどのように解釈するかを尋ねていません。ストリームで利用できるようにしたいだけです。

4

1 に答える 1

9

出力ストリームのリダイレクトに「色情報」が含まれることはありません。例外として、コンソール プログラムが ANSI エスケープ シーケンスを使用してテキストを明示的に出力する場合。しかし!Windows コンソールは ANSI コードをサポートしていないため、そのようなプログラムはごくわずかしか存在しません。

WinAPI の色は、コンソールに (ストリームではなく) 直接書き込むことができWriteConsoleOutput. 当然、色付きの出力は、 などの対応する関数を使用してコンソールから読み取ることができますReadConsoleOutput。もちろん、コンソール ウィンドウが存在する必要があり、リダイレクトが暗示されている必要はありません。

ユニコードと同じ問題。プログラムにそのコードページで出力を書き込むように依頼しない限り、Stream は UTF-8 をサポートしません。しかし、ReadConsoleOutputW- を使用して (ストリームではなく) コンソールからテキストを読み取ると、「ボックスから」ユニコードを取得できます。

PS。私自身のコンソール エミュレータ ConEmu ( SO の回答を読む) は、コンソールの出力を 経由で読み取りますReadConsoleOutputW

于 2012-09-24T23:16:58.297 に答える