0

コンソール ウィンドウの特定の場所にある文字列から文字列値を取得したいと考えています。たとえば、コンソール画面にこれがあるとします。

abcdefgh
ijklmnop
qrstuvwx

次のようなことができるようになりたいです。

string s = Console.GetString(1,2,4);

これは を返しklmnます。これは可能ですか?

4

2 に答える 2

3

使用ReadConsoleOutputCharacter:

コンソール画面バッファーの連続するセルから、指定された位置から始まるいくつかの文字をコピーします。


例:

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'
}
于 2013-02-12T14:09:47.397 に答える
1

読み取りの座標を指定できるReadConsoleOutputを使用できます。

C# の定義は次の場所にあります (例を含む): http://www.pinvoke.net/default.aspx/kernel32.readconsoleoutput

于 2013-02-12T13:48:50.817 に答える