C#のプログラムで自分自身をPin止めする(2)
前回の続き。
いろいろ調べていくとタスクバーアイコンのグループ化には「アプリケーションID(AppID)」が関係しているということがわかりました。
- Windows API Code Packによるアプリ開発 第10回 Windows 7 タスクバー 〜アプリケーション ユーザー モデル ID (AppID)〜
- Win7: タスクバープログラミング(AppIDs)
C#でアプリケーションIDを設定するにはWin7 API Code Packで使用可能なMicrosoft.WindowsAPICodePack.TaskbarクラスのTaskbarManager.Instance.ApplicationIdを設定する、具体的には、
using Microsoft.WindowsAPICodePack.Taskbar; const string APP_ID = "CompanyName.ProductName"; TaskbarManager.Instance.ApplicationId = APP_ID;
をフォームの表示前に実行すればよいとのことですから、前回のPinned()メソッドと組み合わせるとこんな感じになるかと思います。
using System; using System.Windows.Forms; using System.IO; using System.Text.RegularExpressions; using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Taskbar; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main(string[] args) { // Win7以前では実行しても効果が無いので if (!MS.WindowsAPICodePack.Internal.CoreHelpers.RunningOnWin7) return; // AppID設定 SetAppId(APP_ID); // コマンドラインオプション解析(/pinnedオプションでPin止め) if (args.Length > 0) { switch (args[0]) { case "/pinned": Pinned(Application.ExecutablePath, true); break; } } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } public const string APP_ID = "Sample.SelfPinned"; /// <summary> /// アプリケーションIDの設定 /// </summary> /// <param name="appId">アプリケーションID</param> public static void SetAppId(string appId) { TaskbarManager.Instance.ApplicationId = APP_ID; } public static void Pinned(string filePath, bool pinTaskbar) { //(前回と同じなので省略) }
ところが、これでも依然としてPin止めしたタスクバーアイコンと実行中のアプリケーションのアイコンは分裂してしまいます。
さらに調べると、Pin止めしたタスクバーアイコンはTaskbarManager.Instance.ApplicationIdの設定とは無関係で、別なルールが適応されるということが判明しました。
ではいったいどうすればいいのでしょうか?それはまた次回に。