簡単なようで簡単ではないフォントのインストール。
Fontsフォルダにコピーしただけでは登録されないから厄介ものです。
実際にフォントを登録するにあたって事前に調べてみました。
Qiita – フォントをインストールする
Sehll.Applicationを介することで登録ができるようですが、サイトのサンプルではどうにも動作しませんでした。
(サイトサンプルは拡張子に関連付けられている動詞動作によって実現しているようです)
他にも調べてみるとこんな記事がありました。(それにしても日本語記事が少ない)
スクリプトを使用してフォントをインストールする方法はありますか
重要な項目は下記引用部分です。
実際、「必要なのはフォントを Fonts フォルダーにコピーすることだけで、そのフォントは自動的にインストールされるんだな」とお考えかもしれません。ええ、そのとおりです。しかし、非常に重要な注意事項が 1 つあります。それは、Shell オブジェクトを使用してファイルをコピーする必要があることです。
Qiita記載のサンプルもそうでしたが、Sehll.Applicationを介してコピーすることができればいい様子なので、C#ではこんな感じで記述しました。
Type shellType = Type.GetTypeFromProgID("Shell.Application"); dynamic shellApp = Activator.CreateInstance(shellType); dynamic folder = shellApp.NameSpace(System.Environment.SpecialFolder.Fonts); folder.CopyHere(System.IO.Path.GetFullPath(@".\フォント名.ttf")); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(folder); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shellApp); GC.Collect();
Shellの取得についてはQiitaサンプルと同様です。
1~2行目
Shell.ApplicationのObjectを取得しています。
VBでしたらCreateObjectで済みますが、C#ではひと手間必要なんですね。
3行目
Fontsフォルダは「System.Environment.SpecialFolder.Fonts」を指定して取得します。
4行目
あとはCopyHereにコピーしたいFontがあるフルパスを渡してあげるだけです。
管理者権限で実行していない場合、UAC(ユーザーアカウント制御)が働きますが下図のようにフォントインストールが実行できます。
6~8行目
dinamicで宣言すると実行時に型の解決が図られるので便利ですね(静的解析の対象外なので、実行時にエラーとなる恐れもあるのは確かですが…)。上記例ではCOMオブジェクト(shellApp,folder )がアンマネージドであるため、Release処理を行っています。リーク防止のために必ず処理しましょう。