字体安装和删除

仅当该字体驻留在指定的设备上或安装在系统字体表中时,应用程序才能使用该字体来绘制文本。 字体表是一个内部数组,用于标识应用程序可用的所有非设备字体。 应用程序可以通过调用 EnumFontFamiliesChooseFont 函数来检索当前安装在设备上或存储在内部字体表中的字体的名称。

若要临时安装字体,请调用 AddFontResourceAddFontResourceEx。 这些函数加载存储在字体资源文件中的字体。 但是,这是一个临时安装,因为在重新启动后,字体将不存在。

若要安装将在系统重新启动后保留的字体,请使用以下方法之一:

  • 转到控制面板,单击“字体”图标,然后从“文件”菜单中选择“安装新字体”。 即使在重新启动之前,应用程序也可使用该字体。 但是,在终端服务器情况下,字体可用于当前会话,但在重新启动后才可用于其他会话。
  • 将字体复制到 %windir%\fonts 文件夹中。 然后,转到控制面板并单击“字体”图标,或调用 AddFontResourceAddFontResourceEx。 即使在重新启动之前,应用程序也可使用该字体。 但是,在终端服务器情况下,字体可用于当前会话,但在重新启动后才可用于其他会话。 如果仅将字体复制到 %windir%\fonts 文件夹中,则只有在重新启动系统后,该字体才可用。

当应用程序使用完已安装的字体时,它必须通过调用 RemoveFontResource 函数删除该字体。

在任何活动会话(包括会话 0)中加载时,无法修改从 %windir%\fonts 文件夹以外的位置安装的字体。 因此,将阻止任何更改、替换或删除的尝试。 如果需要修改字体:

  • 临时字体 仅在当前会话中加载。 在尝试任何字体修改之前,请调用 RemoveFontResource 以强制当前会话卸载字体。
  • 永久字体 在重新启动后仍会保持安装状态,并由所有创建的会话加载。 调用 RemoveFontResource 以强制当前会话卸载字体。 然后,在字体注册表项 (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts) 查找并删除与字体关联的注册表值。 最后,重启计算机以确保字体未在任何会话中加载。 重新启动后,继续修改/删除字体。

每当应用程序调用添加和删除字体资源的函数时,它还应调用 SendMessage 函数,并将 WM_FONTCHANGE 消息发送到系统中的所有顶级窗口。 此消息通知其他应用程序,已由添加或删除字体的应用程序更改了内部字体表。