readconsole (kernel32)
Last changed: -69.116.57.30

.
Summary

C# Signature:

    /* Copies a number of characters from consecutive cells of a console screen buffer,
        beginning at a specified location. */
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern BOOL ReadConsoleOutputCharacter(
        IntPtr hConsoleOutput,
        StringBuilder lpCharacter,
        uint nLength,
        COORD dwReadCoord,
        out uint lpNumberOfCharsRead);

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

[DllImport("Kernel32", SetLastError=true)]
static extern IntPtr GetStdHandle(uint nStdHandle);

[DllImport("Kernel32", SetLastError=true)]
static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput,
    [Out] StringBuilder lpCharacter, uint nLength, COORD dwReadCoord,
    out uint lpNumberOfCharsRead);

[StructLayout(LayoutKind.Sequential)]
struct COORD
{
    public short X;
    public short Y;
}

private string ReadALineOfConsoleOutput()
{
    IntPtr stdout = GetStdHandle(STD_OUTPUT_HANDLE);

    if ( stdout.ToInt32() == INVALID_HANDLE_VALUE )
    throw new Win32Exception();

    // this assumes the console screen buffer is 80 columns wide.
    // You can call GetConsoleScreenBufferInfo() to get its actual dimensions.
    uint nLength = 80;    
    StringBuilder lpCharacter = new StringBuilder((int)nLength);

    // read from the first character of the first line (0, 0).
    COORD dwReadCoord;
    dwReadCoord.X = 0;
    dwReadCoord.Y = 0;

    uint lpNumberOfCharsRead = 0;

    if ( !ReadConsoleOutputCharacter(stdout, lpCharacter, nLength, dwReadCoord, out lpNumberOfCharsRead) )
    throw new Win32Exception();

    return lpCharacter.ToString();
}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation