Freigeben über


Erstellen von Kontextmenühandlern

Kontextmenühandler, auch als Kontextmenühandler oder Verbhandler bezeichnet, sind ein Dateityphandler. Diese Handler können auf eine Weise implementiert werden, die dazu führt, dass sie in ihrem eigenen Prozess oder im Explorer oder in anderen Drittanbieterprozessen geladen werden. Achten Sie beim Erstellen von In-Process-Handlern darauf, dass sie dem Prozess schaden können, der sie lädt.

Hinweis

Es gibt besondere Überlegungen für 64-Bit-basierte Versionen von Windows beim Registrieren von Handlern, die im Kontext von 32-Bit-Anwendungen funktionieren: Wenn sie im Kontext einer Anwendung unterschiedlicher Bits aufgerufen werden, leitet das WOW64-Subsystem den Dateisystemzugriff auf einige Pfade um. Wenn Ihr EXE-Handler in einem dieser Pfade gespeichert ist, ist er in diesem Kontext nicht zugänglich. Speichern Sie daher als Problemumgehung entweder Ihren EXE-Handler in einem Pfad, der nicht umgeleitet wird, oder speichern Sie eine Stubversion des EXE-Handlers, die die echte Version startet.

Dieses Thema ist wie folgt organisiert:

Kanonische Verben

Anwendungen sind im Allgemeinen für die Bereitstellung lokalisierter Anzeigezeichenfolgen für die von ihnen definierten Verben verantwortlich. Um jedoch eine gewisse Sprachunabhängigkeit zu gewährleisten, definiert das System einen Standardsatz häufig verwendeter Verben, die als kanonische Verben bezeichnet werden. Ein kanonisches Verb wird dem Benutzer niemals angezeigt und kann mit jeder UI-Sprache verwendet werden. Das System verwendet den kanonischen Namen, um automatisch eine ordnungsgemäß lokalisierte Anzeigezeichenfolge zu generieren. Beispielsweise wird die Anzeigezeichenfolge des geöffneten Verbs auf "Open" auf einem englischen System und auf das deutsche Äquivalent auf einem deutschen System festgelegt.

Kanonisches Verb Beschreibung
Öffnen Öffnet die Datei oder den Ordner.
Opennew Öffnet die Datei oder den Ordner in einem neuen Fenster.
Drucken Druckt die Datei.
Printto Ermöglicht es dem Benutzer, eine Datei zu drucken, indem er sie auf ein Druckerobjekt zieht.
Erkunden Öffnet Windows Explorer mit ausgewähltem Ordner.
Eigenschaften Öffnet das Eigenschaftenblatt des Objekts.

Hinweis

Das Verb Printto ist auch kanonisch, wird aber nie angezeigt. Die Aufnahme ermöglicht es dem Benutzer, eine Datei zu drucken, indem er sie auf ein Druckerobjekt zieht.

Kontextmenühandler können über IContextMenu::GetCommandString mit GCS_VERBW oder GCS_VERBA eigene kanonische Verben bereitstellen. Das System verwendet die kanonischen Verben als zweiten Parameter (lpOperation), der an ShellExecute übergeben wird, und ist die CMINVOKECOMMANDINFO.lpVerb-Element, das an die IContextMenu::InvokeCommand-Methode übergeben wird.

Erweiterte Verben

Wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt, zeigt das Kontextmenü die Standardverben an. Möglicherweise möchten Sie Befehle in einigen Kontextmenüs hinzufügen und unterstützen, die nicht in jedem Kontextmenü angezeigt werden. Beispielsweise könnten Sie Befehle haben, die nicht häufig verwendet werden oder für erfahrene Benutzer vorgesehen sind. Aus diesem Grund können Sie auch ein oder mehrere erweiterte Verben definieren. Diese Verben ähneln normalen Verben, unterscheiden sich jedoch von normalen Verben, indem sie registriert werden. Um Zugriff auf erweiterte Verben zu haben, muss der Benutzer mit der rechten Maustaste auf ein Objekt klicken, während er die UMSCHALTTASTE drückt. Wenn der Benutzer dies tut, werden die erweiterten Verben zusätzlich zu den Standardverben angezeigt.

Sie können die Registrierung verwenden, um ein oder mehrere erweiterte Verben zu definieren. Die zugehörigen Befehle werden nur angezeigt, wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt, während er auch die UMSCHALTTASTE drückt. Um ein Verb als erweitert zu definieren, fügen Sie dem Unterschlüssel des Verbs einen "erweiterten" REG_SZ Wert hinzu. Der Wert sollte keine Daten zugeordnet haben.

Programmgesteuerte Zugriffsverben

Diese Verben werden nie in einem Kontextmenü angezeigt. Auf diese können Sie mithilfe von ShellExecuteEx zugreifen und das lpVerb-Feld des pExecInfo-Parameters (ein SHELLEXECUTEINFO-Objekt ) angeben. Um ein Verb nur als programmgesteuerten Zugriff zu definieren, fügen Sie dem Unterschlüssel des Verbs einen "ProgrammaticAccessOnly" -REG_SZ Wert hinzu. Der Wert sollte keine Daten zugeordnet haben.

Sie können die Registrierung verwenden, um ein oder mehrere erweiterte Verben zu definieren. Die zugehörigen Befehle werden nur angezeigt, wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt, während er auch die UMSCHALTTASTE drückt. Um ein Verb als erweitert zu definieren, fügen Sie dem Unterschlüssel des Verbs einen "erweiterten" REG_SZ Wert hinzu. Der Wert sollte keine Daten zugeordnet haben.

Anpassen eines Kontextmenüs mithilfe statischer Verben

Nachdem Sie ein statisches oder dynamisches Verb für Ihr Kontextmenü ausgewählt haben, können Sie das Kontextmenü für einen Dateityp erweitern, indem Sie ein statisches Verb für den Dateityp registrieren. Fügen Sie dazu einen Shell-Unterschlüssel unter dem Unterschlüssel für die ProgID der Anwendung hinzu, die dem Dateityp zugeordnet ist. Optional können Sie ein Standardverb für den Dateityp definieren, indem Sie es zum Standardwert des Shell-Unterschlüssels machen.

Das Standardverb wird zuerst im Kontextmenü angezeigt. Der Zweck besteht darin, die Shell mit einem Verb bereitzustellen, das sie verwenden kann, wenn die ShellExecuteEx-Funktion aufgerufen wird, aber kein Verb angegeben wird. Die Shell wählt nicht unbedingt das Standardverb aus, wenn ShellExecuteEx in dieser Weise verwendet wird.

Die Shell verwendet das erste verfügbare Verb in der folgenden Reihenfolge:

  1. Das Standardverb
  2. Das erste Verb in der Registrierung, wenn die Verbreihenfolge angegeben wird
  3. Das Verb "Öffnen"
  4. Das Verb "Öffnen mit "

Wenn keine der aufgelisteten Verben verfügbar ist, schlägt der Vorgang fehl.

Erstellen Sie einen Unterschlüssel für jedes Verb, das Sie unter dem Shell-Unterschlüssel hinzufügen möchten. Jeder dieser Unterschlüssel muss einen REG_SZ Wert auf die Anzeigezeichenfolge des Verbs (lokalisierte Zeichenfolge) festlegen. Erstellen Sie für jeden Verbunterschlüssel einen Befehlsunterschlüssel mit dem Standardwert, der auf die Befehlszeile zum Aktivieren der Elemente festgelegt ist. Bei kanonischen Verben wie "Öffnen" und "Drucken" können Sie die Anzeigezeichenfolge weglassen, da vom System automatisch eine ordnungsgemäß lokalisierte Zeichenfolge angezeigt wird. Bei nichtcanonischen Verben wird die Verbzeichenfolge angezeigt, wenn Sie die Anzeigezeichenfolge weglassen.

Beachten Sie im folgenden Registrierungsbeispiel Folgendes:

  • Da Doit kein kanonisches Verb ist, wird ihm ein Anzeigename zugewiesen, der durch Drücken der D-TASTE ausgewählt werden kann.
  • Das Verb "Drucken" wird im Kontextmenü nicht angezeigt. Die Aufnahme in die Registrierung ermöglicht es dem Benutzer jedoch, Dateien zu drucken, indem er sie auf einem Druckersymbol ablegen.
  • Für jedes Verb wird ein Unterschlüssel angezeigt. %1 stellt den Dateinamen und %2 den Druckernamen dar.
HKEY_CLASSES_ROOT
   .myp-ms
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = My Program Application
      Shell
         (Default) = doit
         doit
            (Default) = &Do It
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         open
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1" "%2"

Das folgende Diagramm veranschaulicht die Erweiterung des Kontextmenüs gemäß den oben aufgeführten Registrierungseinträgen. Dieses Kontextmenü enthält "Öffnen", "Do It" und "Drucken " im Menü mit "Do It " als Standardverb.

Screenshot des Standardverb-Kontextmenüs

Aktivieren des Handlers mithilfe der IDropTarget-Schnittstelle

Dynamischer Datenaustausch (Dynamic Data Exchange, DDE) ist veraltet; verwenden Sie stattdessen IDropTarget. IDropTarget ist robuster und bietet eine bessere Aktivierungsunterstützung, da sie die COM-Aktivierung des Handlers verwendet. Bei mehrfacher Elementauswahl unterliegt IDropTarget nicht den Einschränkungen für die Puffergröße, die sowohl in DDE als auch im CreateProcess zu finden sind. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, das mithilfe der FUNKTION SHCreateShellItemArrayFromDataObject in ein Elementarray konvertiert werden kann. Dies ist einfacher und verliert keine Namespaceinformationen wie beim Konvertieren des Elements in einen Pfad für Befehlszeilen- oder DDE-Protokolle.

Weitere Informationen zu IDropTarget- und Shell-Abfragen für Dateizuordnungsattribute finden Sie unter "Wahrgenommene Typen und Anwendungsregistrierung".

Angeben der Position und Reihenfolge statischer Verben

Normalerweise werden Verben in einem Kontextmenü basierend darauf sortiert, wie sie aufgezählt werden; die Aufzählung basiert zuerst auf der Reihenfolge des Zuordnungsarrays und dann auf der Reihenfolge der Elemente im Zuordnungsarray, wie durch die Sortierreihenfolge der Registrierung definiert.

Verben können sortiert werden, indem der Standardwert des Shell-Unterschlüssels für den Zuordnungseintrag angegeben wird. Dieser Standardwert kann ein einzelnes Element enthalten, das an der oberen Position des Kontextmenüs angezeigt wird, oder eine Liste mit Elementen, die durch Leerzeichen oder Kommas getrennt sind. Im letzteren Fall ist das erste Element in der Liste das Standardelement, und die anderen Verben werden unmittelbar darunter in der angegebenen Reihenfolge angezeigt.

Der folgende Registrierungseintrag erzeugt beispielsweise Kontextmenüverben in der folgenden Reihenfolge:

  1. Anzeige
  2. Apparate
  3. Personalisierung
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

Ebenso erzeugt der folgende Registrierungseintrag Kontextmenüverben in der folgenden Reihenfolge:

  1. Personalisierung
  2. Apparate
  3. Anzeige
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Positionieren von Verben am oberen oder unteren Rand des Menüs

Das folgende Registrierungsattribute kann verwendet werden, um ein Verb am oberen oder unteren Rand des Menüs zu platzieren. Wenn mehrere Verben vorhanden sind, die dieses Attribut angeben, erhält die letzte zu tunde Priorität:

Position=Top | Bottom 

Erstellen statischer Kaskadierender Menüs

In Windows 7 und höher wird die Cascading-Menüimplementierung über Registrierungseinstellungen unterstützt. Vor Windows 7 war die Erstellung von Kaskadierungsmenüs nur durch die Implementierung der IContextMenu-Schnittstelle möglich. In Windows 7 und höher sollten Sie nur dann auf COM-codebasierte Lösungen zurückgreifen, wenn die statischen Methoden nicht ausreichen.

Der folgende Screenshot enthält ein Beispiel für ein kaskadierendes Menü.

Screenshot mit einem Beispiel für ein kaskadierendes Menü

In Windows 7 und höher gibt es drei Möglichkeiten, kaskadierende Menüs zu erstellen:

Erstellen von Kaskadierenden Menüs mit dem Registrierungseintrag "SubCommands"

In Windows 7 und höher können Sie den Eintrag "SubCommands" verwenden, um kaskadierende Menüs mithilfe des folgenden Verfahrens zu erstellen.

So erstellen Sie ein kaskadierendes Menü mithilfe des Eintrags "SubCommands"

  1. Erstellen Sie unter HKEY_CLASSES_ROOT\ProgID-Shell\ einen Unterschlüssel, um Ihr Cascading-Menü darzustellen. In diesem Beispiel geben wir diesem Unterschlüssel den Namen CascadeTest. Stellen Sie sicher, dass der Standardwert des CascadeTest-Unterschlüssels leer ist und als (Wert nicht festgelegt) angezeigt wird.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. Fügen Sie ihrem CascadeTest-Unterschlüssel einen MUIVerb-Eintrag vom Typ REG_SZ hinzu, und weisen Sie ihm den Text zu, der im Kontextmenü als Name angezeigt wird. In diesem Beispiel weisen wir es "Testkaskadenmenü" zu.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. Fügen Sie ihrem CascadeTest-Unterschlüssel einen SubCommands-Eintrag vom Typ REG_SZ hinzu, der durch Semikolons getrennt ist, der Verben, die im Menü angezeigt werden sollen, in der Reihenfolge der Darstellung. Hier weisen wir beispielsweise eine Reihe von vom System bereitgestellten Verben zu:

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. Implementieren Sie sie im Fall von benutzerdefinierten Verben mithilfe einer der methoden der statischen Verbimplementierung, und listen Sie sie unter dem CommandStore-Unterschlüssel auf, wie in diesem Beispiel für ein fiktives VerbName gezeigt:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      CommandStore
                         Shell
                            VerbName
                            command
                               (Default) = notepad.exe %1
    

Hinweis

Diese Methode hat den Vorteil, dass die benutzerdefinierten Verben einmal registriert und wiederverwendet werden können, indem der Verbname unter dem Eintrag "SubCommands" aufgeführt wird. Die Anwendung muss jedoch über die Berechtigung zum Ändern der Registrierung unter HKEY_LOCAL_MACHINE verfügen.

 

Erstellen von Kaskadierenden Menüs mit dem Registrierungseintrag "ExtendedSubCommandsKey"

In Windows 7 und höher können Sie den ExtendedSubCommandKey-Eintrag verwenden, um erweiterte Kaskadierungsmenüs zu erstellen: Kaskadierende Menüs in Kaskadenmenüs.

Der folgende Screenshot ist ein Beispiel für ein erweitertes Kaskadierendes Menü.

Screenshot mit erweitertem Kaskadierungsmenü für Geräte

Da HKEY_CLASSES_ROOT eine Kombination aus HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE ist, können Sie alle benutzerdefinierten Verben unter dem Unterschlüssel HKEY_CURRENT_USER\Softwareklassen\ registrieren. Der Hauptvorteil ist, dass erhöhte Berechtigungen nicht erforderlich sind. Außerdem können andere Dateizuordnungen diese gesamte Gruppe von Verben wiederverwenden, indem sie denselben ExtendedSubCommandsKey-Unterschlüssel angeben. Wenn Sie diese Gruppe von Verben nicht wiederverwenden müssen, können Sie die Verben unter dem übergeordneten Element auflisten, aber sicherstellen, dass der Standardwert des übergeordneten Elements leer ist.

So erstellen Sie ein kaskadierendes Menü mithilfe eines ExtendedSubCommandsKey-Eintrags

  1. Erstellen Sie unter HKEY_CLASSES_ROOT\ProgID-Shell\ einen Unterschlüssel, um Ihr Cascading-Menü darzustellen. In diesem Beispiel geben wir diesem Unterschlüssel den Namen CascadeTest2. Stellen Sie sicher, dass der Standardwert des CascadeTest-Unterschlüssels leer ist und als (Wert nicht festgelegt) angezeigt wird.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. Fügen Sie ihrem CascadeTest-Unterschlüssel einen MUIVerb-Eintrag vom Typ REG_SZ hinzu, und weisen Sie ihm den Text zu, der im Kontextmenü als Name angezeigt wird. In diesem Beispiel weisen wir es "Testkaskadenmenü" zu.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. Fügen Sie unter dem von Ihnen erstellten CascadeTest-Unterschlüssel einen ExtendedSubCommandsKey-Unterschlüssel hinzu, und fügen Sie dann die Dokumentunterbefehle (von REG_SZ Typ) hinzu. Beispiel:

    HKEY_CLASSES_ROOT
       txtfile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Layout
                   Properties
                   Select all
    

    Stellen Sie sicher, dass der Standardwert des Unterschlüssels "Testkaskadenmenü 2 " leer ist und als (Wert nicht festgelegt) angezeigt wird.

  4. Füllen Sie die Unterverbs mit einer der folgenden statischen Verbimplementierungen auf. Beachten Sie, dass der Unterschlüssel "CommandFlags" EXPCMDFLAGS-Werte darstellt. Wenn Sie vor oder nach dem Überlappenden Menüelement ein Trennzeichen hinzufügen möchten, verwenden Sie ECF_SEPARATORBEFORE (0x20) oder ECF_SEPARATORAFTER (0x40). Eine Beschreibung dieser Windows 7- und höher-Flags finden Sie unter "IExplorerCommand::GetFlags". ECF_SEPARATORBEFORE funktioniert nur für die Menüelemente der obersten Ebene. MUIVerb ist vom Typ REG_SZ, und CommandFlags ist vom Typ REG_DWORD.

    HKEY_CLASSES_ROOT
       txtile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Shell
                      cmd1
                         MUIVerb = Notepad
                         command
                            (Default) = %SystemRoot%\system32\notepad.exe %1
                      cmd2
                         MUIVerb = Wordpad
                         CommandFlags = 0x20
                         command
                            (Default) = "C:\Program Files\Windows NT\Accessories\wordpad.exe" %1
    

Der folgende Screenshot ist eine Abbildung der vorherigen Beispiele für Registrierungsschlüsseleinträge.

Screenshot mit einem Beispiel für ein kaskadierendes Menü mit Auswahlmöglichkeiten von Editor und Wordpad

Erstellen von Kaskadierenden Menüs mit der IExplorerCommand-Schnittstelle

Eine weitere Option zum Hinzufügen von Verben zu einem Kaskadierenden Menü ist über "IExplorerCommand::EnumSubCommands". Diese Methode ermöglicht Datenquellen, die ihre Befehlsmodulbefehle über IExplorerCommandProvider bereitstellen, diese Befehle als Verben in einem Kontextmenü zu verwenden. In Windows 7 und höher können Sie die gleiche Verbimplementierung mithilfe von IExplorerCommand bereitstellen wie mit IContextMenu.

Die folgenden beiden Screenshots veranschaulichen die Verwendung von Kaskadierenden Menüs im Ordner "Geräte ".

Screenshot eines Beispiels für ein kaskadierendes Menü im Geräteordner.

Der folgende Screenshot veranschaulicht eine weitere Implementierung eines Kaskadierenden Menüs im Ordner "Geräte ".

Screenshot mit einem Beispiel für ein kaskadierendes Menü im Geräteordner

Hinweis

Da IExplorerCommand nur die In-Process-Aktivierung unterstützt, empfiehlt es sich, von Shell-Datenquellen zu verwenden, die die Implementierung zwischen Befehlen und Kontextmenüs gemeinsam nutzen müssen.

 

Abrufen des dynamischen Verhaltens für statische Verben mithilfe der erweiterten Abfragesyntax

Die erweiterte Abfragesyntax (Advanced Query Syntax, AQS) kann eine Bedingung ausdrücken, die mithilfe von Eigenschaften aus dem Element ausgewertet wird, für das das Verb instanziiert wird. Dieses System funktioniert nur mit schnellen Eigenschaften. Dies sind Eigenschaften, die die Shell-Datenquellenberichte schnell melden, indem nicht SHCOLSTATE_SLOW von IShellFolder2::GetDefaultColumnState zurückgegeben werden.

Windows 7 und höher unterstützen kanonische Werte, die Probleme bei lokalisierten Builds vermeiden. Die folgende kanonische Syntax ist für lokalisierte Builds erforderlich, um diese Windows 7-Erweiterung zu nutzen.

System.StructuredQueryType.Boolean#True

Im folgenden Beispielregistrierungseintrag:

  • Der Wert "AppliesTo " steuert, ob das Verb angezeigt oder ausgeblendet wird.
  • Die DefaultAppliesTo-Wertsteuerelemente, welches Verb die Standardeinstellung ist.
  • Der HasLUAShield-Wert steuert, ob ein UAC-Schild (User Account Control) angezeigt wird.

In diesem Beispiel wird mit dem Standardwert "DefaultAppliesTo " dieses Verb für jede Datei mit dem Wort "exampleText1" im Dateinamen festgelegt. Der Wert "AppliesTo " aktiviert das Verb für eine beliebige Datei mit "exampleText1" im Namen. Der HasLUAShield-Wert zeigt den Schild für Dateien mit "exampleText2" im Namen an.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            DefaultAppliesTo = System.ItemName:"exampleText1"
            HasLUAShield = System.ItemName:"exampleText2"
            AppliesTo = System.ItemName:"exampleText1"

Fügen Sie den Befehlsunterschlüssel und einen Wert hinzu:

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            Command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Sehen Sie sich in der Windows 7-Registrierung HKEY_CLASSES_ROOT\Laufwerk als Beispiel für Bitlocker-Verben an, die den folgenden Ansatz verwenden:

  • AppliesTo = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

Weitere Informationen zu AQS finden Sie unter Advanced Query Syntax.

Veraltet: Zuordnen von Verben zu dynamischen Exchange-Befehlen

DDE ist veraltet; verwenden Sie stattdessen IDropTarget. DDE ist veraltet, da es auf einer Übertragungsfensternachricht basiert, um den DDE-Server zu ermitteln. Ein DDE-Server hängt die Übertragungsfensternachricht und hängt damit DDE-Unterhaltungen für andere Anwendungen. Es ist üblich, dass eine einzelne hängende Anwendung nachfolgende Blockaden über die Benutzeroberfläche hinweg verursacht.

Die IDropTarget-Methode ist robuster und bietet eine bessere Aktivierungsunterstützung, da sie die COM-Aktivierung des Handlers verwendet. Bei mehrfacher Elementauswahl unterliegt IDropTarget nicht den Einschränkungen für die Puffergröße, die sowohl in DDE als auch im CreateProcess zu finden sind. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, das mithilfe der FUNKTION SHCreateShellItemArrayFromDataObject in ein Elementarray konvertiert werden kann. Dies ist einfacher und verliert keine Namespaceinformationen wie beim Konvertieren des Elements in einen Pfad für Befehlszeilen- oder DDE-Protokolle.

Weitere Informationen zu IDropTarget- und Shell-Abfragen für Dateizuordnungsattribute finden Sie unter "Wahrgenommene Typen und Anwendungsregistrierung".

Ausführen von Verbimplementierungsaufgaben

Die folgenden Aufgaben für die Implementierung von Verben sind sowohl für statische als auch für dynamische Verbimplementierungen relevant. Weitere Informationen zu dynamischen Verben finden Sie unter Anpassen eines Kontextmenüs mit dynamischen Verben.

Anpassen des Kontextmenüs für vordefinierte Shellobjekte

Viele vordefinierte Shell-Objekte verfügen über Kontextmenüs, die angepasst werden können. Registrieren Sie den Befehl auf die gleiche Weise wie typische Dateitypen, verwenden Sie jedoch den Namen des vordefinierten Objekts als Dateinamen.

Eine Liste vordefinierter Objekte befindet sich im Abschnitt "Vordefinierte Shell-Objekte " des Erstellens von Shell-Erweiterungshandlern. Diese vordefinierten Shell-Objekte, deren Kontextmenüs durch Hinzufügen von Verben in der Registrierung angepasst werden können, werden in der Tabelle mit dem Wort Verb markiert.

Erweitern eines neuen Untermenüs

Wenn ein Benutzer das Menü "Datei " im Windows-Explorer öffnet, ist einer der angezeigten Befehle "Neu". Wenn Sie diesen Befehl auswählen, wird ein Untermenü angezeigt. Standardmäßig enthält das Untermenü zwei Befehle, Ordner und Verknüpfungen, mit denen Benutzer Unterordner und Verknüpfungen erstellen können. Dieses Untermenü kann erweitert werden, um Dateierstellungsbefehle für jeden Dateityp einzuschließen.

Um dem Untermenü "New " einen Dateierstellungsbefehl hinzuzufügen, müssen die Dateien Ihrer Anwendung über einen zugeordneten Dateityp verfügen. Fügen Sie einen ShellNew-Unterschlüssel unter den Dateinamen ein. Wenn der Befehl "Neu" des Menüs "Datei" ausgewählt ist, fügt die Shell den Dateityp dem Untermenü "Neu" hinzu. Die Anzeigezeichenfolge des Befehls ist die beschreibende Zeichenfolge, die der ProgID des Programms zugewiesen ist.

Weisen Sie dem ShellNew-Unterschlüssel einen oder mehrere Datenwerte zu, um die Dateierstellungsmethode anzugeben. Die verfügbaren Werte sind in der folgenden Tabelle aufgeführt.

ShellNew-Unterschlüsselwert Beschreibung
Get-Help Führt eine Anwendung aus. Dieser REG_SZ Wert gibt den Pfad der auszuführenden Anwendung an. Sie können ihn z. B. so festlegen, dass ein Assistent gestartet wird.
Daten Erstellt eine Datei mit angegebenen Daten. Dieser REG_BINARY Wert gibt die Daten der Datei an. Daten werden ignoriert, wenn entweder NullFile oder FileName angegeben wird.
FileName Erstellt eine Datei, die eine Kopie einer angegebenen Datei ist. Dieser REG_SZ Wert gibt den vollqualifizierten Pfad der zu kopierenden Datei an.
NullFile Erstellt eine leere Datei. NullFile hat keinen Wert zugewiesen. Wenn NullFile angegeben ist, werden die Registrierungswerte "Data " und "FileName " ignoriert.

 

Im folgenden Beispiel für Registrierungsschlüssel und Screenshot wird das Untermenü "New" für den Dateityp ".myp-ms" veranschaulicht. Er verfügt über einen Befehl, "MyProgram Application".

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
         NullFile

Der Screenshot veranschaulicht das Untermenü "Neu ". Wenn ein Benutzer "MyProgram Application" aus dem Untermenü "Neu" auswählt, erstellt die Shell eine Datei namens "New MyProgram Application.myp-ms" und übergibt sie an MyProgram.exe.

Screenshot des Windows-Explorers mit einem neuen Befehl

Erstellen von Drag-and-Drop-Handlern

Das grundlegende Verfahren für die Implementierung eines Drag-and-Drop-Handlers ist identisch mit herkömmlichen Kontextmenühandlern. Kontextmenühandler verwenden jedoch normalerweise nur den IDataObject-Zeiger, der an die IShellExtInit::Initialize-Methode des Handlers übergeben wird, um den Namen des Objekts zu extrahieren. Ein Drag-and-Drop-Handler könnte einen komplexeren Datenhandler implementieren, um das Verhalten des gezogenen Objekts zu ändern.

Wenn ein Benutzer mit der rechten Maustaste auf ein Shell-Objekt klickt, um ein Objekt zu ziehen, wird ein Kontextmenü angezeigt, wenn der Benutzer versucht, das Objekt abzulegen. Der folgende Screenshot veranschaulicht ein typisches Drag-and-Drop-Kontextmenü.

Screenshot des Kontextmenüs

Ein Drag-and-Drop-Handler ist ein Kontextmenühandler, der diesem Kontextmenü Elemente hinzufügen kann. Drag-and-Drop-Handlern werden in der Regel unter dem folgenden Unterschlüssel registriert.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Fügen Sie unter dem DragDropHandlers-Unterschlüssel einen Unterschlüssel hinzu, der für den Drag-and-Drop-Handler benannt ist, und legen Sie den Standardwert des Unterschlüssels auf die Zeichenfolgenform der Klassenbezeichner-GUID (CLSID) des Handlers fest. Im folgenden Beispiel wird der MyDD-Drag-and-Drop-Handler aktiviert.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers
            MyDD
               (Default) = {MyDD CLSID GUID}

Unterdrücken von Verben und Steuern der Sichtbarkeit

Sie können Windows-Richtlinieneinstellungen verwenden, um die Verbsichtbarkeit zu steuern. Verben können durch Richtlinieneinstellungen unterdrückt werden, indem sie einen SuppressPolicy-Wert oder einen SuppressPolicyEx-GUID-Wert zum Registrierungsunterschlüssel des Verbs hinzufügen. Legen Sie den Wert des Unterschlüssels "SuppressionPolicy " auf die Richtlinien-ID fest. Wenn die Richtlinie aktiviert ist, werden das Verb und der zugehörige Kontextmenüeintrag unterdrückt. Mögliche Richtlinien-ID-Werte finden Sie in der RESTRICTIONS-Aufzählung.

Verwenden des Verbauswahlmodells

Registrierungswerte müssen für Verben festgelegt werden, um Situationen zu behandeln, in denen ein Benutzer ein einzelnes Element, mehrere Elemente oder eine Auswahl aus einem Element auswählen kann. Ein Verb erfordert separate Registrierungswerte für jede dieser drei Situationen, die das Verb unterstützt. Die möglichen Werte für das Verbauswahlmodell sind wie folgt:

  • Geben Sie den MultiSelectModel-Wert für alle Verben an. Wenn der MultiSelectModel-Wert nicht angegeben ist, wird er vom Typ der ausgewählten Verbimplementierung abgeleitet. Für COM-basierte Methoden (z. B. DropTarget und ExecuteCommand) wird der Player angenommen, und für die anderen Methoden wird Document angenommen.
  • Geben Sie "Single " für Verben an, die nur eine einzelne Auswahl unterstützen.
  • Geben Sie Player für Verben an, die eine beliebige Anzahl von Elementen unterstützen.
  • Geben Sie Dokument für Verben an, die für jedes Element ein Fenster der obersten Ebene erstellen. Dadurch wird die Anzahl der aktivierten Elemente begrenzt und verhindert, dass Systemressourcen auslaufen, wenn der Benutzer zu viele Fenster öffnet.

Wenn die Anzahl der ausgewählten Elemente nicht mit dem Verbauswahlmodell übereinstimmt oder größer als die in der folgenden Tabelle beschriebenen Standardgrenzwerte ist, wird das Verb nicht angezeigt.

Typ der Verbimplementierung Document Spieler
Vorversion 15 Artikel 100 Elemente
COM 15 Artikel Keine Begrenzung

 

Im Folgenden sehen Sie Beispielregistrierungseinträge mit dem MultiSelectModel-Wert.

HKEY_CLASSES_ROOT
   Folder
      shell
         open
             = MultiSelectModel = Document
HKEY_CLASSES_ROOT
   ProgID
      shell
         verb
             = MultiSelectModel = Single | Document | Player

Verwenden von Elementattributen

Die SFGAO-Flagwerte der Shell-Attribute für ein Element können getestet werden, um zu bestimmen, ob das Verb aktiviert oder deaktiviert werden soll.

Um dieses Attributfeature zu verwenden, fügen Sie die folgenden REG_DWORD Werte unter dem Verb hinzu:

  • Der AttributMask-Wert gibt den SFGAO-Wert der Bitwerte des zu testenden Masken an.
  • Der AttributWert gibt den SFGAO-Wert der getesteten Bits an.
  • Das ImpliedSelectionModel gibt null für Elementverben oder nonzero für Verben im Kontextmenü im Hintergrund an.

Im folgenden Beispielregistrierungseintrag ist "AttributeMask" auf SFGAO_READONLY (0x40000) festgelegt.

HKEY_CLASSES_ROOT
   txtfile
      Shell
         test.verb2
            AttributeMask = 0x40000
            AttributeValue = 0x0
            ImpliedSelectionModel = 0x0
            command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Implementieren von benutzerdefinierten Verben für Ordner über Desktop.ini

In Windows 7 und höher können Sie einem Ordner verben über Desktop.ini hinzufügen. Weitere Informationen zu Desktop.ini Dateien finden Sie unter Anpassen von Ordnern mit Desktop.ini.

Hinweis

Desktop.ini Dateien sollten immer als "System + ausgeblendet" gekennzeichnet werden, damit sie benutzern nicht angezeigt werden.

 

Führen Sie die folgenden Schritte aus, um benutzerdefinierte Verben für Ordner über eine Desktop.ini Datei hinzuzufügen:

  1. Erstellen Sie einen Ordner, der als schreibgeschützt oder System gekennzeichnet ist.

  2. Erstellen Sie eine Desktop.ini Datei, die ein [enthält. ShellClassInfo] DirectoryClass=Folder ProgID.

  3. Erstellen Sie in der Registrierung HKEY_CLASSES_ROOT\Folder ProgID mit dem Wert CanUseForDirectory. Der Wert CanUseForDirectory vermeidet den Missbrauch von ProgIDs, die nicht an der Implementierung von benutzerdefinierten Verben für Ordner über Desktop.ini beteiligt sind.

  4. Fügen Sie Verben unter dem Unterschlüssel "OrdnerProgID" hinzu, z. B.:

    HKEY_CLASSES_ROOT
       CustomFolderType
          Shell
             MyVerb
                command
                   (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
    

Hinweis

Bei diesen Verben kann es sich um das Standardverb handeln. In diesem Fall wird durch Doppelklicken auf den Ordner das Verb aktiviert.

 

Best Practices für Kontextmenühandler und Mehrfachauswahlverben

Auswählen eines statischen oder dynamischen Verbs für das Kontextmenü

Anpassen eines Kontextmenüs mit dynamischen Verben

Kontextmenüs und Kontextmenühandler

Verben und Dateizuordnungen

Kontextmenüreferenz