Erstellen von Kontextmenühandlern

Kontextmenühandler, auch als Kontextmenühandler oder Verbhandler bezeichnet, sind ein Typ von Dateityphandler. Diese Handler können auf eine Weise ausgelöst werden, die dazu führt, dass sie in ihrem eigenen Prozess, im Explorer oder in anderen Drittanbieterprozessen geladen werden. Achten Sie beim Erstellen von Prozesshandlern 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 es im Kontext einer Anwendung mit unterschiedlicher Bitanzahl aufgerufen wird, leitet das WOW64-Subsystem den Dateisystemzugriff auf einige Pfade um. Wenn Der .exe-Handler in einem dieser Pfade gespeichert ist, kann in diesem Kontext nicht darauf zugegriffen werden. Speichern Sie daher entweder Ihre .exe 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 für die Bereitstellung lokalisierter Anzeigezeichenfolgen für die von ihnen definierten Verben verantwortlich. Um jedoch ein gewisses Maß an Sprachunabhängigkeit zu gewährleisten, definiert das System einen Standardsatz von häufig verwendeten 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. Für instance wird die Anzeigezeichenfolge des geöffneten Verbs auf einem englischen System auf Öffnen und auf die deutsche Entsprechung 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.
Drucken auf Ermöglicht dem Benutzer das Drucken einer Datei durch Ziehen auf ein Druckerobjekt.
Erkunden Öffnet Windows Explorer mit ausgewähltem Ordner.
Eigenschaften Öffnet das Eigenschaftenblatt des Objekts.

Hinweis

Das Verb Printto ist ebenfalls kanonisch, wird aber nie angezeigt. Seine Einbindung ermöglicht es dem Benutzer, eine Datei zu drucken, indem er sie in 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 , das 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 für einige 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 bestimmt sind. Aus diesem Grund können Sie auch ein oder mehrere erweiterte Verben definieren. Diese Verben ähneln normalen Verben, unterscheiden sich jedoch durch die Art und Weise, wie sie registriert sind, 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 zugehörigen 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.

Programmgesteuerte Zugriffsverben

Diese Verben werden nie in einem Kontextmenü angezeigt. Auf diese kann mithilfe von ShellExecuteEx zugegriffen werden und das LpVerb-Feld des pExecInfo-Parameters (ein SHELLEXECUTEINFO-Objekt ) angegeben werden. Um ein Verb nur als programmgesteuerten Zugriff zu definieren, fügen Sie dem Unterschlüssel des Verbs einen 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 zugehörigen 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 mithilfe statischer Verben

Nachdem Sie ein statisches oder dynamisches Verb für Das 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 hierzu 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 ihn zum Standardwert des Shell-Unterschlüssels machen.

Das Standardverb wird zuerst im Kontextmenü angezeigt. Ihr 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 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 Verbreihenfolge 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. Jeder dieser Unterschlüssel muss über einen REG_SZ Wert verfügen, der auf die Anzeigezeichenfolge des Verbs (lokalisierte Zeichenfolge) festgelegt ist. Erstellen Sie für jeden Verbunterschlüssel einen Befehlsunterschlüssel mit dem Standardwert, der auf die Befehlszeile festgelegt ist, um die Elemente zu aktivieren. Bei kanonischen Verben, z. B . Öffnen und Drucken, 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 Taste D ausgewählt werden kann.
  • Das Verb Drucken zu wird nicht im Kontextmenü angezeigt. Die Aufnahme in die Registrierung ermöglicht es dem Benutzer jedoch, Dateien zu drucken, indem er sie auf einem Druckersymbol abgibt.
  • 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 obigen Registrierungseinträgen. Dieses Kontextmenü enthält die Verben Öffnen, Do It und Print im Menü mit Do It als Standardverb.

Screenshot des Kontextmenüs

Aktivieren Des Handlers mithilfe der IDropTarget-Schnittstelle

Der dynamische Datenaustausch (Dynamic Data 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. Bei der Auswahl mehrerer Elemente unterliegt IDropTarget nicht den Puffergrößeneinschränkungen, die sowohl in DDE als auch in CreateProcess zu finden sind. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, die mithilfe der SHCreateShellItemArrayFromDataObject-Funktion in ein Elementarray konvertiert werden können. Dies ist einfacher, und es werden keine Namespaceinformationen verloren, wie dies geschieht, wenn das Element in einen Pfad für Befehlszeilen- oder DDE-Protokolle konvertiert wird.

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

Angeben der Position und Reihenfolge statischer Verben

Normalerweise werden Verben in einem Kontextmenü basierend auf ihrer Aufzählung sortiert. Die Enumeration basiert zunächst 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 Sie den Standardwert des Shell-Unterschlüssels für den Zuordnungseintrag angeben. 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

Ebenso 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 Registrierungsattribute kann verwendet werden, um ein Verb oben oder unten im Menü zu platzieren. Wenn es mehrere Verben gibt, die dieses Attribut angeben, erhält das letzte Attribut Priorität:

Position=Top | Bottom 

Erstellen statischer kaskadierender Menüs

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

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

Erstellen kaskadierender Menüs mit dem Registrierungseintrag "SubCommands"

In Windows 7 und höher können Sie den Eintrag SubCommands verwenden, um kaskadierende Menüs mit dem folgenden Verfahren zu erstellen.

So erstellen Sie mithilfe des Eintrags SubCommands ein kaskadierendes Menü

  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 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 als Name im Kontextmenü angezeigt wird. In diesem Beispiel weisen wir ihr "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 durch Semikolon getrennte Liste der Verben zugewiesen ist, 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 bei benutzerdefinierten Verben diese mithilfe einer der Implementierungsmethoden für statische Verben, und listen Sie sie unter dem Unterschlüssel CommandStore 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 aufgeführt wird. Es erfordert jedoch, dass die Anwendung über die Berechtigung zum Ändern der Registrierung unter HKEY_LOCAL_MACHINE verfügt.

 

Erstellen kaskadierender 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: Erweitertes kaskadierendes Menü 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 Standard Vorteil ist, dass keine erhöhten Berechtigungen erforderlich sind. Außerdem können andere Dateizuordnungen diesen gesamten Verbensatz wiederverwenden, indem sie denselben ExtendedSubCommandsKey-Unterschlüssel angeben. Wenn Sie diesen Verbensatz nicht wiederverwenden müssen, können Sie die Verben unter dem übergeordneten Element auflisten, aber sicherstellen, dass der Standardwert des übergeordneten Objekts 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 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 als Name im Kontextmenü angezeigt wird. In diesem Beispiel weisen wir ihr "Test cascade menu" 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 ( REG_SZ Typs) hinzu. Zum 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 Subverbs mit einer der folgenden statischen Verbimplementierungen auf. Beachten Sie, dass der CommandFlags-Unterschlüssel EXPCMDFLAGS-Werte darstellt. Wenn Sie vor oder nach dem Kaskadenmenü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 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üsseleingaben.

Screenshot eines Beispiels für ein kaskadierendes Menü mit Optionen für Editor und Wordpad

Erstellen kaskadierender Menüs mit der IExplorerCommand-Schnittstelle

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

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

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

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

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

Hinweis

Da IExplorerCommand nur die Prozessaktivierung unterstützt, wird es für die Verwendung durch Shell-Datenquellen empfohlen, die die Implementierung zwischen Befehlen und Kontextmenüs gemeinsam nutzen 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 des Elements ausgewertet wird, für das das Verb instanziiert wird. Dieses System funktioniert nur mit schnellen Eigenschaften. Dies sind Eigenschaften, die die Shell-Datenquelle so schnell meldet, dass SHCOLSTATE_SLOW aus IShellFolder2::GetDefaultColumnState nicht 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 nutzen zu können.

System.StructuredQueryType.Boolean#True

Im folgenden Beispielregistrierungseintrag:

  • Der Wert "AppliesTo " steuert, ob das Verb angezeigt oder ausgeblendet wird.
  • Der DefaultAppliesTo-Wert steuert, welches Verb der Standardwert ist.
  • Der HasLUAShield-Wert steuert, ob ein UAC-Schutzschild (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 Wert AppliesTo aktiviert das Verb für jede Datei mit "exampleText1" im Namen. Der HasLUAShield-Wert zeigt das 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 Unterschlüssel Command und einen Wert hinzu:

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

In der Windows 7-Registrierung finden Sie HKEY_CLASSES_ROOT\Laufwerk als 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 dynamischen Datenaustauschbefehlen

DDE ist veraltet; verwenden Sie stattdessen IDropTarget . DDE ist veraltet, da es auf einer Broadcastfenstermeldung basiert, um den DDE-Server zu ermitteln. Ein DDE-Server hängt die Nachricht des Broadcastfensters ab und hängt DDE-Unterhaltungen für andere Anwendungen ab. Es ist üblich, dass eine einzelne hängende Anwendung nachfolgende Hänger in der gesamten Benutzerumgebung verursacht.

Die IDropTarget-Methode ist robuster 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, die sowohl in DDE als auch in CreateProcess zu finden sind. Außerdem werden Elemente als Datenobjekt an die Anwendung übergeben, die mithilfe der SHCreateShellItemArrayFromDataObject-Funktion in ein Elementarray konvertiert werden können. Dies ist einfacher, und es werden keine Namespaceinformationen verloren, wie dies geschieht, wenn das Element in einen Pfad für Befehlszeilen- oder DDE-Protokolle konvertiert wird.

Weitere Informationen zu IDropTarget - und Shellabfragen 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 mithilfe dynamischer 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, aber verwenden Sie den Namen des vordefinierten Objekts als Dateinamennamen.

Eine Liste vordefinierter Objekte befindet sich im Abschnitt Vordefinierte Shellobjekte unter Erstellen von Shellerweiterungshandlern. Die 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 gekennzeichnet.

Erweitern eines neuen Untermenüs

Wenn ein Benutzer das Menü Datei in 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üpfung, 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ü "Neu " einen Befehl zum Erstellen von Dateien hinzuzufügen, müssen die Dateien Ihrer Anwendung einen zugeordneten Dateityp aufweisen. Fügen Sie einen ShellNew-Unterschlüssel unter den Dateinamen ein. Wenn im Menü Datei der Befehl Neu 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.

Um die Dateierstellungsmethode anzugeben, weisen Sie dem Unterschlüssel ShellNew 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önnten beispielsweise festlegen, dass ein Assistent gestartet wird.
Daten Erstellt eine Datei, die die angegebenen Daten enthält. Dieser REG_BINARY Wert gibt die Daten der Datei an. Daten werden ignoriert, wenn entweder NullFile oder FileName angegeben ist.
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.

 

Das folgende Registrierungsschlüsselbeispiel und screenshot veranschaulichen das Untermenü "New " für den Dateityp ".myp-ms". Es 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 im Untermenü "Neu" die Option MyProgram Application auswählt, erstellt die Shell eine Datei mit dem Namen 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 zum Implementieren 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 zu löschen. Der folgende Screenshot veranschaulicht ein typisches Drag-and-Drop-Kontextmenü.

Screenshot des Kontextmenüs zum Ziehen und Ablegen

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

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Fügen Sie einen Unterschlüssel unter dem Unterschlüssel DragDropHandlers hinzu, der für den Drag-and-Drop-Handler benannt ist, und legen Sie den Standardwert des Unterschlüssels auf die Zeichenfolgenform der CLSID-GUID (Class Identifier) 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 über 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 ENUMERATION RESTRICTIONS .

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 vom Verb unterstützt werden. 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 wird, wird er aus dem Typ der von Ihnen ausgewählten Verbimplementierung abgeleitet. Für COM-basierte Methoden (z. B. DropTarget und ExecuteCommand) wird 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 ein Fenster der obersten Ebene für jedes Element erstellen. Dadurch wird die Anzahl der aktivierten Elemente begrenzt und verhindert, dass die Systemressourcen knapp werden, wenn der Benutzer zu viele Fenster öffnet.

Wenn die Anzahl der ausgewählten Elemente nicht mit dem Verbauswahlmodell übereinstimmt oder die in der folgenden Tabelle aufgeführten Standardgrenzwerte übersteigt, kann das Verb nicht angezeigt werden.

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

 

Im Folgenden sind Beispielregistrierungseinträge aufgeführt, 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 AttributMask-Wert gibt den SFGAO-Wert der Bitwerte der Maske an, mit der getestet werden soll.
  • Der Wert AttributeValue gibt den SFGAO-Wert der getesteten Bits an.
  • Das impliziteSelectionModel 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 benutzerdefinierter Verben für Ordner über Desktop.ini

In Windows 7 und höher können Sie Verben zu einem Ordner ü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 sein, 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\Ordner progID mit dem Wert CanUseForDirectory. Der CanUseForDirectory-Wert vermeidet den Missbrauch von ProgIDs, die so festgelegt sind, dass sie nicht an der Implementierung benutzerdefinierter Verben für Ordner über Desktop.ini teilnehmen.

  4. Fügen Sie Verben unter dem Unterschlüssel FolderProgID 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 mithilfe dynamischer Verben

Kontextmenüs und Kontextmenühandler

Verben und Dateizuordnungen

Kontextmenüreferenz