Получить текущую информацию о шрифте консоли - PullRequest
1 голос
/ 03 июня 2019

Я пишу Image Viewer в C # .NET для консоли.Моя проблема в том, что символы шрифта консоли не являются квадратами.И я воспринимаю их как пиксели, это растягивает изображения при отображении на экране.

Я хочу как-то прочитать информацию о шрифте для используемого в настоящее время шрифта со свойствами width, height и т. Д..

Я нашел этот ответ , но, похоже, он просто перечисляет все доступные на данный момент шрифты.

Я поиграл с этим кодом:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ConsoleFont
{
        public uint Index;
        public short SizeX, SizeY;
}

[DllImport("kernel32")]
private static extern bool GetConsoleFontInfo(IntPtr hOutput, [MarshalAs(UnmanagedType.Bool)]bool bMaximize, uint count, [MarshalAs(UnmanagedType.LPArray), Out] ConsoleFont[] fonts);

Это не вернуло определенный шрифт, используемый в текущем окне консоли.

Я все еще хочу использовать что-то вроде структуры ConsoleFont для хранения свойств шрифта.Но GetConsoleFontInfo(...) не делает это, как сказано ...

Пожалуйста, если кто-то знает, как это сделать, скажите мне:)

1 Ответ

0 голосов
/ 09 июня 2019

Правильным решением было реализовать следующие строки:

        const int STD_OUTPUT_HANDLE = -11;
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetStdHandle(int nStdHandle);

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public class CONSOLE_FONT_INFO_EX
        {
            private int cbSize;
            public CONSOLE_FONT_INFO_EX()
            {
                cbSize = Marshal.SizeOf(typeof(CONSOLE_FONT_INFO_EX));
            }
            public int FontIndex;
            public COORD dwFontSize;
            public int FontFamily;
            public int FontWeight;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string FaceName;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct COORD
        {
            public short X;
            public short Y;

            public COORD(short X, short Y)
            {
                this.X = X;
                this.Y = Y;
            }
        };

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        extern static bool GetCurrentConsoleFontEx(IntPtr hConsoleOutput, bool bMaximumWindow, [In, Out] CONSOLE_FONT_INFO_EX lpConsoleCurrentFont);

А затем просто прочитайте информацию о текущем шрифте консоли, например:

CONSOLE_FONT_INFO_EX currentFont = new CONSOLE_FONT_INFO_EX();
GetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), false, currentFont);

// currentFont does now contain all the information about font size, width and height etc... 
...