我要枚举C:\Windows\Fonts\
中的所有文件
首先,我使用FindFirst&FindNext
获取所有文件
编码:
Path := 'C:\Windows\Fonts';
if FindFirst(Path + '\*', faNormal, FileRec) = 0 then
repeat
Memo1.Lines.Add(FileRec.Name);
until FindNext(FileRec) <> 0;
FindClose(FileRec);
它会获得类似于tahoma.ttf
名称,在Windows字体文件夹中显示Tahoma regular
。
但是我怎么才能得到呢?
第二个我为什么不能通过shell枚举C:\Windows\Fonts\
中的文件
编码:
var
psfDeskTop : IShellFolder;
psfFont : IShellFolder;
pidFont : PITEMIDLIST;
pidChild : PITEMIDLIST;
pidAbsolute : PItemIdList;
FileInfo : SHFILEINFOW;
pEnumList : IEnumIDList;
celtFetched : ULONG;
begin
OleCheck(SHGetDesktopFolder(psfDeskTop));
//Font folder path
OleCheck(SHGetSpecialFolderLocation(0, CSIDL_FONTS, pidFont));
OleCheck(psfDeskTop.BindToObject(pidFont, nil, IID_IShellFolder, psfFont));
OleCheck(psfFont.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN
or SHCONTF_FOLDERS, pEnumList));
while pEnumList.Next(0, pidChild, celtFetched ) = 0 do
begin
//break in here
pidAbsolute := ILCombine(pidFont, pidChild);
SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo),
SHGFI_PIDL or SHGFI_DISPLAYNAME );
Memo1.Lines.Add(FileInfo.szDisplayName);
end;
end;
我知道使用Screen.Fonts
可以得到字体列表,但是它显示与C:\Windows\Fonts\
不同;
3条答案
按热度按时间2j4z5cfb1#
GetFontResourceInfo
undocumented函数可以从字体文件中获取字体名称。试用此示例
关于您的第二个问题,请将这一行
与
qlfbtfca2#
我从一个德国 Delphi 论坛上得到这个。它在Delphi 7 Enterprise上工作。
4jb9z9bj3#
下面是对RRUZ答案的修改,它的好处是你可以枚举和查找任何目录中的字体名称,而不一定只是C:\Windows中安装的字体。诀窍是在用GetFontResourceInfoW处理每个字体文件之前调用AddFontResource(之后调用RemoveFontResource):