Как узнать символ в консоли под курсором?

247
09 марта 2018, 12:42

Например в консоли есть символ "#" в координатах (0,0) как узнать что там символ "#" ,а не "?"

Answer 1

Штатные средства класса Console не позволяют читать напрямую из выходного буфера, хотя WinAPI, поверх которого работают методы Console, такое позволяет. Следовательно придется импортировать нужные функции руками. Выглядеть будет как-то так:

class Program
{
    [StructLayout(LayoutKind.Sequential)]
    struct COORD
    {
        public short X;
        public short Y;
    }
    // http://pinvoke.net/default.aspx/kernel32/ReadConsoleOutputCharacter.html
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool ReadConsoleOutputCharacter(
        IntPtr hConsoleOutput,
        [Out] char[] lpCharacter,
        int nLength,
        COORD dwReadCoord,
        out int lpNumberOfCharsRead
        );
    // http://pinvoke.net/default.aspx/kernel32/GetStdHandle.html
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr GetStdHandle(
        int nStdHandle
        );
    static void Main()
    {
        //выводим символ
        Console.SetCursorPosition(10, 10);
        char outChar = 'K';
        Console.Write(outChar);
        //читаем символ
        char[] readBuffer = new char[1];
        int readCount;
        ReadConsoleOutputCharacter(GetStdHandle(-11), readBuffer, 1, new COORD() { X = 10, Y = 10 }, out readCount);
        Console.SetCursorPosition(0, 0);
        Console.WriteLine($"{readBuffer[0] == outChar}");
        Console.ReadKey(false);
    }
}

Демка построена на основе примеров кода с pinvoke.net с небольшими модификациями.

READ ALSO
Mock не виртуального метода чужого класса

Mock не виртуального метода чужого класса

Не могу протестировать метод из за того что класс Row является составной частью чужой библиотеки

236
Создание колоды из двух Enum

Создание колоды из двух Enum

Я хочу создать колоду карт используя два Enum

182
nbitcoin получение баланса

nbitcoin получение баланса

Пытаюсь получить баланс :

172