Как я могу получить символ у курсора в консольном приложении C #? - PullRequest
2 голосов
/ 20 марта 2012

Я знаю, как установить курсор на определенную точку в консоли, используя SetCursorPosition или CursorLeft и CursorTop вместе. Это не проблема.

Но , как я могу получить значение этой точки? Разве нет такой вещи, как Console.Cursor ? Так я могу получить персонажа на этой позиции? Может быть что-то вроде:

char c = Console.GetCharAtCursor();

Не повезло?

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

AFAIK, вы должны прочитать весь буфер консоли как двумерный буфер и использовать координаты X и Y курсора в качестве индекса в этом буфере. См:

[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool GetConsoleScreenBufferInfo(
    IntPtr consoleHandle,
    out CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferInfo);

Вы можете прочитать о структуре буфера здесь:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx

Обновление:

Если вы заинтересованы в использовании консольных API для написания игр, кто-то написал пробелы для консоли (на самом деле powershell), но все API-интерфейсы являются управляемым кодом, а не сценарием. У него есть процедуры спрайта / пути и т. Д. - источник закончен на http://ps1.soapyfrog.com/2007/08/26/grrr-source-code-including-invaders/

1 голос
/ 20 марта 2012

'CursorLeft' и 'CursorTop' имеют геттеры, поэтому вы можете просто прочитать их: var cleft = Console.CursorLeft

0 голосов
/ 15 сентября 2018

Согласно ответу с форума MSDN :

[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 static char ReadCharacterAt(int x, int y)
{
    IntPtr consoleHandle = GetStdHandle(-11);
    if (consoleHandle == IntPtr.Zero)
    {
        return '\0';
    }
    COORD position = new COORD
    {
        X = (short)x,
        Y = (short)y
    };
    StringBuilder result = new StringBuilder(1);
    uint read = 0;
    if (ReadConsoleOutputCharacter(consoleHandle, result, 1, position, out read))
    {
        return result[0];
    }
    else
    {
        return '\0';
    }
}

Применительно это выглядит так:

class Program
{
    static void Main(string[] args)
    {
        Console.Clear();

        Console.CursorLeft = 0;
        Console.CursorTop = 1;
        Console.Write("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");

        char first = ReadCharacterAt(10, 1);
        char second = ReadCharacterAt(20, 1);

        Console.ReadLine();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...