更新プロセス中にプログラムでフォント パッケージを展開したいと考えています。したがって、古いフォント ファイルを\Windows\Fonts
ZIP アーカイブから抽出した新しいフォント ファイルに置き換える必要があります。既存のフォント ファイルを削除するとIOException
、別のプロセスがファイルにアクセスするため、エラーが発生します。
RemoveFontResourceを呼び出してWM_FONTCHANGEメッセージで変更を伝達することでフォントを解放しようとしましたが、うまくいきませんでした。ネイティブ エラー 2 (ファイルが見つかりませんか?) と HRESULT -2147467259 が返されますRemoveFontResource
。false
ファイルは実際に存在します。
サンプルコード:
[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);
}
システム全体でフォントを展開して置き換えるクリーンな方法は実際にありますか?