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

时间:2009-09-02 06:56:02

标签: windows language-agnostic fonts installation

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

编辑:好的,我现在知道如何卸载字体(至少大部分部分)。我正在拨打RemoveFontResource的电话。之后我使用SendMessage参数:0xffff,0x001D,0,0(HWND_BROACAST,WM_FONTCHANGE ......我忘了其他两个参数代表的含义)。问题是,这会删除字体,但在Control Panel的{​​{1}}条目中,字体仍然出现在那里(即使你试图从那里删除它,它也会说它不能从源文件或磁盘读取。

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

  • Fonts
  • 中物理删除
  • 调用RemoveFontResource
  • 调用SendMessage

卸载的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

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

objFSO.DeleteFile(FontFilePath);

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

更多信息: technet article

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

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

答案 1 :(得分:4)

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

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

<强> REBOOT

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

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

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

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

来自RemoveFontResourceFont上的SDK帮助(这可能表明为何会出现奇怪现象)

  

如果有未完成的引用   字体,相关资源   保持加载直到没有设备上下文   正在使用它。

答案 2 :(得分:1)

您可以在C:\ WINDOWS \ Fonts \

找到所有字体

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