繁体   English   中英

如何从Windows下的代码中删除字体?

[英]How can I delete fonts from my code, under Windows?

本文向我展示了如何从脚本安装字体,但现在我遇到了删除它们的问题。 我怎样才能做到这一点 ? 任何语言都可以,我会将信息转换为我以后需要的信息。

编辑:好的,所以我现在知道如何卸载字体(至少大部分部分)。 我正在发出对RemoveFontResource调用。 之后我使用SendMessage参数: 0xffff,0x001D,0,0 (HWND_BROACAST,WM_FONTCHANGE ......我忘了其他两个参数代表什么)。 问题是,这会删除字体,但在Control PanelFonts条目中,字体仍然出现在那里(即使你试图从那里删除它,它会说它无法从源文件或磁盘读取。

基本上,我按此顺序删除字体:

  • C:\\Windows\\Fonts物理删除
  • 调用RemoveFontResource
  • 调用SendMessage

什么是正确的卸载方式?

一旦你找到Havenard提到的实际文件名并使用你提到的文章,你就可以做到

objFSO.DeleteFile(FontFilePath);

其中FontFilePath是您要删除的文件的文件路径。

更多信息: technet文章

您可能遇到的问题,在我看到您的评论之前我没有想到的是,程序可能需要某个特定项目的字体。 所有已知的系统字体都存储在注册表中。 如果删除字体,还应从注册表中删除该键。 注册表路径如下

Windows 95
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts]

Windows NT
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]

关键如下:

Key name = Full name of the font
Key type = REG_SZ
Key Value = name of font file

从我见过的所有文档中,这三行代码都是“正确”的方法,但正如我们所知,它并不像预期的那样有效。

RemoveFontResource(fontPath);               
DeleteFile(fontPath);
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

重启

我执行上面的代码并复制你的问题(控制面板仍显示字体,但字体文件已消失)。 然后我重新启动了。 现在字体已从字体控制面板小程序中消失。

还有其他需要注意的事项:尽管控制面板仍然显示字体为“那里”应用程序不再在其字体列表中列出它(我在删除webdings.ttf之前和之后专门尝试使用Wordpad - 无需重启)

是的,我知道 - 重启是一个糟糕的解决方案 - 特别是如果你需要更新字体,因为你无法重新安装它(通过控制面板仍然 - 它声称字体仍然安装),直到你删除它后重新启动(我试过) 。

但是,如果你想要做的只是删除字体 - 它不是最糟糕的解决方案 - 卸载后字体基本上消失了(应用程序看不到它,它只在控制面板字体中可见,据我所知)和你不需要强行重启。

来自RemoveFontResourceFont的SDK帮助(这可能表明看到奇怪的原因)

如果存在对字体的未完成引用,则关联资源将保持加载状态,直到没有设备上下文使用它为止。

所有字体都可以在C:\\ WINDOWS \\ Fonts \\找到

资源管理器将屏蔽此文件夹以显示字体名称而不是真实文件名,但其全部存在。 您可以编辑和注释掉C:\\ WINDOWS \\ Fonts \\ desktop.ini的行以禁用此功能并显示字体文件(可能需要重新打开资源管理器才能生效)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM