【问题标题】:Notify Windows system applications font has been uninstalled/deleted通知 Windows 系统应用程序字体已被卸载/删除
【发布时间】:2020-05-17 02:23:51
【问题描述】:

当使用 Adob​​e Photoshop 等AddFontResource/RemoveFontResource 应用程序临时安装字体时,Illustrator 会实时识别相应的更改。

问题是当您永久安装字体时,通过将文件复制到 windows 字体目录 + 将字体添加到系统注册表来使字体在系统重新启动后可用,此时删除字体需要完全重新启动用于系统范围的应用程序以实现可用的字体。

我的问题是在永久删除字体文件、从 WINDIR/Fonts 中删除该文件并从系统注册表中删除它的条目之后,需要做什么来通知系统范围的应用程序该字体不可用并相应地更新它们的列表?我在想SHChangeNotify可能是正确的方向,但完全不确定。

【问题讨论】:

  • 对我来说听起来像是相关应用程序中的错误。他们可能认为人们可能会添加字体,但从不费心处理他们删除它们的情况。
  • 在 *nix 环境中,您只需将字体复制到任何文件夹或删除它即可。一个有趣的工作是从 win/fonts 中删除字体,从注册表中删除 val,然后再次调用 AddFontResource。当然字体仍然可用于系统应用程序,但在我正在开发的字体管理器应用程序中它被有效地删除了。它恰好在重新启动之前可用。

标签: c++ c winapi


【解决方案1】:

您应该将WM_FONTCHANGE 消息发送到所有顶级窗口(使用HWND_BROADCAST 作为SendMessage 调用的目标):

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

【讨论】:

  • 忘了说我已经做到了。可能需要编辑我的问题。
  • 那么,您是手动从系统字体文件夹中删除字体吗?还是您的应用程序正在这样做?如果是后者,它应该通过调用RemoveFontResource。请参阅此处的“备注”部分:docs.microsoft.com/en-gb/windows/win32/api/wingdi/…
  • who 进程是通过命令行应用程序完成的。 RemoveFontResource 仅从字体表中删除字体。
  • @TomShaw 确保字体未在字体注册表中列出并重新启动系统以确保从所有会话中卸载字体。然后发送WM_FONTCHANGE 消息通知系统范围的应用程序字体不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多