我正在C#.NET中为控制台编写图像查看器。我的问题是控制台字体字符不是正方形。我将它们视为像素,当在屏幕上绘制时会拉伸图像。
我想以某种方式读取具有width
,height
等属性的当前使用字体的字体信息...
我找到了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(...)
并没有像说的那样...
如果有人知道该怎么做,请告诉我:)
答案 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...