シェル拡張機能の使用

シェルの機能は、レジストリ エントリと .ini ファイルを使用して拡張できます。 シェルを拡張するこのアプローチは単純であり、多くの目的に適していますが、制限されています。 たとえば、レジストリを使用してファイルの種類のカスタム アイコンを指定すると、その種類のすべてのファイルに同じアイコンが表示されます。 レジストリを使用してシェルを拡張しても、ファイルの種類のメンバーごとにアイコンを変更することはできません。 シェルのその他の側面 (ファイルが右クリックされたときに表示できる プロパティ シートなど) は、レジストリでまったく変更できません。

シェルを拡張するためのより強力で柔軟なアプローチは、 シェル拡張ハンドラーを実装することです。 これらのハンドラーは、シェルが実行できるさまざまなアクションに対して実装できます。 アクションを実行する前に、シェルは拡張機能ハンドラーにクエリを実行し、アクションを変更する機会を提供します。 一般的な例として、ショートカット メニュー拡張ハンドラーがあります。 ファイルの種類に対して実装されている場合は、いずれかのファイルが右クリックされるたびにクエリが実行されます。 ハンドラーは、そのファイルの種類のすべてのファイルに同じセットを設定するのではなく、ファイルごとに追加のメニュー項目を指定できます。

この一連のトピックでは、さまざまなシェル アクションを変更できる拡張ハンドラーを実装する方法について説明します。 次のハンドラーは特定のファイルの種類に関連付けられているので、ファイルごとに指定できます。

ハンドラー 説明
ショートカット メニュー ハンドラー ファイルのショートカット メニューが表示される前に呼び出されます。 これにより、ファイルごとにショートカット メニューに項目を追加できます。
データ ハンドラー シェル オブジェクトに対してドラッグ アンド ドロップ操作が実行されたときに呼び出されます。 これにより、ドロップ ターゲットに追加のクリップボード形式を提供できます。
ドロップ ハンドラー データ オブジェクトがファイル上でドラッグ またはドロップされたときに呼び出されます。 これにより、ファイルをドロップ ターゲットにすることができます。
アイコン ハンドラー ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルの既定のアイコンをファイルごとにカスタム アイコンに置き換えることができます。
プロパティ シート ハンドラー オブジェクトの Properties プロパティ シートが表示される前に呼び出されます。 これにより、ページを追加または置換できます。
サムネイル 画像ハンドラー 項目を表すイメージを提供します。
情報ヒント ハンドラー ユーザーがオブジェクトの上にマウス ポインターを置いたときにポップアップ テキストを提供します。
メタデータ ハンドラー ファイルに格納されているメタデータ (プロパティ) への読み取りおよび書き込みアクセスを提供します。 これを使用すると、詳細ビュー、ヒント、プロパティ ページ、およびグループ化機能を拡張できます。

 

その他のファイルは特定のファイルの種類に関連付けられていないが、一部のシェル操作の前に呼び出されます。

ハンドラー 説明
列ハンドラー フォルダーの詳細ビューを表示する前に、Windows エクスプローラーによって呼び出されます。 これにより、カスタム列を詳細ビューに追加できます。
フック ハンドラーのコピー フォルダーまたはプリンター オブジェクトの移動、コピー、削除、または名前変更が行われるときに呼び出されます。 これにより、操作を承認または拒否できます。
ドラッグ アンド ドロップ ハンドラー マウスの右ボタンでファイルをドラッグしたときに呼び出されます。 表示されるショートカット メニューを変更できます。
アイコン オーバーレイ ハンドラー ファイルのアイコンが表示される前に呼び出されます。 これにより、ファイルのアイコンのオーバーレイを指定できます。
検索ハンドラー 検索エンジンを起動するために呼び出されます。 これにより、[スタート] メニューまたは Windows エクスプローラーからアクセスできるカスタム検索エンジンを実装できます。

 

特定の拡張機能ハンドラーを実装する方法の詳細については、上記のセクションで説明します。 すべてのシェル拡張ハンドラーに共通する実装の問題については、次のトピックを参照してください。

Note

セキュリティと安定性に関する考慮事項: シェル拡張ハンドラーは、Explorer プロセス (またはシェルをホストするプロセス) に直接読み込むインプロセス COM DLL です。 拡張機能がクラッシュまたはハングすると、すべてのユーザーのエクスプローラーもクラッシュまたはハングします。

主な要件:

  • ThreadingModel = Apartmentに登録する - エクスプローラーのシェル ビューは STA スレッドで実行されます。 FreeまたはBothを使用すると、微妙なスレッドのバグが発生する可能性があります。
  • DPI 認識を正しく処理する - エクスプローラーはモニターごとの DPI 対応です。 固定 DPI を想定した拡張機能は、マルチモニターのセットアップで正しくレンダリングされません。
  • パッケージ化 (MSIX) アプリの場合は、レジストリ キーを直接書き込む代わりに、 desktop4:Extension 要素またはスパース パッケージを使用してマニフェスト ベースの登録を使用します。
  • 完全な COM シェル拡張機能を実装する前に、より単純な方法(静的動詞の登録、.regファイルの関連付け、または Windows.Storage.Provider API)で要件を満たせるかどうかを検討してください。