Freigeben über


Erstellen von Kontextmenühandlern

Kontextmenühandler, auch als Shortcut-Menühandler oder verb-Handler bezeichnet, sind Handler für Dateitypen. 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. Dem Benutzer wird niemals ein kanonisches verb Element 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 geöffnete verbAnzeigezeichenfolge auf "Open" in einem englischen System und auf das deutsche Äquivalent auf einem deutschen System festgelegt.

Kanonisch verb Beschreibung
Open Öffnet die Datei oder den Ordner.
Opennew Öffnet die Datei oder den Ordner in einem neuen Fenster.
Print Druckt die Datei.
Printto Ermöglicht es dem Benutzer, eine Datei zu drucken, indem er sie auf ein Druckerobjekt zieht.
Explore Öffnet Windows Explorer mit ausgewähltem Ordner.
Properties Öffnet das Eigenschaftenblatt des Objekts.

Hinweis

Der Printtoverb 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 einen verb als erweitert zu definieren, fügen Sie dem Unterschlüssel des verb einen REG_SZ-Wert vom Typ "extended" 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 einen verb nur für programmgesteuerten Zugriff zu definieren, fügen Sie dem Unterschlüssel einen "ProgrammaticAccessOnly" REG_SZ Wert hinzu verb. 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 von verb 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 Kontextmenü ausgewählt haben, können Sie das Kontextmenü für einen Dateityp erweitern, indem Sie eine statische verb Datei 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 einen Standardwert verb für den Dateityp definieren, indem Sie ihn zum Standardwert des Shell Unterschlüssels machen.

Der Standard verb wird zuerst im Shortcut-Menü angezeigt. Der Zweck besteht darin, dem Shell ein verb bereitzustellen, das es verwenden kann, wenn die ShellExecuteEx-Funktion aufgerufen wird, aber keine verb angegeben wird. Die Shell Standardeinstellung verb wird nicht unbedingt ausgewählt, wenn ShellExecuteEx in dieser Weise verwendet wird.

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

  1. Standardeinstellung verb
  2. Der erste verb im Register, wenn die verb Reihenfolge angegeben wurde
  3. Das Openverb
  4. Das Open Withverb

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

Erstellen Sie einen Unterschlüssel für jeden verb, den Sie unter dem Shell Unterschlüssel hinzufügen möchten. Jeder dieser Unterschlüssel muss einen REG_SZ Wert auf die verbAnzeigezeichenfolge (lokalisierte Zeichenfolge) festlegen. Erstellen Sie für jeden verb Unterschlüssel einen Befehlsunterschlüssel mit dem Standardwert, der auf die Befehlszeile zum Aktivieren der Elemente festgelegt ist. Bei kanonischen Verben, wie Open und Print, können Sie die Anzeigezeichenfolge weglassen, da das System automatisch eine ordnungsgemäß lokalisierte Zeichenfolge anzeigt. Bei nichtkanonischen Verben wird die Zeichenfolge verb angezeigt, wenn Sie die Anzeigezeichenfolge weglassen.

Beachten Sie im folgenden Registrierungsbeispiel Folgendes:

  • Da Doit kein kanonischer verbIst, wird ihm ein Anzeigename zugewiesen, der durch Drücken der D-TASTE ausgewählt werden kann.
  • Die Option "Drucken"verb 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 jeden verbwird 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 Open, Do Itund Print Verben im Menü mit Do It der Standardeinstellung verb.

Screenshot des 'Do It'-Standardkontextmenüsverb

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 eine 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 einen Unterschlüssel unter HKEY_CLASSES_ROOT\ProgID\shell , um Ihr Kaskadierendes 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 bei benutzerdefinierten Verben mithilfe einer der statischen Implementierungsmethoden, und listen Sie sie unter dem CommandStore-Unterschlüssel auf, wie in diesem Beispiel für einen fiktiven verbverbVerbName 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 verb Name 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_USERSoftwareklassen\\ 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 einen Unterschlüssel unter HKEY_CLASSES_ROOT\ProgID\shell , um Ihr Kaskadierendes 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 mithilfe einer der folgenden statischen verb Implementierungen 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 dieselbe verb Implementierung mit IExplorerCommand bereitstellen, wie sie mit IContextMenu möglich ist.

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, wird die Verwendung von Shell Datenquellen empfohlen, die die Implementierung zwischen Befehlen und Kontextmenüs teilen 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 die verb Instanziierung erfolgt. Dieses System funktioniert nur mit schnellen Eigenschaften. Dies sind Eigenschaften, die die Shell Datenquelle als schnell meldet, indem SHCOLSTATE_SLOW nicht von IShellFolder2::GetDefaultColumnState zurückgegeben wird.

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 AppliesTo-Wert steuert, ob verb angezeigt oder ausgeblendet wird.
  • Der Wert von "DefaultAppliesTo" steuert, welcher verb der Standard ist.
  • Der HasLUAShield-Wert steuert, ob ein UAC-Schild (User Account Control) angezeigt wird.

In diesem Beispiel legt der Wert DefaultAppliesTo den Standard für jede Datei mit dem Wort "exampleText1" im Dateinamen fest. Der Wert "AppliesTo" ermöglicht die verb für jede 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".

Abschließen von Verb Implementierungsaufgaben

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

Anpassen des Kontextmenüs für vordefinierte Shell Objekte

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 Verbmarkiert.

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, wird der Shell Dateityp dem Untermenü "Neu" hinzugefügt. 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.
Dateiname Erstellt eine Datei, die eine Kopie einer angegebenen Datei ist. Dieser REG_SZ Wert gibt den vollqualifizierten Pfad der zu kopierenden Datei an.
Null-Datei 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ü " New " auswählt, erstellt die Shell Datei " 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 es zu ziehen, wird ein Kontextmenü angezeigt, sobald 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 Sichtbarkeit zu steuern verb . Verben können durch Richtlinieneinstellungen unterdrückt werden, indem man einen SuppressionPolicy-Wert oder einen SuppressionPolicyEx-GUID-Wert zum verbRegistrierungsunterschlüssel hinzufügt. Legen Sie den Wert des Unterschlüssels "SuppressionPolicy " auf die Richtlinien-ID fest. Wenn die Richtlinie aktiviert ist, werden der verb und der zugehörige Kontextmenüeintrag unterdrückt. Mögliche Richtlinien-ID-Werte finden Sie in der RESTRICTIONS-Aufzählung.

Verwenden des Verb Auswahlmodells

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. Für die drei Situationen, die verb unterstützt, sind separate Registry-Werte erforderlich. Die möglichen Werte für das verb Auswahlmodell 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 verb ausgewählten Implementierung 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 verb Auswahlmodell übereinstimmt oder größer als die in der folgenden Tabelle beschriebenen Standardgrenzwerte ist, wird die verb Option nicht angezeigt.

Implementierungstyp verb Dokument 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 die verb Option aktiviert oder deaktiviert werden soll.

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

  • 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 + 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 den Standardwert verbhandeln. In diesem Fall wird durch Doppelklicken auf den Ordner die verbOption aktiviert.

 

Best Practices für Kontextmenühandler und Mehrfachauswahlverben

Auswählen eines statischen oder dynamischen Verb Kontextmenüs

Anpassen eines Kontextmenüs mithilfe von dynamischen Verben

Kontextmenüs und Kontextmenühandler

Verben und Dateizuordnungen

Kontextmenüreferenz