C#のプログラムで自分自身をPin止めする(3)
良く考えればそうなのですが、タスクバーにPin止めされているだけの状態ではプログラムは実行されていないわけですから、プログラムでAppIDを指定したところで有効になるわけがないのです。
では、その状態でのAppIDは何が使われているか?答えは
「Pin止めの実態の一つであるショートカット(.LNK)ファイルのプロパティとして埋め込まれているもの」
です。
そのプロパティとはSystem.AppUserModel.IDであって、このキーワードまでたどり着ければいくつか情報が出てくるのですが…
これらはC++で実装されているので外部EXEとして呼び出す、具体的には後者のWin7AppIdを使うと、
using System.Diagnostics; public static void Pinned(string filePath, bool pinTaskbar) { ...(前回までのコードの続きに追記) // ピン止め用ショートカットファイル検索 shortcut = null; foreach (string lnkFile in Directory.EnumerateFiles(userPinnedPath, "*.lnk")) { shortcut = (IWshRuntimeLibrary.WshShortcut)wshShell.CreateShortcut(lnkFile); if (filePath.Equals(shortcut.TargetPath, StringComparison.CurrentCultureIgnoreCase)) break; } wshShell = null; if (shortcut == null || !filePath.Equals(shortcut.TargetPath, StringComparison.CurrentCultureIgnoreCase)) return; // ショートカットファイルにSystem.AppUserModel.IDを設定 ProcessStartInfo psInfo = new ProcessStartInfo(); psInfo.FileName = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "Win7AppId1.1.exe"); psInfo.Arguments = "\"" + shortcut.FullName + "\" " + APP_ID; psInfo.CreateNoWindow = true; // コンソールウィンドウを開かない psInfo.UseShellExecute = false; // シェル機能を使用しない // Win7AppIdの実行 Process.Start(psInfo); }
という感じになります。Win7AppId1.1.exeはこのプログラムと同じフォルダに配置してください。
これでアイコンが分裂することなく正常に動作するようになりました。
ただ、これだと「C#のプログラムで」の名に恥じるので、何とかC#の世界だけで解決したいと思います。
というわけで、もう少しこのネタを引っ張ります。