Python Windows Enum安装的字体

问题描述 投票:2回答:1

我试图在Windows机器上获取已安装字体的列表,以便我可以安装丢失的字体。我在Py3。*,Windows 7。

浏览win API文档我知道我需要使用EnumFontFamiliesExW但是我不确定python中ctypes的正确语法是什么...我对ctypes模块完全不熟悉,并且对C语言知之甚少ctypes的python文档对我来说非常难以掌握,很抱歉如果我在那里找不到这个答案(我确实看过)。

我得到了以下内容:

gdi32 = ctypes.WinDLL('gdi32')
print(gdi32.EnumFontFamiliesExW())

这当然会引发错误,因为我没有指定任何参数。那么如何传递正确的参数呢?

python python-3.x winapi fonts ctypes
1个回答
2
投票

pywin32扩展提供了一个更简单的选项。使用import win32guiimport win32api,......

import win32gui

def callback(font, tm, fonttype, names):
    names.append(font.lfFaceName)
    return True

fontnames = []
hdc = win32gui.GetDC(None)
win32gui.EnumFontFamilies(hdc, None, callback, fontnames)
print("\n".join(fontnames))
win32gui.ReleaseDC(hdc, None)


With ctype you have to know C and WinAPI. Here is an example to do this in ctype, base on https://github.com/wwwtyro/AegisLuna/blob/master/pyglet/font/win32query.py
import 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)]

#we are not interested in NEWTEXTMETRIC parameter in FONTENUMPROC, use LPVOID instead
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 = ctypes.windll.user32.GetDC(None)
ctypes.windll.gdi32.EnumFontFamiliesExW(hdc, None, FONTENUMPROC(font_enum), 0, 0)  
ctypes.windll.user32.ReleaseDC(None, hdc)
print("\n".join(fontlist))

编辑:更改为Unicode EnumFontFamiliesExW

© www.soinside.com 2019 - 2024. All rights reserved.