gpt4 book ai didi

c# - 如何删除/替换当前使用的字体

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:46 25 4
gpt4 key购买 nike

我想在更新过程中以编程方式部署字体包。因此,我需要用从 ZIP 存档中提取的新字体替换 \Windows\Fonts 中的旧字体文件。删除现有字体文件将导致 IOException,因为另一个进程正在访问该文件。

我试图通过调用 RemoveFontResource 释放字体并用 WM_FONTCHANGE 传播变化消息,但没有运气。 RemoveFontResource 返回 false, native 错误 2(未找到文件?)和 HRESULT -2147467259。该文件确实存在。

示例代码:

[DllImport("coredll.dll", SetLastError = true)]
private static extern int RemoveFontResource(string lpName);

[DllImport("coredll.dll", SetLastError = true)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

private const int WM_FONTCHANGE = 0x001D;
private const int HWND_BROADCAST = 0xffff;

public const string SAMPLE_FILE = @"\Windows\Fonts\MyFont.ttf";

public void RemoveFont()
{
if (!RemoveFontResource(SAMPLE_FILE))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}

SendMessage(new IntPtr(HWND_BROADCAST), WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);

File.Delete(SAMPLE_FILE);
}

是否真的有一种干净的方法来在系统范围内部署和替换字体?

最佳答案

如果字体文件是操作系统镜像的一部分,则它们具有就地执行 (XIP) 属性集(只读、系统、ROM)并且不能简单地替换。虽然可以在顶部复制同名文件,这会隐藏原始文件。如果复制在上面的文件被删除,原始文件又回来了。所有 XIP 文件都是这种情况。

我建议您使用 SysCache 目录来替换文件。这将适用于所有文件替换,无论它们是 XIP、驱动程序、DLL、正在使用还是以其他方式锁定以进行替换。

如果将与原始文件同名的文件放在系统缓存目录中,将使用这些文件代替原始文件。但是你必须在将文件放入 syscache 目录后对设备进行热启动。 Windows CE/Mobile 将仅在操作系统启动期间识别并“使用”系统缓存文件。

syscache 目录的位置可能会有所不同,具体取决于操作系统版本和 OEM 决定。在 WM 6 设备上,它应该是\Windows\System\syscache。检查设备的文件系统是否存在 syscache 目录。

顺便说一句:字体文件不需要放在\Windows\Fonts 中,放在\Windows 中就可以。

关于c# - 如何删除/替换当前使用的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com