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

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

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

所以基本上,我按照这个顺序删除一个字体:

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

什么是正确的卸载方式?

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

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

重启

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

还有其他一些要注意的事情:即使控制面板仍然显示字体为“有”应用程序不再列在他们的字体列表(我专门尝试写字板,之前和之后删除webdings.ttf – 无需重新启动)

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

但是,如果你想要做的只是删除字体 – 这不是最糟糕的解决方案 – 在卸载字体后,字体基本消失了(应用程序看不到它,只有控制面板字体可以看到)你不需要强制重启。

从RemoveFontResourceFont的SDK帮助(这可能表明为什么看到奇怪)

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

一旦你发现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 

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

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