python - 使用 python 在 Windows 上管理字体安装/删除
问题描述
经过一番研究,我发现我可以为当前用户安装一个 truetype 字体,只需在HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
NAME 设置为字体名称并将 DATA 设置为字体路径的新字符串值。删除字体也类似,首先删除指定字体的字符串值,然后删除字体文件本身。
我尝试手动完成它并且它确实有效(安装和删除字体)。但是在 python 中重新创建所有内容让我陷入了一个问题。我可以使用上述方法安装字体,但是当我尝试删除字体时,windows 告诉我字体文件当前正在被 "System" 使用。我的程序能够删除注册表值,但无法删除字体文件。
我的帮助注册表编辑器功能可以在 -> https://github.com/nk521/phonts/blob/07a4d6de5165d5c19861c2f28708c60d52f33df9/core/helpers/win.py找到
这个函数安装一个字体-> https://github.com/nk521/phonts/blob/07a4d6de5165d5c19861c2f28708c60d52f33df9/core/win.py#L15
这个函数删除一个字体-> https://github.com/nk521/phonts/blob/07a4d6de5165d5c19861c2f28708c60d52f33df9/core/win.py#L35
此行将生成PermissionError
-> https://github.com/nk521/phonts/blob/07a4d6de5165d5c19861c2f28708c60d52f33df9/core/win.py#L41
解决方案
在 Windows 上,GDI 可能会锁定已使用的字体文件。在该用户会话结束之前,您可能无法删除字体文件。如果您删除注册表项,则字体不会在下一个会话中加载到 GDI 中。尝试删除 reg 条目,然后注销并重新登录,这可能会解锁文件;或者如果它已将其锁定在不同的会话中,您可能需要重新启动。
推荐阅读
- java - 如何对嵌套地图进行分组
- c# - 如何知道网络接口何时使用路由器作为 C# 中的 DNS 服务器?
- javascript - JavaScript 错误:未捕获(承诺中)DOMException
- java - 无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例
- android - 如何使用 Google Play Services 14.x 将 firebase 添加到 android 项目
- unicode - 泰卢固语 Anu 脚本文本
- java - 比较两个数组时从第三个数组打印正确项目的问题
- spring - 如何使用@TransactionalEventListener 实现一个工作单元
- python-3.x - 如何在 pytorch 中向 Nural 网络添加图层
- sql - 在 Excel 中导入 SQL Server 数据 - SSL 错误