コンソール ウィンドウの特定の場所にある文字列から文字列値を取得したいと考えています。たとえば、コンソール画面にこれがあるとします。
abcdefgh
ijklmnop
qrstuvwx
次のようなことができるようになりたいです。
string s = Console.GetString(1,2,4);
これは を返しklmn
ます。これは可能ですか?
コンソール ウィンドウの特定の場所にある文字列から文字列値を取得したいと考えています。たとえば、コンソール画面にこれがあるとします。
abcdefgh
ijklmnop
qrstuvwx
次のようなことができるようになりたいです。
string s = Console.GetString(1,2,4);
これは を返しklmn
ます。これは可能ですか?
コンソール画面バッファーの連続するセルから、指定された位置から始まるいくつかの文字をコピーします。
例:
private const int STD_OUTPUT_HANDLE = -11;
public static string GetString(Int16 y, Int16 x, uint length)
{
var characters = new StringBuilder(1);
uint numberOfCharactersRead;
if (ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), characters, length, new Coord(x, y), out numberOfCharactersRead))
return characters.ToString();
throw new InvalidOperationException("Could not get chars");
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput, [Out] StringBuilder lpCharacter, uint length, Coord bufferCoord, out uint lpNumberOfCharactersRead);
[StructLayout(LayoutKind.Sequential)]
public struct Coord
{
public short X;
public short Y;
public Coord(short x, short y)
{
X = x;
Y = y;
}
}
使用法:
static void Main(string[] args)
{
Console.WriteLine("abcdefgh");
Console.WriteLine("ijklmnop");
Console.WriteLine("qrstuvwx");
string s = GetString(1, 2, 4);
// 's' is now 'klmn'
}
読み取りの座標を指定できるReadConsoleOutputを使用できます。
C# の定義は次の場所にあります (例を含む): http://www.pinvoke.net/default.aspx/kernel32.readconsoleoutput