我正在使用此代码直接从控制台读取。
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)]
最佳答案
从SDK文档中:
此功能使用控制台当前代码页中的Unicode字符或8位字符。控制台的代码页最初默认为系统的OEM代码页。要更改控制台的代码页,请使用SetConsoleCP或SetConsoleOutputCP函数,或使用chcp或mode con cp select =命令。
由于未在[DllImport]属性中指定CharSet,因此将获得8位字符。从技术上讲,您可以通过读取byte []并使用Console.OutputEncoding.GetString()进行转换来使其工作。但是请不要使用CharSet.Unicode让Windows为您进行转换。