I'm wondering if there are any simple ways to get a list of all fixed-width (monospaced) fonts installed on a user's system in C#?
I'm using .net 3.5 so have access to the WPF System.Windows.Media namespace and LINQ to get font information, but I'm not sure what I'm looking for.
I want to be able to provide a filtered list of monospaced fonts and/or pick out monospaced fonts from a larger list of fonts (as seen in the VS options dialog).
Have a look at:
http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html
Use one of the structures in there, then loop over families, instantiating a Font, and getting the LogFont value and checking lfPitchAndFamily.
The following code is written on the fly and untested, but something like the following should work:
Unfortunately ToLogFont function does not fill lfPitchAndFamily field to correct values. In my case it's always 0.
One approximation to detect which fonts might be fixed is the following
Keep in mind that they are several false positives, for example Wingdings
AFAIK you can't do it using BCL libraries only. You have to use WinAPI interop.
You need to analyze 2 lowest bits of LOGFONT.lfPitchAndFamily member. There is a constant FIXED_PITCH (means that font is fixed-width) that can be used as a bit mask for lfPitchAndFamily.
Here is a useful article:
Enumerating Fonts