获取当前控制台字体信息

时间:2019-06-03 13:06:50

标签: c# .net image console-application viewer

我正在C#.NET中为控制台编写图像查看器。我的问题是控制台字体字符不是正方形。我将它们视为像素,当在屏幕上绘制时会拉伸图像。

我想以某种方式读取具有widthheight等属性的当前使用字体的字体信息...

我找到了this answer,但似乎只列出了所有当前可用的字体。

我玩了以下代码:

[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 :(得分:0)

正确的解决方案是实施以下行:

        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...