Windows 11アプリは、IExplorerCommand を実装し、コマンドをアプリ ID に登録することで、最新のエクスプローラー コンテキスト メニューを拡張します。 これは、パッケージ化されたデスクトップ アプリと、 スパース パッケージを使用するパッケージ化されていない Win32 アプリに適用されます。
ファイルの種類の関連付けでは、[ 開 く] でアプリを使用できるようにしたり、アプリが処理するファイルの種類の編集動詞を追加したりできます。 この記事で説明する汎用コンテキスト メニュー拡張機能は提供されません。 任意のファイル、フォルダー、またはフォルダーの背景のコマンドを追加するには、 IExplorerCommandを使用します。
Windows 11コンテキスト メニューのデザインとコマンドを追加するタイミングに関するガイダンスについては、「Windows 11でのコンテキスト メニューと共有ダイアログの拡張」を参照してください。
コンテキスト メニュー拡張機能のしくみ
コンテキスト メニュー拡張機能は、次の部分で構成されています。
- ネイティブ DLL は、
IExplorerCommandを公開する 1 つ以上の COM クラスを実装します。 - パッケージ マニフェストは、各 COM クラスを
windows.comServer拡張機能として登録します。 - パッケージ マニフェストは、コマンドを
windows.fileExplorerContextMenus拡張機能として登録し、シェル項目の種類を COM クラスの CLSID に関連付けます。
エクスプローラーは、コンテキスト メニューをビルドするときに COM クラスをアクティブにします。
IExplorerCommand実装では、タイトル、アイコン、状態、およびアクションが提供されます。 同じアプリのコマンドは、アプリ属性のポップアップにグループ化できます。子コマンドを提供する EnumSubCommands を実装します。
Important
エクスプローラーは、シェル エクスペリエンスの一部としてシェル拡張コードを読み込みます。
GetTitle、GetIcon、GetState、その他のメニュー構築方法を迅速に維持します。 エクスプローラーの UI パスでコストのかかる作業を実行しないでください。
Invokeが呼び出された後、より長い操作を実行します。
IExplorerCommand を実装する
ネイティブ COM DLL に IExplorerCommand を実装します。 コマンドはシェル統合パスで実行されるため、C++ が通常の選択肢です。 次の省略された実装は、コマンド タイトルを提供し、コマンドを有効にして、ユーザーが呼び出したときに選択した項目を受け取ります。
class EditCommand final : public IExplorerCommand
{
public:
IFACEMETHODIMP GetTitle(IShellItemArray*, PWSTR* title)
{
return SHStrDup(L"Edit with Contoso", title);
}
IFACEMETHODIMP GetState(
IShellItemArray*, BOOL, EXPCMDSTATE* state)
{
*state = ECS_ENABLED;
return S_OK;
}
IFACEMETHODIMP Invoke(IShellItemArray* items, IBindCtx*)
{
// Obtain selected items from items and start the app or operation.
return S_OK;
}
IFACEMETHODIMP GetIcon(IShellItemArray*, PWSTR* icon)
{
return SHStrDup(L"ContosoCommand.dll,-101", icon);
}
IFACEMETHODIMP GetToolTip(IShellItemArray*, PWSTR* tooltip)
{
*tooltip = nullptr;
return E_NOTIMPL;
}
IFACEMETHODIMP GetCanonicalName(GUID* canonicalName)
{
*canonicalName = GUID_NULL;
return S_OK;
}
IFACEMETHODIMP GetFlags(EXPCMDFLAGS* flags)
{
*flags = ECF_DEFAULT;
return S_OK;
}
IFACEMETHODIMP EnumSubCommands(IEnumExplorerCommand** commands)
{
*commands = nullptr;
return E_NOTIMPL;
}
};
現在の選択範囲を列挙するには、IShellItemArrayに渡されたInvokeを使用します。
GetState は、 ECS_HIDDEN、 ECS_DISABLED、 ECS_ENABLED などの状態を返して、コマンドを表示して選択できるかどうかを制御できます。 完全なコントラクトについては、 IExplorerCommand を参照してください。
COM クラスに CLSID を割り当て、パッケージ マニフェストで同じ CLSID が使用されていることを確認します。 例えば次が挙げられます。
class __declspec(uuid("01234567-89AB-CDEF-0123-456789ABCDEF"))
EditCommand;
パッケージ マニフェストにコマンドを登録する
ルート com要素でdesktop4、desktop5、およびPackage名前空間を宣言し、IgnorableNamespacesに追加します。
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
xmlns:desktop5="http://schemas.microsoft.com/appx/manifest/desktop/windows10/5"
IgnorableNamespaces="com desktop4 desktop5">
<!-- ... -->
</Package>
アプリケーション Extensions 要素の下で、まず DLL を COM サーバーとして登録します。
com:Class/@Id はコマンドの CLSID で、 Path は DLL のパッケージ相対パスです。
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:SurrogateServer DisplayName="Contoso commands">
<com:Class
Id="01234567-89AB-CDEF-0123-456789ABCDEF"
Path="ContosoCommand.dll"
ThreadingModel="STA" />
</com:SurrogateServer>
</com:ComServer>
</com:Extension>
次に、CLSID を、コマンドが表示されるコンテキストに関連付けます。
<desktop4:Extension Category="windows.fileExplorerContextMenus">
<desktop4:FileExplorerContextMenus>
<desktop5:ItemType Type="*">
<desktop5:Verb
Id="EditWithContoso"
Clsid="01234567-89AB-CDEF-0123-456789ABCDEF" />
</desktop5:ItemType>
</desktop4:FileExplorerContextMenus>
</desktop4:Extension>
desktop5:ItemType/@Type は、ターゲット シェル項目を識別します。 ファイルの * 、選択したフォルダーの Directory 、またはフォルダーの背景に Directory\Background を使用します。 コマンドが複数のコンテキストをサポートしている場合は、同じ CLSID に対して複数の ItemType 項目を登録できます。
desktop5:Verb/@Idはマニフェストの登録を識別します。
desktop5:Verb/@Clsid は、 com:Class/@Id 値と COM クラスの CLSID と一致する必要があります。
完全なマニフェスト スキーマについては、 desktop4:FileExplorerContextMenus と com:Class を参照してください。
DLL をパッケージ化する
コマンド DLL と必要なリソースを、 com:Class/@Pathで指定されたパスのパッケージに含めます。 Windows アプリケーション パッケージ Projectを使用する場合は、PROJECTに DLL を追加し、パッケージ出力にコピーするように構成します。 パッケージに現在の DLL が含まれるように、ビルド依存関係またはビルド後のコピーを構成します。
DLL アーキテクチャは、読み込むエクスプローラー アーキテクチャと一致する必要があります。 ターゲット デバイスに適したアーキテクチャをビルドしてパッケージ化します。
パッケージ化されていないアプリにスパース パッケージを使用する
パッケージ化されていない Win32 アプリでは、アプリ パッケージ ID を提供するスパース パッケージをインストールすることで、同じ IExplorerCommand とマニフェストの登録を使用できます。 スパース パッケージにはアプリ バイナリが含まれていません。代わりに、外部にインストールされたアプリを参照します。
前に示した COM およびコンテキスト メニュー拡張機能に加えて、スパース パッケージ マニフェストは通常、 uap10:AllowExternalContent を宣言し、アプリケーションを Win32 アプリとして構成します。 次の例は、関連するスパース パッケージ宣言を示しています。
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap10 rescap">
<Properties>
<uap10:AllowExternalContent>true</uap10:AllowExternalContent>
</Properties>
<Applications>
<Application
Id="ContosoApp"
Executable="ContosoApp.exe"
uap10:TrustLevel="mediumIL"
uap10:RuntimeBehavior="win32App">
<!-- VisualElements and the COM/context-menu Extensions go here. -->
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="unvirtualizedResources" />
</Capabilities>
</Package>
パッケージ化されていないアプリのパッケージ化と登録の要件については、「 スパース パッケージ 」を参照してください。
拡張機能をテストする
パッケージをインストールまたは登録し、エクスプローラーを開き、登録されている項目の種類のいずれかに一致する項目を右クリックします。 パッケージのインストールまたは更新後にコマンドが表示されない場合は、エクスプローラーを再起動するか、サインアウトしてから再度サインインして、シェルで拡張機能の登録が再読み込みされるようにします。
従来のコンテキスト メニュー拡張機能を検査する場合にのみ 、[その他のオプションを表示] を使用します。
windows.fileExplorerContextMenusによって登録され、IExplorerCommandで実装されたコマンドがWindows 11コンテキスト メニューに表示されます。
ファイルの種類の関連付け
アプリが開くか、その ファイルの種類 を編集するときに、ファイルの種類の関連付けを登録します。 アプリを Open with で 使用できるようにしたり、関連するファイルの種類の編集動詞を追加したりできます。 この記事のコンテキスト メニュー メカニズムは、汎用ファイル、フォルダー、または背景に適用されるコマンド、またはアプリの通常のファイルを開かずに操作を実行するコマンドに使用します。
Windows developer