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
- Erweiterte Verben
- Programmgesteuerte Zugriffsverben
- Anpassen eines Kontextmenüs mithilfe statischer Verben
- Aktivieren des Handlers mithilfe der IDropTarget-Schnittstelle
- Angeben der Position und Reihenfolge statischer Verben
- Positionieren von Verben am oberen oder unteren Rand des Menüs
- Erstellen statischer kaskadierender Menüs
- Abrufen des dynamischen Verhaltens für statische Verben mithilfe der erweiterten Abfragesyntax
- Veraltet: Zuordnen von Verben zu dynamischen Datenaustauschbefehlen
- Abschließen von Verbimplementierungsaufgaben
- Zugehörige Themen
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. |
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:
- Das Standardverb
- Das erste Verb in der Registrierung, wenn die Verbreihenfolge angegeben ist
- Das Verb Öffnen
- 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.
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:
- Anzeige
- Gadgets
- Personalisierung
HKEY_CLASSES_ROOT
DesktopBackground
Shell
Display
Gadgets
Personalization
Ebenso erzeugt der folgende Registrierungseintrag Kontextmenüverben in der folgenden Reihenfolge:
- Personalisierung
- Gadgets
- 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ü.
In Windows 7 und höher gibt es drei Möglichkeiten, kaskadierende Menüs zu erstellen:
- Erstellen kaskadierender Menüs mit dem Registrierungseintrag "SubCommands"
- Erstellen kaskadierender Menüs mit dem Registrierungseintrag ExtendedSubCommandsKey
- Erstellen kaskadierender Menüs mit der IExplorerCommand-Schnittstelle
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ü
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)
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
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
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ü.
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
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)
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
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.
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.
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 .
Der folgende Screenshot veranschaulicht eine weitere Implementierung eines kaskadierenden Menüs im Ordner Geräte .
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.
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ü.
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:
Erstellen Sie einen Ordner, der als Schreibgeschützt oder System gekennzeichnet ist.
Erstellen Sie eine Desktop.ini-Datei, die ein [enthält. ShellClassInfo] DirectoryClass=Folder ProgID.
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.
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.
Zugehörige Themen
-
Bewährte Methoden für Kontextmenühandler und Mehrfachauswahlverben
-
Auswählen eines statischen oder dynamischen Verbs für das Kontextmenü
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für