Erstellen von Kontextmenühandlern

Kontextmenühandler, die auch als Kontextmenühandler oder Verbhandler bezeichnet werden, sind ein Typ von Dateityphandler. Diese Handler können auf eine Weise veranlasst werden, die dazu führt, dass sie in ihrem eigenen Prozess, im Explorer oder in anderen Prozessen von Drittanbietern geladen werden. Gehen Sie beim Erstellen von In-Process-Handlern mit Vorsicht vor, da sie dem Prozess schaden können, der sie lädt.

Hinweis

Bei der Registrierung von Handlern, die im Kontext von 32-Bit-Anwendungen funktionieren, gibt es besondere Überlegungen für 64-Bit-basierte Versionen von Windows: Wenn sie im Kontext einer Anwendung mit unterschiedlicher Bitität aufgerufen werden, leitet das WOW64-Subsystem den Dateisystemzugriff auf einige Pfade um. Wenn ihr .exe-Handler in einem dieser Pfade gespeichert ist, kann in diesem Kontext nicht darauf zugegriffen werden. Um dieses Problem zu umzuleiten, speichern Sie ihre .exe entweder in einem Pfad, der nicht umgeleitet wird, oder speichern Sie eine Stubversion Ihrer .exe, die die echte Version startet.

Dieses Thema ist wie folgt organisiert:

Kanonische Verben

Anwendungen sind im Allgemeinen dafür verantwortlich, lokalisierte Anzeigezeichenfolgen für die von ihnen definierten Verben zur Verfügung zu stellen. Um jedoch ein gewisses Maß an 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 nie angezeigt und kann mit jeder beliebigen Benutzeroberflächensprache verwendet werden. Das System verwendet den kanonischen Namen, um automatisch eine ordnungsgemäß lokalisierte Anzeigezeichenfolge zu generieren. Beispielsweise ist die Anzeigezeichenfolge des geöffneten Verbs auf Einem englischen System auf Öffnen 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 Gibt die Datei aus.
Printto Ermöglicht es dem Benutzer, eine Datei zu drucken, indem sie auf ein Druckerobjekt gezogen wird.
Erkunden Öffnet Windows Explorer mit dem ausgewählten Ordner.
Eigenschaften Öffnet das Eigenschaftenblatt des Objekts.

Hinweis

Das Printto-Verb ist ebenfalls kanonisch, wird jedoch nie angezeigt. Dadurch kann der Benutzer eine Datei drucken, indem er sie auf ein Druckerobjekt zieht.

Kontextmenühandler können ihre eigenen kanonischen Verben über IContextMenu::GetCommandString mit GCS _ VERBW oder GCS _ VERBA bereitstellen. Das System verwendet die kanonischen Verben als zweiten Parameter (lpOperation), der an ShellExecuteübergeben wird, und ist die CMINVOKECOMMANDINFO. LpVerb-Member, der an die IContextMenu::InvokeCommand-Methode übergeben wird.

Erweiterte Verben

Wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt, werden im Kontextmenü die Standardverben angezeigt. Möglicherweise möchten Sie Befehle in einigen Kontextmenüs hinzufügen und unterstützen, die nicht in jedem Kontextmenü angezeigt werden. Sie können beispielsweise Befehle verwenden, 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 durch ihre Registrierung von normalen Verben. Um Zugriff auf erweiterte Verben zu erhalten, 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 zugeordneten Befehle werden nur angezeigt, wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt und gleichzeitig 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. Dem Wert sollten keine Daten zugeordnet sein.

Nur programmgesteuerter Zugriff

Diese Verben werden nie in einem Kontextmenü angezeigt. Sie können auf diese zugreifen, indem Sie ShellExecuteEx verwenden 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 den REG _ SZ-Wert "ProgrammaticAccessOnly" hinzu. Dem Wert sollten keine Daten zugeordnet sein.

Sie können die Registrierung verwenden, um ein oder mehrere erweiterte Verben zu definieren. Die zugeordneten Befehle werden nur angezeigt, wenn der Benutzer mit der rechten Maustaste auf ein Objekt klickt und gleichzeitig 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. Dem Wert sollten keine Daten zugeordnet sein.

Anpassen eines Kontextmenüs mit statischen Verben

Nach dem Auswählen eines statischen oder dynamischen Verbs für das Kontextmenü 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 unterhalb des Unterschlüssels 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 in der Bereitstellung eines Verbs für die Shell, das beim Aufruf der ShellExecuteEx-Funktion verwendet werden kann, aber es wird kein Verb angegeben. Die Shell wählt nicht unbedingt das Standardverb aus, wenn ShellExecuteEx auf diese 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 Verb reihenfolge angegeben ist
  3. Das Verb "Öffnen"
  4. Das Verb "Öffnen mit"

Wenn keines der aufgeführten 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. Für jeden dieser Unterschlüssel muss ein REG _ SZ-Wert auf die Anzeigezeichenfolge (lokalisierte Zeichenfolge) des Verbs festgelegt sein. Erstellen Sie für jeden Verbunterschlüssel einen Befehlsunterschlüssel, bei dem der Standardwert für die Aktivierung der Elemente auf die Befehlszeile festgelegt ist. Bei kanonischen Verben wie Open und Print können Sie die Anzeigezeichenfolge weglassen, da das System automatisch eine ordnungsgemäß lokalisierte Zeichenfolge anzeigt. Wenn Sie bei nichtcanonischen Verben die Anzeigezeichenfolge weglassen, wird die Verbzeichenfolge angezeigt.

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 Printto-Verb wird nicht im Kontextmenü angezeigt. Die Aufnahme in die Registrierung ermöglicht es dem Benutzer jedoch, Dateien zu drucken, indem 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 in Übereinstimmung mit den oben genannten Registrierungseinträgen. Dieses Kontextmenü enthält die Verben Öffnen, Do It und Drucken mit Do It als Standardverb.

Screenshot des Kontextmenüs "Do it default verb"

Aktivieren des Handlers mithilfe der IDropTarget-Schnittstelle

dynamische Daten Exchange (DDE) ist veraltet. Verwenden Sie stattdessen IDropTarget. IDropTarget ist robuster und bietet eine bessere Aktivierungsunterstützung, da die COM-Aktivierung des Handlers verwendet wird. Im Fall der Auswahl mehrerer Elemente unterliegt IDropTarget nicht den Puffergrößenbeschränkungen, die sowohl in DDE als auch im CreateProcess-Elementvorhanden sind. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, das mithilfe der SHCreateShellItemArrayFromDataObject-Funktion in ein Elementarray konvertiert werden kann. Dies ist einfacher und geht nicht wie beim Konvertieren des Elements in einen Pfad für Befehlszeilen- oder DDE-Protokolle verloren.

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ü nach ihrer Enumeration sortiert. -Enumeration 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 von 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 direkt darunter in der angegebenen Reihenfolge angezeigt.

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

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

Auf ähnliche Weise erzeugt der folgende Registrierungseintrag Kontextmenüverben in der folgenden Reihenfolge:

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

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

Das folgende Registrierungsattribut kann verwendet werden, um ein Verb am oberen oder unteren Rand des Menüs zu platzieren. Wenn es mehrere Verben gibt, die dieses Attribut angeben, erhält das letzte, das dies tun soll, Priorität:

Position=Top | Bottom 

Erstellen statischer kaskadierender Menüs

In Windows 7 und höher wird die Implementierung von kaskadierenden Menüs über Registrierungseinstellungen unterstützt. Vor Windows 7 war die Erstellung von kaskadierenden Menüs nur über 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 zeigt ein Beispiel für ein kaskadierendes Menü.

Screenshot eines Beispiels 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 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 ENTRYVerb-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 ihm "Test Cascade Menu" 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, dem die Liste der Verben, die im Menü angezeigt werden sollen, durch Semikolons getrennt in der Reihenfolge der Darstellung zugewiesen wird. 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 bei benutzerdefinierten Verben diese mithilfe einer der statischen Verbimplementierungen, und listen Sie sie unter dem CommandStore-Unterschlüssel auf, wie in diesem Beispiel für ein fiktives Verb 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 aufgelistet 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 Eintrag ExtendedSubCommandKey verwenden, um erweiterte kaskadierende Menüs zu erstellen: kaskadierende Menüs in kaskadierenden Menüs.

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

Screenshot des erweiterten Kaskadierungsmenüs 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 \ Software \ Classes registrieren. Der Hauptvorteil besteht darin, dass keine erhöhten Berechtigungen erforderlich sind. Darüber hinaus können andere Dateizuordnungen diesen gesamten Satz von Verben wiederverwenden, indem derselbe ExtendedSubCommandsKey-Unterschlüssel angegeben wird. Wenn Sie diesen Satz 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ü mit einem ExtendedSubCommandsKey-Eintrag

  1. Erstellen Sie unter HKEY _ CLASSES _ ROOT \ ProgID shell einen \ Unterschlüssel, 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 ENTRYVerb-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 ihm "Test Cascade Menu" zu.

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. Fügen Sie unter dem erstellten CascadeTest-Unterschlüssel einen Unterschlüssel ExtendedSubCommandsKey hinzu, und fügen Sie dann die Dokumentunterkommands (vom 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 Test Cascade Menu 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 CommandFlags-Unterschlüssel EXPCMDFLAGS-Werte darstellt. Wenn Sie vor oder nach dem kaskadierten Menüelement ein Trennzeichen hinzufügen möchten, verwenden Sie ECF _ SEPARATORBEFORE (0x20) oder ECF _ SEPARATORAFTER (0x40). Eine Beschreibung dieser flags Windows 7 und höher finden Sie unter IExplorerCommand::GetFlags. ECF _ SEPARATORBEFORE funktioniert nur für die Menüelemente der obersten Ebene. CABVerb 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 zeigt die vorherigen Beispiele für Registrierungsschlüsseleinträge.

Screenshot eines Beispiels für ein kaskadierendes Menü mit Auswahlmöglichkeiten für 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 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 mithilfe von IExplorerCommand die gleiche Verbimplementierungen wie mit IContextMenubereitstellen.

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

Screenshot: Beispiel für ein kaskadierendes Menü im Ordner "devices"

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

Screenshot eines Beispiels für ein kaskadierendes Menü im Ordner "devices"

Hinweis

Da IExplorerCommand nur die Prozessaktivierung unterstützt, wird die Verwendung durch Shell-Datenquellen empfohlen, die die Implementierung zwischen Befehlen und Kontextmenüs freigeben müssen.

Abrufen von dynamischem Verhalten für statische Verben mithilfe der erweiterten 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-Datenquelle als schnell meldet, indem sie "SHCOLSTATE _ SLOW" von IShellFolder2::GetDefaultColumnStatenicht zurückgibt.

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 nutzen zu können.

System.StructuredQueryType.Boolean#True

Im folgenden Beispielregistrierungseintrag:

  • Der AppliesTo-Wert steuert, ob das Verb angezeigt oder ausgeblendet wird.
  • Der DefaultAppliesTo-Wert steuert, welches Verb der Standardwert ist.
  • Der HasLUAShield-Wert steuert, ob ein UAC-Shield (User Account Control) angezeigt wird.

In diesem Beispiel macht der DefaultAppliesTo-Wert dieses Verb zum Standard für jede Datei mit dem Wort "exampleText1" im Dateinamen. Der AppliesTo-Wert aktiviert das Verb für jede Datei mit "exampleText1" im Namen. Der HasLUAShield-Wert zeigt den Shield 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

In der Registrierung Windows 7 finden Sie unter HKEY _ CLASSES ROOT _ drive \ ein Beispiel für BitLocker-Verben, die den folgenden Ansatz verwenden:

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

Weitere Informationen zu AQS finden Sie unter Erweiterte Abfragesyntax.

Veraltet: Zuordnen von Verben zu dynamische Daten Exchange Befehlen

DDE ist veraltet. Verwenden Sie stattdessen IDropTarget. DDE ist veraltet, da es auf einer Broadcastfensternachricht basiert, um den DDE-Server zu finden. Ein DDE-Server hängt die Broadcastfensternachricht und hängt daher DDE-Konversationen für andere Anwendungen. Es ist üblich, dass eine einzelne hängende Anwendung nachfolgende Hängen in der gesamten Benutzererfahrung verursacht.

Die IDropTarget-Methode ist stabiler und bietet eine bessere Aktivierungsunterstützung, da sie die COM-Aktivierung des Handlers verwendet. Bei der Auswahl mehrerer Elemente unterliegt IDropTarget nicht den Puffergrößeneinschränkungen in DDE und CreateProcess. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, das mithilfe der SHCreateShellItemArrayFromDataObject-Funktion in ein Elementarray konvertiert werden kann. Dies ist einfacher, und namespace-Informationen gehen nicht verloren, wenn das Element in einen Pfad für Befehlszeilen- oder DDE-Protokolle konvertiert wird.

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

Abschließen von Verbimplementierungsaufgaben

Die folgenden Aufgaben zum Implementieren 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 Shellobjekte 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 Dateitypnamen.

Eine Liste vordefinierter Objekte finden Sie im Abschnitt Predefined Shell Objects (Vordefinierte Shellobjekte) von Creating Shell Extension Handlers (Erstellen von Shellerweiterungshandlern). Die vordefinierten Shellobjekte, 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, wird einer der angezeigten Befehle New (Neu) angezeigt. Wenn Sie diesen Befehl auswählen, wird ein Untermenü angezeigt. Standardmäßig enthält das Untermenü die beiden Befehle Ordner und Verknüpfung, mit denen Benutzer Unterordner und Verknüpfungen erstellen können. Dieses Untermenü kann um Dateierstellungsbefehle für jeden Dateityp erweitert werden.

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

Um die Dateierstellungsmethode anzugeben, weisen Sie dem Unterschlüssel ShellNeu einen oder mehrere Datenwerte zu. Die verfügbaren Werte sind in der folgenden Tabelle aufgeführt.

ShellNeuer Unterschlüsselwert BESCHREIBUNG
Befehl Führt eine Anwendung aus. Dieser REG _ SZ-Wert gibt den Pfad der auszuführenden Anwendung an. Sie können z. B. 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 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 wurde kein Wert zugewiesen. Wenn NullFile angegeben wird, werden die Registrierungswerte Data und FileName ignoriert.

Das folgende Registrierungsschlüsselbeispiel und der Screenshot veranschaulichen das Untermenü New für den Dateityp .myp-ms. Sie verfügt über den Befehl MyProgram Application.

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

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

Screenshot des Windows-Explorers mit einem neuen Befehl "myprogram application" im Untermenü "new"

Erstellen von Drag & Drop-Handlern

Das grundlegende Verfahren zum Implementieren eines Drag & Drop-Handlers ist dasselbe wie bei herkömmlichen Kontextmenühandlern. Allerdings verwenden Kontextmenühandler normalerweise nur den IDataObject-Zeiger, der an die IShellExtInit::Initialize-Methode des Handlers übergeben wird, um den Namen des Objekts zu extrahieren. Ein Drag & 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 zu löschen. Der folgende Screenshot veranschaulicht ein typisches Drag & Drop-Kontextmenü.

Screenshot des Drag & Drop-Kontextmenüs

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Add a subkey under the DragDropHandlers subkey named for the drag-and-drop handler, and set the subkey's default value to the string form of the handler's class identifier (CLSID) GUID. The following example enables the MyDD drag-and-drop handler.

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

Unterdrücken von Verben und Steuern der Sichtbarkeit

Sie können die Sichtbarkeit Windows Verben mithilfe von Richtlinieneinstellungen steuern. Verben können durch Richtlinieneinstellungen unterdrückt werden, indem dem Registrierungsunterschlüssel des Verbs ein SuppressionPolicy-Wert oder ein SuppressionPolicyEx-GUID-Wert hinzugefügt wird. 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-Enumeration.

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 lauten wie folgt:

  • Geben Sie den MultiSelectModel-Wert für alle Verben an. Wenn der MultiSelectModel-Wert nicht angegeben ist, wird er von dem Typ der von Ihnen gewählten Verbimplementierung abgeleitet. Für COM-basierte Methoden (z. B. DropTarget und ExecuteCommand) wird der Player und für die anderen Methoden 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 ein Fenster der obersten Ebene für jedes Element erstellen. Dadurch wird die Anzahl der aktivierten Elemente beschränkt, und es wird verhindert, dass die Systemressourcen knapp werden, wenn der Benutzer zu viele Fenster öffnet.

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

Typ der Verbimplementierung Dokument Player
Vorversion 15 Elemente 100 Elemente
COM 15 Elemente Keine Begrenzung

Im Folgenden finden Sie Beispielregistrierungseinträge, die den MultiSelectModel-Wert verwenden.

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 Shellattribute 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 AttributeMask-Wert gibt den SFGAO-Wert der Bitwerte der Maske an, mit der der Test durchgeführt werden soll.
  • Der AttributeValue-Wert gibt den SFGAO-Wert der getesteten Bits an.
  • ImpliedSelectionModel gibt 0 (null) für Elementverben oder ungleich 0 (null) für Verben im Kontextmenü im Hintergrund an.

Im folgenden Beispielregistrierungseintrag wird 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 Desktop.ini

In Windows 7 und höher können Sie einem Ordner verbs über Desktop.ini. Weitere Informationen zum Desktop.ini finden Sie unter Anpassen von Ordnern mit Desktop.ini.

Hinweis

Desktop.ini Dateien sollten immer als System Hidden (System ausgeblendet) markiert werden, damit sie benutzern + nicht angezeigt werden.

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

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

  2. Erstellen Sie 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 so festgelegt sind, dass sie nicht an der Implementierung benutzerdefinierter Verben für Ordner über Desktop.ini.

  4. Fügen Sie Verben unter dem Ordner-ProgID-Unterschlüssel hinzu, z. B.:

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

Hinweis

Diese Verben können das Standardverb sein. In diesem Fall wird das Verb durch Doppelklicken auf den Ordner aktiviert.

Bewährte Methoden 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