Created
January 21, 2020 09:46
-
-
Save mormegil-cz/833165b92caebabfe7b12a9274f994a4 to your computer and use it in GitHub Desktop.
List all installed fonts usable for Windows CMD
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Main() | |
{ | |
List<GdiFonts.FontData> allFonts = GdiFonts.GetAllFonts(); | |
allFonts.Where(f => | |
// The font must be a fixed-pitch font. | |
(f.TextMetric.tmPitchAndFamily & 1) == 0 && | |
// The font can’t be an italic font | |
f.LogFont.elfLogFont.lfItalic == 0 && | |
// or have a negative A or C space. | |
// (f.TextMetric.ntmFlags & (1 << 16)) != 0 && | |
( | |
// The font must be FF_MODERN for TrueType fonts. | |
(f.FontType == (uint)GdiFonts.FontMask.TRUETYPE_FONTTYPE && (f.TextMetric.tmPitchAndFamily & 0xF0) == (byte)GdiFonts.FontFamily.FF_MODERN) || | |
// The font must be OEM_CHARSET for non TrueType font. | |
(f.FontType != (uint)GdiFonts.FontMask.TRUETYPE_FONTTYPE && f.LogFont.elfLogFont.lfCharSet == (byte)GdiFonts.FontLanguageCharSet.OEM_CHARSET) | |
) | |
).Select(f => f.LogFont.elfLogFont.lfFaceName).OrderBy(n => n).Distinct().Dump(); | |
} | |
internal static class GdiFonts | |
{ | |
#region gdi32 | |
/// <summary> | |
/// From WinGDI.h | |
/// #define RASTER_FONTTYPE 0x0001 | |
/// #define DEVICE_FONTTYPE 0x0002 | |
/// #define TRUETYPE_FONTTYPE 0x0004 | |
/// </summary> | |
public enum FontMask | |
{ | |
RASTER_FONTTYPE = 0x0001, | |
DEVICE_FONTTYPE = 0x0002, | |
TRUETYPE_FONTTYPE = 0x0004 | |
} | |
/// <summary> | |
/// From WinGDI.h | |
/// #define FW_DONTCARE 0 | |
/// #define FW_THIN 100 | |
/// #define FW_EXTRALIGHT 200 | |
/// #define FW_LIGHT 300 | |
/// #define FW_NORMAL 400 | |
/// #define FW_MEDIUM 500 | |
/// #define FW_SEMIBOLD 600 | |
/// #define FW_BOLD 700 | |
/// #define FW_EXTRABOLD 800 | |
/// #define FW_HEAVY 900 | |
/// #define FW_ULTRALIGHT FW_EXTRALIGHT | |
/// #define FW_REGULAR FW_NORMAL | |
/// #define FW_DEMIBOLD FW_SEMIBOLD | |
/// #define FW_ULTRABOLD FW_EXTRABOLD | |
/// #define FW_BLACK FW_HEAVY | |
/// </summary> | |
public enum FontWeight | |
{ | |
FW_DONTCARE = 0, | |
FW_THIN = 100, | |
FW_EXTRALIGHT = 200, | |
FW_LIGHT = 300, | |
FW_NORMAL = 400, | |
FW_MEDIUM = 500, | |
FW_SEMIBOLD = 600, | |
FW_BOLD = 700, | |
FW_EXTRABOLD = 800, | |
FW_HEAVY = 900 | |
} | |
/// <summary> | |
/// From WinGDI.h | |
/// #define DEFAULT_PITCH 0 | |
/// #define FIXED_PITCH 1 | |
/// #define VARIABLE_PITCH 2 | |
/// #if(WINVER >= 0x0400) | |
/// #define MONO_FONT 8 | |
/// #endif /* WINVER >= 0x0400 */ | |
/// </summary> | |
public enum FontPitch : int | |
{ | |
DEFAULT_PITCH = 0, | |
FIXED_PITCH = 1, | |
VARIABLE_PITCH = 2, | |
MONO_FONT = 8 | |
} | |
/// <summary> | |
/// From WinGDI.h | |
/// #define FF_DONTCARE (0<<4) Don't care or don't know. | |
/// #define FF_ROMAN (1<<4) Variable stroke width, serifed. | |
/// Times Roman, Century Schoolbook, etc. | |
/// #define FF_SWISS (2<<4) Variable stroke width, sans-serifed. | |
/// Helvetica, Swiss, etc. | |
/// #define FF_MODERN (3<<4) Constant stroke width, serifed or sans-serifed. | |
/// Pica, Elite, Courier, etc. | |
/// #define FF_SCRIPT (4<<4) Cursive, etc. | |
/// #define FF_DECORATIVE (5<<4) Old English, etc. | |
/// </summary> | |
public enum FontFamily | |
{ | |
FF_DONTCARE = 0 << 4, | |
FF_ROMAN = 1 << 4, | |
FF_SWISS = 2 << 4, | |
FF_MODERN = 3 << 4, | |
FF_SCRIPT = 4 << 4, | |
FF_DECORATIVE = 5 << 4 | |
} | |
/// <summary> | |
/// From WinGDI.h | |
/// #define MM_TEXT 1 | |
/// #define MM_LOMETRIC 2 | |
/// #define MM_HIMETRIC 3 | |
/// #define MM_LOENGLISH 4 | |
/// #define MM_HIENGLISH 5 | |
/// #define MM_TWIPS 6 | |
/// #define MM_ISOTROPIC 7 | |
/// #define MM_ANISOTROPIC 8 | |
/// </summary> | |
public enum FontMappingMode | |
{ | |
MM_TEXT = 1, | |
MM_LOMETRIC = 2, | |
MM_HIMETRIC = 3, | |
MM_LOENGLISH = 4, | |
MM_HIENGLISH = 5, | |
MM_TWIPS = 6, | |
MM_ISOTROPIC = 7, | |
MM_ANISOTROPIC = 8 | |
} | |
public enum FontLanguageCharSet | |
{ | |
ANSI_CHARSET = 0x00000000, | |
DEFAULT_CHARSET = 0x00000001, | |
SYMBOL_CHARSET = 0x00000002, | |
MAC_CHARSET = 0x0000004D, | |
SHIFTJIS_CHARSET = 0x00000080, | |
HANGUL_CHARSET = 0x00000081, | |
JOHAB_CHARSET = 0x00000082, | |
GB2312_CHARSET = 0x00000086, | |
CHINESEBIG5_CHARSET = 0x00000088, | |
GREEK_CHARSET = 0x000000A1, | |
TURKISH_CHARSET = 0x000000A2, | |
VIETNAMESE_CHARSET = 0x000000A3, | |
HEBREW_CHARSET = 0x000000B1, | |
ARABIC_CHARSET = 0x000000B2, | |
BALTIC_CHARSET = 0x000000BA, | |
RUSSIAN_CHARSET = 0x000000CC, | |
THAI_CHARSET = 0x000000DE, | |
EASTEUROPE_CHARSET = 0x000000EE, | |
OEM_CHARSET = 0x000000FF | |
} | |
public const Int32 LF_FACESIZE = 32; // ref WinGDI.h | |
public const Int32 LF_FULLFACESIZE = 64; // ref WinGDI.h | |
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] | |
public struct LOGFONT | |
{ | |
public Int32 lfHeight; | |
public Int32 lfWidth; | |
public Int32 lfEscapement; | |
public Int32 lfOrientation; | |
public Int32 lfWeight; | |
public Byte lfItalic; | |
public Byte lfUnderline; | |
public Byte lfStrikeOut; | |
public Byte lfCharSet; | |
public Byte lfOutPrecision; | |
public Byte lfClipPrecision; | |
public Byte lfQuality; | |
public Byte lfPitchAndFamily; | |
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)] | |
public String lfFaceName; | |
} | |
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] | |
public struct TEXTMETRIC | |
{ | |
public Int32 tmHeight; | |
public Int32 tmAscent; | |
public Int32 tmDescent; | |
public Int32 tmInternalLeading; | |
public Int32 tmExternalLeading; | |
public Int32 tmAveCharWidth; | |
public Int32 tmMaxCharWidth; | |
public Int32 tmWeight; | |
public Int32 tmOverhang; | |
public Int32 tmDigitizedAspectX; | |
public Int32 tmDigitizedAspectY; | |
public Char tmFirstChar; | |
public Char tmLastChar; | |
public Char tmDefaultChar; | |
public Char tmBreakChar; | |
public Byte tmItalic; | |
public Byte tmUnderlined; | |
public Byte tmStruckOut; | |
public Byte tmPitchAndFamily; | |
public Byte tmCharSet; | |
} | |
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] | |
public struct ENUMLOGFONT | |
{ | |
public LOGFONT elfLogFont; | |
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FULLFACESIZE)] | |
public String elfFullName; | |
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = LF_FACESIZE)] | |
public String elfStyle; | |
} | |
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] | |
public struct NEWTEXTMETRIC | |
{ | |
public Int32 tmHeight; | |
public Int32 tmAscent; | |
public Int32 tmDescent; | |
public Int32 tmInternalLeading; | |
public Int32 tmExternalLeading; | |
public Int32 tmAveCharWidth; | |
public Int32 tmMaxCharWidth; | |
public Int32 tmWeight; | |
public Int32 tmOverhang; | |
public Int32 tmDigitizedAspectX; | |
public Int32 tmDigitizedAspectY; | |
public Char tmFirstChar; | |
public Char tmLastChar; | |
public Char tmDefaultChar; | |
public Char tmBreakChar; | |
public Byte tmItalic; | |
public Byte tmUnderlined; | |
public Byte tmStruckOut; | |
public Byte tmPitchAndFamily; | |
public Byte tmCharSet; | |
public UInt32 ntmFlags; | |
public UInt32 ntmSizeEM; | |
public UInt32 ntmCellHeight; | |
public UInt32 ntmAvgWidth; | |
} | |
public struct FontData | |
{ | |
public ENUMLOGFONT LogFont; | |
public NEWTEXTMETRIC TextMetric; | |
public uint FontType; | |
} | |
[DllImport("gdi32.dll", CharSet = CharSet.Auto)] | |
public extern static Int32 EnumFontFamiliesEx(IntPtr hdc, ref LOGFONT lpLogfont, FONTENUMPROC lpEnumFontFamExProc, IntPtr lParam, UInt32 dwFlags); | |
public delegate Int32 FONTENUMPROC(ref ENUMLOGFONT lpelf, ref NEWTEXTMETRIC lpntm, UInt32 FontType, IntPtr lParam); | |
public static int EnumFontFamExProc(ref ENUMLOGFONT lpelf, ref NEWTEXTMETRIC lpntm, uint FontType, IntPtr lParam) | |
{ | |
allFontData.Add(new FontData() { LogFont = lpelf, TextMetric = lpntm, FontType = FontType }); | |
return 1; | |
} | |
#endregion | |
private static List<FontData> allFontData; | |
public static List<FontData> GetAllFonts() | |
{ | |
allFontData = new List<FontData>(); | |
Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); | |
try | |
{ | |
IntPtr hdc = graphics.GetHdc(); | |
var logfont = new LOGFONT() { lfCharSet = (byte)FontLanguageCharSet.DEFAULT_CHARSET }; | |
EnumFontFamiliesEx(hdc, ref logfont, new FONTENUMPROC(EnumFontFamExProc), IntPtr.Zero, 0); | |
} | |
catch (Exception) | |
{ | |
} | |
finally | |
{ | |
graphics.ReleaseHdc(); | |
} | |
return allFontData; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment