3

このコードを使用して、コンソールから直接読み取ります。

    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)]
4

1 に答える 1

3

SDK ドキュメントから:

この関数は、コンソールの現在のコード ページの Unicode 文字または 8 ビット文字を使用します。コンソールのコード ページは、最初はシステムの OEM コード ページにデフォルト設定されています。コンソールのコード ページを変更するには、SetConsoleCP または SetConsoleOutputCP 関数を使用するか、chcp または mode con cp select= コマンドを使用します。

[DllImport] 属性で CharSet を指定しなかったため、8 ビット文字が取得されます。技術的には、byte[] に読み込み、Console.OutputEncoding.GetString() で変換することで機能させることができます。ただし、CharSet.Unicode を使用して、Windows に変換を行わせてください。

于 2012-07-14T17:46:55.550 に答える