Как получить валидный список шрифтов установленных в системе?
Изучаю вин32 апи, попутно пишу плагин на питоне к сторонней софтине. Он должен получать список системных шрифтов, по событию. Завязан на изменение конкретного пункта в файле настроек. Короче пользователь вводит название шрифта, а плагин сверяет его со списком установленных в системе. Если не находит, то пробует доустановить из базы. Собственно вот код получения списка (он рабочий но):
import win32api, win32con, ctypes
from ctypes import wintypes
class LOGFONT(ctypes.Structure): _fields_ = [
('lfHeight', wintypes.LONG),
('lfWidth', wintypes.LONG),
('lfEscapement', wintypes.LONG),
('lfOrientation', wintypes.LONG),
('lfWeight', wintypes.LONG),
('lfItalic', wintypes.BYTE),
('lfUnderline', wintypes.BYTE),
('lfStrikeOut', wintypes.BYTE),
('lfCharSet', wintypes.BYTE),
('lfOutPrecision', wintypes.BYTE),
('lfClipPrecision', wintypes.BYTE),
('lfQuality', wintypes.BYTE),
('lfPitchAndFamily', wintypes.BYTE),
('lfFaceName', ctypes.c_wchar*32)]
def get_fonts_list():
"""
возвращает список установленных
в системе шрифтов
"""
gdi32 = ctypes.WinDLL('gdi32')
user32 = ctypes.WinDLL('user32')
FONTENUMPROC = ctypes.WINFUNCTYPE(ctypes.c_int,
ctypes.POINTER(LOGFONT),
wintypes.LPVOID,
wintypes.DWORD,
wintypes.LPARAM)
fontlist = []
def font_enum(logfont, textmetricex, fonttype, param):
str = logfont.contents.lfFaceName;
if (any(str in s for s in fontlist) == False):
fontlist.append(str)
return True
hdc = user32.GetDC(None)
gdi32.EnumFontFamiliesExW(hdc, None, FONTENUMPROC(font_enum), 0, 0)
user32.ReleaseDC(None, hdc)
return fontlist
есть проблема: некоторые шрифты в списке отсутствуют, хотя в системе они доступны и программами подцепляются. Например "Fira Code Bold" в системе есть, а в возвращаемом списке только [.., Fira Code, Fira Code Light, Fira Code Medium, Fira Code Retina,..] Иногда еще бывает, что и названия шрифта нет. Вот как-то оно странно, а где собака порылась понять не могу... Буду благодарен если кто-нибудь подскажет как получить полный и валидный список шрифтов установленных в ОСь.