アプリケーション ユーザー モデル ID (AppID)

[このドキュメントは暫定版であり、変更されることがあります。]

アプリケーション ユーザー モデル ID (AppID) は、プロセス、ファイル、およびウィンドウを特定のアプリケーションに関連付けるために、Windows 7 以降のシステムのタスク バーで広く使用されています。状況によっては、システムによってプロセスに割り当てられる内部 AppID を利用するだけで十分な場合もあります。ただし、複数のプロセスを所有するアプリケーションや、ホスト プロセスで実行されているアプリケーションでは、明示的にアプリケーション自体を識別して、他の方法ではまとめることができないウィンドウを 1 つのタスク バー ボタンにグループ化し、そのアプリケーションのジャンプ リストの内容を制御できるようにする必要があります。

  • アプリケーション定義の AppID を形成する方法
  • アプリケーション定義の AppID とシステム定義の AppID
  • AppID を割り当てる対象
  • ホスト プロセスとしてのアプリケーションの登録
  • 関連トピック

アプリケーション定義の AppID を形成する方法

アプリケーションは次の形式で AppID を提供する必要があります。AppID は 128 文字に制限されています。

CompanyName.ProductName.SubProduct.VersionInformation

CompanyName と ProductName は常に使用する必要があります。一方、SubProduct と VersionInformation の部分は省略可能で、アプリケーションの要件に応じて設定します。SubProduct によって、複数のサブアプリケーションによって構成されるメイン アプリケーションで、各サブアプリケーションとその関連付けられたウィンドウに個別のタスク バー ボタンを提供できます。VersionInformation を使用すると、アプリケーションの 2 つのバージョンを独立したエンティティとして表示しながら、共存させることができます。アプリケーションがこのように使用されることを意図していない場合は、VersionInformation を省略して、アップグレードされたバージョンが、置き換えられるバージョンと同じ AppID を使用できるようにする必要があります。

アプリケーション定義の AppID とシステム定義の AppID

アプリケーションの中には、明示的な AppID を宣言しないものがあります。この場合、システムは一連のヒューリスティックを使用して内部 AppID を割り当てます。ただし、このような計算を回避することにはパフォーマンス向上のメリットがあるので、明示的な ID を設定することを強くお勧めします。アプリケーションでは、システムで割り当てられた AppID を取得できません。

ジャンプ リストをカスタマイズするときに、アプリケーションが明示的な AppID を使用している場合は、すべての実行中のウィンドウまたはプロセス、ショートカット、およびファイルの関連付けにも同じ AppID を割り当てる必要があります。また、SHAddToRecentDocs の呼び出しでも同じ AppID を使用する必要があります。

  アプリケーションが明示的な AppID を持たない場合、アプリケーション内から IApplicationDestinationsIApplicationDocumentListsICustomDestinationList メソッド、および SHAddToRecentDocs を呼び出す必要があります。これらのメソッドが、アンインストーラーなどの別のプロセスから呼び出された場合、システムは正しい AppID を生成できず、これらの呼び出しは効果がありません。

オブジェクトの SetAppID メソッドによって AppID が指定されると、その AppID は、別の SetAppID の呼び出しによって上書きされない限り、オブジェクトの有効期間中はオブジェクト内に保存されます。

AppID を割り当てる対象

アプリケーションに明示的な AppID が設定されている場合、以下のすべての場所や状況でその AppID を割り当てる必要があります。

  • アプリケーションのショートカット ファイルの System.AppUserModel.ID プロパティ。ショートカット (IShellLink、CLSID_ShellLink、または .lnk ファイル) では、IPropertyStore およびその他のシェル全体で使用されるプロパティ設定方法を通じてプロパティをサポートしています。
  • アプリケーションの実行中のウィンドウのプロパティ (SHGetPropertyStoreForWindow によってプロパティ ストアを取得) またはそのプロセスの AppID (SetCurrentProcessExplicitAppUserModelID による)。
  • アプリケーションのジャンプ リストをカスタマイズまたは更新 (ICustomDestinationList)、取得 (IApplicationDocumentLists)、クリア (IApplicationDestinations) するための呼び出し。
  • ファイルの関連付けの登録 (ProgID を使用)。アプリケーションが、システムで自動的に生成された [最近使ったもの] または [よく使うもの] のターゲット一覧を使用している場合に割り当てます。これは、これらの一覧を設定する SHAddToRecentDocs の呼び出しで使用されます。これは、必ずしも SHAddToRecentDocs の呼び出しを使用するわけではないカスタム ジャンプ リストの場合にも適用されます。

アプリケーションのプロセスが、個別の AppID を必要とするウィンドウのコレクションをホストしている場合があります。たとえば、スイート アプリケーションで、スイート内のサブ機能ごとにウィンドウを整理し、各サブ機能を個別のタスク バー ボタンで表すことが必要になる場合があります。この場合、AppID を各ウィンドウのプロパティとして割り当てて、タスク バー上で正しくグループ化されるようにする必要があります。これを行うには、SHGetPropertyStoreForWindow を通じてウィンドウのプロパティ ストアにアクセスし、プロパティを設定します。ただし、プロセスによって所有されるすべてのウィンドウが同じ AppID を使用する場合、各ウィンドウに個々にラベルを設定する代わりに、SetCurrentProcessExplicitAppUserModelID を使用する必要があります。

アプリケーションは、初回の起動時に SetCurrentProcessExplicitAppUserModelID を呼び出して AppID を設定する必要があります。この処理は、アプリケーションがユーザー インターフェイス (UI) を表示したり、ジャンプ リストを操作したり、SHAddToRecentDocs を呼び出したり (またはシステムを通じて呼び出したり) する前に行う必要があります。

ホスト プロセスとしてのアプリケーションの登録

アプリケーションでは、IsHostApp レジストリ エントリを設定して、実行可能プログラムのプロセスがタスク バーによってホスト プロセスと見なされるようにすることができます。これは、アプリケーションのグループ化や既定のジャンプ リストのエントリに影響します。

次の例に、必要なレジストリ エントリを示します。このエントリには値が割り当てられていないことに注意してください。必要なことは、このエントリが存在することだけです。これは REG_NULL 値です。

HKEY_CLASSES_ROOT
     Applications
example.exe                IsHostApp

プロセスの実行中のインスタンスを起動するために使用されたショートカット ファイルが識別できる場合や、アプリケーションが明示的に AppID を設定している場合は、ホスト プロセス リストは無視され、アプリケーションはタスク バーによって通常のアプリケーションとして処理されます。アプリケーションの実行中のウィンドウは 1 つのタスク バー ボタンにグループ化され、アプリケーションはタスク バーに固定できます。

実行中のプロセスの実行可能ファイル名のみがわかっていて、実行可能ファイルがホスト プロセス リストにある場合は、プロセスの各インスタンスはタスク バーのグループ化で個別のエンティティとして処理されます。プロセスの特定のインスタンスに関連付けられたタスク バー ボタンには、固定/固定解除のオプションや、プロセスの新しいインスタンス用の起動アイコンは表示されません。

関連トピック