You can use EnumFontFamiliesEx
A test (with ComboBox1 ComboBox, you can change the added string sText ) :
public int FontCallback(ref ENUMLOGFONTEX lpelfe, ref NEWTEXTMETRICEX lpntme, uint FontType, IntPtr lParam)
{
string sText = lpelfe.lfFaceName + " (" + lpelfe.elfScript + ", " + (lpelfe.elfStyle !=""?lpelfe.elfStyle:"No style") + ")";
ComboBox1.Items.Add(sText);
return 1;
}
:
IntPtr hDC = GetDC(IntPtr.Zero);
LOGFONT lf = new LOGFONT();
lf.lfCharSet = DEFAULT_CHARSET;
EnumFontFamExProc enumFontFamExProc = new EnumFontFamExProc(FontCallback); [DllImport("Gdi32.dll", CharSet = CharSet.Unicode)]
int nRet = EnumFontFamiliesEx(hDC, ref lf, enumFontFamExProc, IntPtr.Zero, 0);public static extern int EnumFontFamiliesEx(IntPtr hdc, ref LOGFONT lpLogfont, EnumFontFamExProc lpEnumFontFamExProc, IntPtr lParam, uint dwFlags);
ReleaseDC(IntPtr.Zero, hDC);
Declarations :
[DllImport("Gdi32.dll", CharSet = CharSet.Unicode)]
public static extern int EnumFontFamiliesEx(IntPtr hdc, ref LOGFONT lpLogfont, EnumFontFamExProc lpEnumFontFamExProc, IntPtr lParam, uint dwFlags);
public delegate int EnumFontFamExProc(ref ENUMLOGFONTEX lpelfe, ref NEWTEXTMETRICEX lpntme, uint FontType, IntPtr lParam);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LOGFONT
{
public int lfHeight;
public int lfWidth;
public int lfEscapement;
public int lfOrientation;
public int 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 = 32)]
public string lfFaceName;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ENUMLOGFONTEX
{
// LOGFONT
public int lfHeight;
public int lfWidth;
public int lfEscapement;
public int lfOrientation;
public int 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 = 32)]
public string lfFaceName;
// ENUMLOGFONTEX
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string elfFullName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string elfStyle;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string elfScript;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NEWTEXTMETRIC
{
public int tmHeight;
public int tmAscent;
public int tmDescent;
public int tmInternalLeading;
public int tmExternalLeading;
public int tmAveCharWidth;
public int tmMaxCharWidth;
public int tmWeight;
public int tmOverhang;
public int tmDigitizedAspectX;
public int tmDigitizedAspectY;
public char tmFirschar;
public char tmLaschar;
public char tmDefaulchar;
public char tmBreakChar;
public byte tmItalic;
public byte tmUnderlined;
public byte tmStruckOut;
public byte tmPitchAndFamily;
public byte tmCharSet;
public uint ntmFlags;
public uint ntmSizeEM;
public uint ntmCellHeight;
public uint ntmAvgWidth;
}
[StructLayout(LayoutKind.Sequential)]
public struct FONTSIGNATURE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] fsUsb;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public uint[] fsCsb;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NEWTEXTMETRICEX
{
public NEWTEXTMETRIC ntmTm;
public FONTSIGNATURE ntmFontSig;
}
public const byte DEFAULT_CHARSET = 1;
[DllImport("User32", ExactSpelling = true, CharSet = CharSet.Unicode)]
private static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("User32", ExactSpelling = true, CharSet = CharSet.Unicode)]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);