我想在更新过程中以编程方式部署字体包。因此,我需要用\Windows\Fonts
从 ZIP 存档中提取的新字体文件替换旧字体文件。删除现有字体文件将导致IOException
, 因为另一个进程正在访问该文件。
我试图通过调用RemoveFontResource并使用WM_FONTCHANGE消息传播更改来释放字体,但没有运气。RemoveFontResource
返回false
本机错误 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);
}
实际上是否有一种干净的方法可以在系统范围内部署和替换字体?