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

标签 c# fonts windows-mobile compact-framework windows-ce

我想在更新过程中以编程方式部署字体包。因此,我需要用从 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 目录中,则将使用这些文件而不是原始文件。但是在将文件放入 syscache 目录后,您必须热启动设备。 Windows CE/Mobile 仅在操作系统启动期间才会识别并“使用”syscache 文件。

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

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

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

相关文章:

c# - 如何从 Windows-mobile 获取 MAC 地址?

c# - 如何从azure应用程序服务访问 key 保管库

c# - 如何绑定(bind) MouseDoubleClick 事件

c# - 自适应Windows移动应用程序

html - 更改字体颜色

delphi - 在delphi中嵌入字体

c# - 如何使用 C# 在 Windows CE 中将 SQL Server Compact 表导出到 Excel?

c# - 如何获取字典中的键列表?

c# - 在选择中使用 PredicateBuilder

html - Dreamweaver CS6 : Fonts Don't Work