Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Windows 11-apps breiden het moderne contextmenu van Verkenner uit door IExplorerCommand te implementeren en de opdracht te registreren met een app-identiteit. Dit geldt voor verpakte desktop-apps en voor uitgepakte Win32-apps die gebruikmaken van een sparse-pakket.
Een bestandstypekoppeling kan een app beschikbaar maken in Openen met of een bewerkingswerkwoord toevoegen voor een bestandstype dat door de app wordt verwerkt. Het bevat niet de contextmenuextensie voor algemeen gebruik die in dit artikel wordt beschreven. Als u een opdracht wilt toevoegen voor willekeurige bestanden, mappen of mapachtergronden, gebruikt u IExplorerCommand.
Zie Het contextmenu en het dialoogvenster Delen uitbreiden in Windows 11 voor het ontwerp van het contextmenu in Windows 11 en richtlijnen voor wanneer u een opdracht moet toevoegen.
Hoe contextmenu-extensies werken
Een contextmenu-extensie heeft deze onderdelen:
- Een native DLL implementeert een of meer COM-klassen die
IExplorerCommandblootstellen. - Het pakketmanifest registreert elke COM-klasse als een
windows.comServerextensie. - Het pakketmanifest registreert de opdracht als een
windows.fileExplorerContextMenusextensie en koppelt een shell-itemtype aan de CLSID van de COM-klasse.
Bestandsverkenner activeert de COM-klasse wanneer het het contextmenu opbouwt. Uw IExplorerCommand implementatie levert de titel, het pictogram, de status en de actie. Opdrachten van dezelfde app kunnen worden gegroepeerd in een aan de app toegewezen fly-out; implementeer EnumSubCommands om onderliggende opdrachten op te geven.
Important
Verkenner laadt shell-extensiecode als onderdeel van de shell-ervaring. Zorg dat GetTitle, GetIcon, GetState en andere methoden voor menuconstructie snel blijven. Voer geen kostbaar werk uit op het pad van de gebruikersinterface van Verkenner. Voer langere bewerkingen uit nadat Invoke is aangeroepen.
IExplorerCommand implementeren
Implementeren IExplorerCommand in een systeemeigen COM-DLL. C++ is de gebruikelijke keuze omdat de opdracht wordt uitgevoerd in het Shell-integratiepad. De volgende verkorte implementatie biedt een opdrachttitel, schakelt de opdracht in en ontvangt de geselecteerde items wanneer de gebruiker deze aanroept.
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;
}
};
Gebruik de IShellItemArray die aan Invoke is doorgegeven om de huidige selectie op te sommen.
GetState kan statussen retourneren, zoals ECS_HIDDEN, ECS_DISABLEDof ECS_ENABLED om te bepalen of de opdracht wordt weergegeven en kan worden geselecteerd. Zie IExplorerCommand voor het volledige contract.
Wijs de COM-klasse een CLSID toe en zorg ervoor dat dezelfde CLSID wordt gebruikt in het pakketmanifest. Voorbeeld:
class __declspec(uuid("01234567-89AB-CDEF-0123-456789ABCDEF"))
EditCommand;
De opdracht registreren in het pakketmanifest
Declareer de naamruimten com, desktop4 en desktop5 op het hoofd-Package-element en voeg ze toe aan 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>
Registreer eerst het DLL-bestand als com-server onder het toepassingselement Extensions .
com:Class/@Id is de CLSID van de opdracht en Path is het pakket-relatieve pad van de 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>
Koppel vervolgens de CLSID aan de context waarin de opdracht moet worden weergegeven.
<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 identificeert de doelshellitems. Gebruiken * voor bestanden, Directory voor geselecteerde mappen of Directory\Background voor de achtergrond van een map. U kunt meerdere ItemType vermeldingen registreren voor dezelfde CLSID wanneer een opdracht meerdere contexten ondersteunt.
De desktop5:Verb/@Id identificeert de manifestregistratie.
desktop5:Verb/@Clsid moet overeenkomen met de com:Class/@Id waarde en de CLSID op de COM-klasse.
Zie desktop4:FileExplorerContextMenus en com:Class voor het volledige manifestschema.
De DLL verpakken
Neem de opdracht-DLL en alle resources op die nodig zijn in het pakket op het pad dat is opgegeven door com:Class/@Path. Als u een Windows Application Packaging-Project gebruikt, voegt u de DLL toe aan de project en configureert u deze om naar de pakketuitvoer te kopiëren. Configureer een build-afhankelijkheid of een kopie na de build, zodat het pakket de huidige DLL bevat.
De DLL-architectuur moet overeenkomen met de Verkenner-architectuur waarmee deze wordt geladen. Bouw en verpakt de juiste architectuur voor het doelapparaat.
Een sparse-pakket gebruiken voor een uitgepakte app
Een uitgepakte Win32-app kan dezelfde IExplorerCommand en manifestregistraties gebruiken door een sparse-pakket te installeren dat de app-pakketidentiteit geeft. Een sparse-pakket bevat niet de binaire app-bestanden; in plaats daarvan verwijst deze naar de extern geïnstalleerde app.
Naast de com- en contextmenu-extensies die eerder worden weergegeven, declareert en configureert uap10:AllowExternalContent een sparse-pakketmanifest de toepassing doorgaans als een Win32-app. In het volgende voorbeeld worden de relevante sparse-package-declaraties weergegeven.
<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>
Zie Sparse packages voor de verpakkings- en registratievereisten voor apps zonder pakket.
De extensie testen
Installeer of registreer het pakket, open de Verkenner en klik met de rechtermuisknop op een item van een van de geregistreerde itemtypen. Als de opdracht niet wordt weergegeven na het installeren of bijwerken van een pakket, start u Bestandsverkenner opnieuw of meldt u zich af en weer aan, zodat de shell de registratie van de extensie opnieuw laadt.
Gebruik Meer opties weergeven om verouderde contextmenu-extensies te controleren. Een opdracht die is geregistreerd via windows.fileExplorerContextMenus en geïmplementeerd met IExplorerCommand wordt weergegeven in het contextmenu van Windows 11.
Bestandstypekoppelingen
Registreer een bestandstypekoppeling wanneer de app dat bestandstype opent of bewerkt. De app kan beschikbaar worden gesteld via Openen met en kan een bewerkingswerkwoord toevoegen voor gekoppelde bestandstypen. Gebruik het contextmenumechanisme in dit artikel voor opdrachten die van toepassing zijn op algemene bestanden, mappen of achtergronden, of voor opdrachten die bewerkingen uitvoeren zonder de normale ervaring voor het openen van bestanden van de app te openen.
Windows developer