コンソールから特殊文字を削除する関数を書き込もうとしました。たとえば、次のように書きます。
Console.WriteLine("Hello World");
文字 'o' で関数を呼び出した後、コンソールは次のようになります。
"Hell Wrld"
コンソール全体で実行することを考えました
Console.SetCursorPosition(i,j);
しかし、「CursorPosition」の値を取得できません..
何か案が?
コンソールに書き込まれた内容を読み取ることができます!
.NET でコンソール バッファを読み取るメソッドはありませんが、ジョブを完了するために呼び出すことができる WinAPI 関数がいくつかあります。
GetStdHandle()、GetConsoleScreenBufferInfo()、およびReadConsoleOutput()を確認してください
コンソールに既に書き込まれた内容を読み取る方法はありません。ただし、できることの 1 つは、独自の出力ストリームを提供することです。TextWriter
フィルタ文字とともに元の出力ストリームが与えられる独自の実装を作成できます。次に、コンソールの出力ストリームを新しいものに設定できます。その後、誰かがプログラムの出力ストリームに書き込むたびに、選択した文字がフィルター処理されます。
次のコード行でいくつかの簡単なテストを実行しましたが、問題なく動作しているようです。より複雑なケースをカバーしていない場合はお知らせください。
public class FilteringTextWriter : TextWriter
{
private HashSet<char> invalidChars;
private TextWriter destinationStream;
public FilteringTextWriter(IEnumerable<char> invalidChars, TextWriter destinationStream)
: base()
{
this.invalidChars = new HashSet<char>(invalidChars);
this.destinationStream = destinationStream;
}
public override void Write(char value)
{
if (!invalidChars.Contains(value))
{
destinationStream.Write(value);
}
}
}
メインの他の場所またはどこか:
Console.SetOut(new FilteringTextWriter(new[] { 'o' }, Console.Out));
Console.CursorLeft
およびConsole.CursorTop
は、カーソル位置の「get」メソッドです。
コンソール バッファから読み取ることはできません。つまり、すでにコンソールに書き込まれているものを取得することはできません。(C# で直接実行できますが、ネイティブの Windows API または相互運用機能を使用して実行できます)。
したがって、コンソール クラスを独自のクラスでラップし、画面に書き込む前に文字列をフィルター処理する方がよいでしょう。
public MyConsole
{
// expose the neede methods:
public void WriteLine(string text)
{
Console.WriteLine(text.Replace(...)); // filter out the special chars
}
}
次に、MyConsole
の代わりに使用しConsole
ます。