Как получить валидный список шрифтов установленных в системе?

Изучаю вин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,..] Иногда еще бывает, что и названия шрифта нет. Вот как-то оно странно, а где собака порылась понять не могу... Буду благодарен если кто-нибудь подскажет как получить полный и валидный список шрифтов установленных в ОСь.


Ответы (0 шт):