字体安装和删除
仅当该字体位于指定设备上或安装在系统字体表中时,应用程序才能使用字体绘制文本。 字体表是一个内部数组,用于标识应用程序可用的所有非虚拟字体。 应用程序可以通过调用 EnumFontFamilies 或 ChooseFont 函数来检索设备上当前安装的字体名称或存储在内部字体表中。
若要临时安装字体,请调用 AddFontResource 或 AddFontResourceEx。 这些函数加载存储在字体资源文件中的字体。 但是,这是临时安装,因为在重新启动后,字体将不存在。
若要安装在重新启动系统后将保留的字体,请使用以下方法之一:
- 转到“控制面板”,单击“字体”图标,然后从“文件”菜单中选择 “安装新字体”。 即使在重新启动之前,该字体也可用于应用程序。 但是,在终端服务器中,字体可用于当前会话,但在重新启动后才可用于其他会话。
- 将字体复制到 %windir%\fonts 文件夹中。 然后,转到控制面板并单击 字体 图标,或调用 addFontResource或 AddFontResourceEx。 即使在重新启动之前,该字体也可用于应用程序。 但是,在终端服务器中,字体可用于当前会话,但在重新启动后才可用于其他会话。 如果仅将字体复制到 %windir%\fonts 文件夹中,则仅在系统重新启动后,该字体才可用。
当应用程序使用完已安装的字体时,它必须通过调用 RemoveFontResource 函数来删除该字体。
从任何活动会话(包括会话 0)中加载时,无法修改从 %windir%\fonts 文件夹以外的位置安装的字体。 因此,任何更改、替换或删除尝试都会被阻止。 如果需要修改字体:
- 临时字体 仅在当前会话中加载。 在尝试任何字体修改之前,请调用 RemoveFontResource 以强制当前会话卸载字体。
- 永久字体 重新启动后仍安装,并且由所有创建的会话加载。 调用 RemoveFontResource 以强制当前会话卸载字体。 然后,在字体注册表项(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts)中查找并删除与字体关联的注册表值。 最后,重启计算机,确保字体未在任何会话中加载。 重新启动后,继续修改/删除字体。
每当应用程序调用添加和删除字体资源的函数时,它还应调用 SendMessage 函数,并将 WM_FONTCHANGE 消息发送到系统中的所有顶级窗口。 此消息通知其他应用程序内部字体表已被添加或删除字体的应用程序更改。