如何在C#控制台应用程序中获取光标处的字符?

我知道如何使用SetCursorPositionCursorLeftCursorTop 将光标设置到控制台中的特定点。 那不是问题。

但是 ,我怎样才能获得这一点的价值? 是不是像Console.Cursor这样的东西? 所以我可以在那个位置得到角色? 也许是这样的:

char c = Console.GetCharAtCursor(); 

没运气?

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/

‘CursorLeft’和’CursorTop’有吸气剂,所以你可以读它们: var cleft = Console.CursorLeft

根据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(); } }