このコードを使用して、コンソールから直接読み取ります。
public char? ReadCharacterAt(int x, int y)
{
IntPtr consoleHandle = GetStdHandle(-11);
if (consoleHandle == IntPtr.Zero)
{
return null;
}
var position = new Coord
{
X = (short)x,
Y = (short)y
};
var result = new StringBuilder(1);
uint read = 0;
if (ReadConsoleOutputCharacter(consoleHandle, result, 1, position, out read))
{
return result[0];
}
else
{
return null;
}
}
[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;
}
ただし、ドイツ語のウムラウト (äüö) の場合、これは正しい文字を返しません。どうすれば修正できますか?
アップデート
Hans と Raymond が指摘したように、その答えは DLL のインポートにあります。私がしなければならなかったのは、それを次のように変更することだけでした:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]