Création de gestionnaires de menu contextuel

Les gestionnaires de menus contextuels, également appelés gestionnaires de menus contextuels ou gestionnaires de verbes, sont un type de gestionnaire de type de fichier. Ces gestionnaires peuvent être mis en place de manière à les charger dans leur propre processus ou dans l’explorateur, ou dans d’autres processus tiers. Veillez à créer des gestionnaires in-process, car ils peuvent endommager le processus qui les charge.

Notes

Il existe des considérations spéciales pour les versions 64 bits de Windows lors de l’inscription de gestionnaires qui fonctionnent dans le contexte d’applications 32 bits : lorsqu’il est appelé dans le contexte d’une application dont le bit est différent, le sous-système WOW64 redirige l’accès du système de fichiers vers certains chemins. Si votre gestionnaire de .exe est stocké dans l’un de ces chemins d’accès, il n’est pas accessible dans ce contexte. Par conséquent, pour contourner le problème, stockez votre .exe dans un chemin qui n’est pas redirigé, ou stockez une version stub de votre .exe qui lance la version réelle.

Cette rubrique est organisée comme suit :

Verbes canoniques

Les applications sont généralement responsables de fournir des chaînes d’affichage localisées pour les verbes qu’elles définissent. Toutefois, pour fournir un degré d’indépendance linguistique, le système définit un ensemble standard de verbes couramment utilisés appelés verbes canoniques. Un verbe canonique n’est jamais affiché à l’utilisateur et peut être utilisé avec n’importe quelle langue d’interface utilisateur. Le système utilise le nom canonique pour générer automatiquement une chaîne d’affichage correctement localisée. Pour instance, la chaîne d’affichage du verbe ouvert est définie sur Ouvrir sur un système anglais et sur l’équivalent allemand sur un système allemand.

Verbe canonique Description
Ouvrir Ouvre le fichier ou le dossier.
Ouvrirnouveau Ouvre le fichier ou le dossier dans une nouvelle fenêtre.
Imprimer Imprime le fichier.
Imprimer Permet à l’utilisateur d’imprimer un fichier en le faisant glisser vers un objet d’imprimante.
Explorer Ouvre windows Explorer avec le dossier sélectionné.
Propriétés Ouvre la feuille de propriétés de l’objet.

Notes

Le verbe Printto est également canonique, mais il n’est jamais affiché. Son inclusion permet à l’utilisateur d’imprimer un fichier en le faisant glisser vers un objet d’imprimante.

Les gestionnaires de menus contextuels peuvent fournir leurs propres verbes canoniques via IContextMenu::GetCommandString avec GCS_VERBW ou GCS_VERBA. Le système utilise les verbes canoniques comme deuxième paramètre (lpOperation) passé à ShellExecute, et est le CMINVOKECOMMANDINFO. Membre lpVerb passé à la méthode IContextMenu::InvokeCommand .

Verbes étendus

Lorsque l’utilisateur clique avec le bouton droit sur un objet, le menu contextuel affiche les verbes par défaut. Vous pouvez ajouter et prendre en charge des commandes dans certains menus contextuels qui ne sont pas affichés dans tous les menus contextuels. Par exemple, vous pouvez avoir des commandes qui ne sont pas couramment utilisées ou qui sont destinées aux utilisateurs expérimentés. Pour cette raison, vous pouvez également définir un ou plusieurs verbes étendus. Ces verbes sont similaires aux verbes normaux, mais sont distingués des verbes normaux par la façon dont ils sont inscrits. Pour avoir accès à des verbes étendus, l’utilisateur doit cliquer avec le bouton droit sur un objet tout en appuyant sur la touche MAJ. Lorsque l’utilisateur le fait, les verbes étendus s’affichent en plus des verbes par défaut.

Vous pouvez utiliser le Registre pour définir un ou plusieurs verbes étendus. Les commandes associées s’affichent uniquement lorsque l’utilisateur clique avec le bouton droit sur un objet tout en appuyant également sur la touche MAJ. Pour définir un verbe comme étendu, ajoutez une valeur REG_SZ « étendue » à la sous-clé du verbe. Aucune donnée ne doit être associée à la valeur.

Verbes d’accès par programmation uniquement

Ces verbes ne sont jamais affichés dans un menu contextuel. Vous pouvez y accéder à l’aide de ShellExecuteEx et en spécifiant le champ lpVerb du paramètre pExecInfo (objet SHELLEXECUTEINFO ). Pour définir un verbe en tant qu’accès par programmation uniquement, ajoutez une valeur de REG_SZ « ProgrammaticAccessOnly » à la sous-clé du verbe. Aucune donnée ne doit être associée à la valeur.

Vous pouvez utiliser le Registre pour définir un ou plusieurs verbes étendus. Les commandes associées s’affichent uniquement lorsque l’utilisateur clique avec le bouton droit sur un objet tout en appuyant également sur la touche MAJ. Pour définir un verbe comme étendu, ajoutez une valeur REG_SZ « étendue » à la sous-clé du verbe. Aucune donnée ne doit être associée à la valeur.

Personnalisation d’un menu contextuel à l’aide de verbes statiques

Après avoir choisi un verbe statique ou dynamique pour votre menu contextuel , vous pouvez étendre le menu contextuel d’un type de fichier en inscrivant un verbe statique pour le type de fichier. Pour ce faire, ajoutez une sous-clé Shell sous la sous-clé pour le ProgID de l’application associée au type de fichier. Si vous le souhaitez, vous pouvez définir un verbe par défaut pour le type de fichier en faisant de celui-ci la valeur par défaut de la sous-clé Shell .

Le verbe par défaut s’affiche en premier dans le menu contextuel. Son objectif est de fournir à l’interpréteur de commandes un verbe qu’il peut utiliser lorsque la fonction ShellExecuteEx est appelée, mais qu’aucun verbe n’est spécifié. L’interpréteur de commandes ne sélectionne pas nécessairement le verbe par défaut lorsque ShellExecuteEx est utilisé de cette façon.

L’interpréteur de commandes utilise le premier verbe disponible dans l’ordre suivant :

  1. Verbe par défaut
  2. Premier verbe dans le registre, si l’ordre du verbe est spécifié
  3. Verbe ouvert
  4. Verbe Ouvrir avec

Si aucun des verbes répertoriés n’est disponible, l’opération échoue.

Créez une sous-clé pour chaque verbe que vous souhaitez ajouter sous la sous-clé Shell. Chacune de ces sous-clés doit avoir une valeur REG_SZ définie sur la chaîne d’affichage du verbe (chaîne localisée). Pour chaque sous-clé de verbe, créez une sous-clé de commande avec la valeur par défaut définie sur la ligne de commande pour l’activation des éléments. Pour les verbes canoniques, tels que Ouvrir et Imprimer, vous pouvez omettre la chaîne d’affichage, car le système affiche automatiquement une chaîne correctement localisée. Pour les verbes non canoniques, si vous omettez la chaîne d’affichage, la chaîne de verbe s’affiche.

Dans l’exemple de Registre suivant, notez que :

  • Comme Doit n’est pas un verbe canonique, un nom d’affichage lui est attribué, qui peut être sélectionné en appuyant sur la touche D.
  • Le verbe Imprimerto n’apparaît pas dans le menu contextuel. Toutefois, son inclusion dans le Registre permet à l’utilisateur d’imprimer des fichiers en les déposant sur une icône d’imprimante.
  • Une sous-clé s’affiche pour chaque verbe. %1 représente le nom du fichier et %2 le nom de l’imprimante.
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"

Le diagramme suivant illustre l’extension du menu contextuel conformément aux entrées de Registre ci-dessus. Ce menu contextuel contient des verbes Ouvrir, Faire et Imprimer dans son menu, avec Do It comme verbe par défaut.

capture d’écran du menu contextuel faire par défaut du verbe

Activation de votre gestionnaire à l’aide de l’interface IDropTarget

L’échange de données dynamique (DDE) est déconseillé ; utilisez plutôt IDropTarget . IDropTarget est plus robuste et offre une meilleure prise en charge de l’activation, car il utilise l’activation COM du gestionnaire. Dans le cas de la sélection de plusieurs éléments, IDropTarget n’est pas soumis aux restrictions de taille de mémoire tampon trouvées dans DDE et createProcess. En outre, les éléments sont transmis à l’application en tant qu’objet de données qui peut être converti en tableau d’éléments à l’aide de la fonction SHCreateShellItemArrayFromDataObject . Cette opération est plus simple et ne perd pas les informations d’espace de noms, comme cela se produit lorsque l’élément est converti en chemin d’accès pour les protocoles de ligne de commande ou DDE.

Pour plus d’informations sur les requêtes IDropTarget et Shell pour les attributs d’association de fichiers, consultez Types perçus et inscription d’application.

Spécification de la position et de l’ordre des verbes statiques

Normalement, les verbes sont classés dans un menu contextuel en fonction de la façon dont ils sont énumérés; l’énumération est basée d’abord sur l’ordre du tableau d’association, puis sur l’ordre des éléments dans le tableau d’association, tel que défini par l’ordre de tri du Registre.

Les verbes peuvent être triés en spécifiant la valeur par défaut de la sous-clé Shell pour l’entrée d’association. Cette valeur par défaut peut inclure un seul élément, qui sera affiché en haut du menu contextuel, ou une liste d’éléments séparés par des espaces ou des virgules. Dans ce dernier cas, le premier élément de la liste est l’élément par défaut, et les autres verbes s’affichent immédiatement en dessous dans l’ordre spécifié.

Par exemple, l’entrée de Registre suivante produit des verbes de menu contextuel dans l’ordre suivant :

  1. Affichage
  2. Gadgets
  3. Personnalisation
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

De même, l’entrée de Registre suivante produit des verbes de menu contextuel dans l’ordre suivant :

  1. Personnalisation
  2. Gadgets
  3. Affichage
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Positionnement des verbes en haut ou en bas du menu

L’attribut de Registre suivant peut être utilisé pour placer un verbe en haut ou en bas du menu. Si plusieurs verbes spécifient cet attribut, le dernier à le faire obtient la priorité :

Position=Top | Bottom 

Création de menus statiques en cascade

Dans Windows 7 et versions ultérieures, l’implémentation de menu en cascade est prise en charge via les paramètres du Registre. Avant Windows 7, la création de menus en cascade n’était possible que par l’implémentation de l’interface IContextMenu . Dans Windows 7 et versions ultérieures, vous devez recourir à des solutions basées sur le code COM uniquement lorsque les méthodes statiques sont insuffisantes.

La capture d’écran suivante fournit un exemple de menu en cascade.

capture d’écran montrant un exemple de menu en cascade

Dans Windows 7 et versions ultérieures, il existe trois façons de créer des menus en cascade :

Création de menus en cascade avec l’entrée de Registre SubCommands

Dans Windows 7 et versions ultérieures, vous pouvez utiliser l’entrée SubCommands pour créer des menus en cascade à l’aide de la procédure suivante.

Pour créer un menu en cascade à l’aide de l’entrée SubCommands

  1. Créez une sous-clé sous HKEY_CLASSES_ROOT\interpréteurde commandes ProgID\ pour représenter votre menu en cascade. Dans cet exemple, nous donnons à cette sous-clé le nom CascadeTest. Vérifiez que la valeur par défaut de la sous-clé CascadeTest est vide et affichée comme (valeur non définie).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. À votre sous-clé CascadeTest , ajoutez une entrée MUIVerb de type REG_SZ et affectez-lui le texte qui apparaîtra comme nom dans le menu contextuel. Dans cet exemple, nous lui affectons « Menu Cascade de test ».

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. À votre sous-clé CascadeTest , ajoutez une entrée SubCommands de type REG_SZ qui est attribuée à la liste, délimitée par des points-virgules, des verbes qui doivent apparaître dans le menu, dans l’ordre d’apparence. Par exemple, nous affectons ici un certain nombre de verbes fournis par le système :

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. Dans le cas des verbes personnalisés, implémentez-les à l’aide de l’une des méthodes d’implémentation de verbes statiques et répertoriez-les sous-clé CommandStore , comme indiqué dans cet exemple pour un verbe fictif VerbName :

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

Notes

Cette méthode présente l’avantage que les verbes personnalisés peuvent être inscrits une fois et réutilisés en listant le nom du verbe sous l’entrée SubCommands. Toutefois, l’application doit avoir l’autorisation de modifier le Registre sous HKEY_LOCAL_MACHINE.

 

Création de menus en cascade avec l’entrée de Registre ExtendedSubCommandsKey

Dans Windows 7 et versions ultérieures, vous pouvez utiliser l’entrée ExtendedSubCommandKey pour créer des menus en cascade étendus : menus en cascade dans des menus en cascade.

La capture d’écran suivante est un exemple de menu en cascade étendu.

capture d’écran montrant un menu étendu en cascade pour les appareils

Étant donné que HKEY_CLASSES_ROOT est une combinaison de HKEY_CURRENT_USER et de HKEY_LOCAL_MACHINE, vous pouvez inscrire tous les verbes personnalisés sous la sous-cléclassesde logiciels\HKEY_CURRENT_USER\. Le main’avantage de le faire est que l’autorisation avec élévation de privilèges n’est pas nécessaire. En outre, d’autres associations de fichiers peuvent réutiliser l’ensemble de cet ensemble de verbes en spécifiant la même sous-clé ExtendedSubCommandsKey. Si vous n’avez pas besoin de réutiliser cet ensemble de verbes, vous pouvez répertorier les verbes sous le parent, mais assurez-vous que la valeur par défaut du parent est vide.

Pour créer un menu en cascade à l’aide d’une entrée ExtendedSubCommandsKey

  1. Créez une sous-clé sous HKEY_CLASSES_ROOT\interpréteurde commandes ProgID\ pour représenter votre menu en cascade. Dans cet exemple, nous donnons à cette sous-clé le nom CascadeTest2. Vérifiez que la valeur par défaut de la sous-clé CascadeTest est vide et affichée comme (valeur non définie).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. À votre sous-clé CascadeTest , ajoutez une entrée MUIVerb de type REG_SZ et affectez-lui le texte qui apparaîtra comme nom dans le menu contextuel. Dans cet exemple, nous lui affectons « Menu Cascade de test ».

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. Sous la sous-clé CascadeTest que vous avez créée, ajoutez une sous-clé ExtendedSubCommandsKey , puis ajoutez les sous-commandes de document (de REG_SZ type) ; par exemple :

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

    Vérifiez que la valeur par défaut de la sous-clé Menu Cascade de test 2 est vide et affichée comme (valeur non définie).

  4. Remplissez les sous-groupes à l’aide de l’une des implémentations de verbes statiques suivantes. Notez que la sous-clé CommandFlags représente les valeurs EXPCMDFLAGS. Si vous souhaitez ajouter un séparateur avant ou après l’élément de menu en cascade, utilisez ECF_SEPARATORBEFORE (0x20) ou ECF_SEPARATORAFTER (0x40). Pour obtenir une description de ces indicateurs Windows 7 et versions ultérieures, consultez IExplorerCommand::GetFlags. ECF_SEPARATORBEFORE fonctionne uniquement pour les éléments de menu de niveau supérieur. MUIVerb est de type REG_SZ et CommandFlags est de type 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
    

La capture d’écran suivante est une illustration des exemples précédents d’entrée de clé de Registre.

capture d’écran montrant un exemple de menu en cascade montrant les choix de bloc-notes et de bloc-notes

Création de menus en cascade avec l’interface IExplorerCommand

Une autre option permettant d’ajouter des verbes à un menu en cascade consiste à utiliser IExplorerCommand::EnumSubCommands. Cette méthode permet aux sources de données qui fournissent leurs commandes de module de commande via IExplorerCommandProvider d’utiliser ces commandes comme verbes dans un menu contextuel. Dans Windows 7 et versions ultérieures, vous pouvez fournir la même implémentation de verbes à l’aide de IExplorerCommand que vous pouvez avec IContextMenu.

Les deux captures d’écran suivantes illustrent l’utilisation de menus en cascade dans le dossier Appareils .

Capture d’écran montrant un exemple de menu en cascade dans le dossier appareils.

La capture d’écran suivante illustre une autre implémentation d’un menu en cascade dans le dossier Appareils .

capture d’écran montrant un exemple de menu en cascade dans le dossier appareils

Notes

Étant donné que IExplorerCommand prend uniquement en charge l’activation in-process, il est recommandé d’utiliser les sources de données Shell qui doivent partager l’implémentation entre les commandes et les menus contextuels.

 

Obtention du comportement dynamique pour les verbes statiques à l’aide de la syntaxe de requête avancée

La syntaxe de requête avancée (AQS) peut exprimer une condition qui sera évaluée à l’aide des propriétés de l’élément pour lequel le verbe est instancié. Ce système fonctionne uniquement avec des propriétés rapides. Il s’agit de propriétés que la source de données Shell signale aussi rapidement en ne retournant pas SHCOLSTATE_SLOW à partir de IShellFolder2::GetDefaultColumnState.

Windows 7 et versions ultérieures prennent en charge les valeurs canoniques qui évitent les problèmes sur les builds localisées. La syntaxe canonique suivante est requise sur les builds localisées pour tirer parti de cette amélioration de Windows 7.

System.StructuredQueryType.Boolean#True

Dans l’exemple d’entrée de Registre suivant :

  • La valeur AppliesTo contrôle si le verbe est affiché ou masqué.
  • La valeur DefaultAppliesTo contrôle quel verbe est la valeur par défaut.
  • La valeur HasLUAShield contrôle si un bouclier de contrôle de compte d’utilisateur (UAC) s’affiche.

Dans cet exemple, la valeur DefaultAppliesTo fait de ce verbe la valeur par défaut pour tout fichier avec le mot « exampleText1 » dans son nom de fichier. La valeur AppliesTo active le verbe pour n’importe quel fichier avec « exampleText1 » dans le nom. La valeur HasLUAShield affiche le bouclier pour les fichiers avec « exampleText2 » dans le nom.

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

Ajoutez la sous-clé Command et une valeur :

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

Dans le Registre Windows 7, consultez HKEY_CLASSES_ROOT\lecteur comme exemple de verbes bitlocker qui utilisent l’approche suivante :

  • S’applique À = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

Pour plus d’informations sur AQS, consultez Syntaxe de requête avancée.

Déconseillé : association de verbes à des commandes d’échange de données dynamiques

DDE est déconseillé ; utilisez IDropTarget à la place. DDE est déconseillé, car il s’appuie sur un message de fenêtre de diffusion pour découvrir le serveur DDE. Un blocage de serveur DDE bloque le message de la fenêtre de diffusion et bloque donc les conversations DDE pour d’autres applications. Il est courant qu’une seule application bloquée provoque des blocages ultérieurs dans l’expérience de l’utilisateur.

La méthode IDropTarget est plus robuste et offre une meilleure prise en charge de l’activation, car elle utilise l’activation COM du gestionnaire. Dans le cas de la sélection de plusieurs éléments, IDropTarget n’est pas soumis aux restrictions de taille de mémoire tampon trouvées dans DDE et CreateProcess. En outre, les éléments sont transmis à l’application en tant qu’objet de données qui peut être converti en tableau d’éléments à l’aide de la fonction SHCreateShellItemArrayFromDataObject . Cela est plus simple et ne perd pas les informations d’espace de noms, comme cela se produit lorsque l’élément est converti en chemin d’accès pour les protocoles de ligne de commande ou DDE.

Pour plus d’informations sur les requêtes IDropTarget et Shell pour les attributs d’association de fichiers, consultez Types perçus et inscription d’application.

Exécution des tâches d’implémentation de verbes

Les tâches suivantes pour l’implémentation de verbes sont pertinentes pour les implémentations de verbes statiques et dynamiques. Pour plus d’informations sur les verbes dynamiques, consultez Personnalisation d’un menu contextuel à l’aide de verbes dynamiques.

Personnalisation du menu contextuel pour les objets shell prédéfinis

De nombreux objets Shell prédéfinis ont des menus contextuels qui peuvent être personnalisés. Inscrivez la commande de la même façon que vous inscrivez des types de fichiers classiques, mais utilisez le nom de l’objet prédéfini comme nom de type de fichier.

Une liste d’objets prédéfinis se trouve dans la section Objets shell prédéfinis de Création de gestionnaires d’extensions d’interpréteur de commandes. Les objets Shell prédéfinis dont les menus contextuels peuvent être personnalisés en ajoutant des verbes dans le Registre sont marqués dans le tableau avec le mot Verb.

Extension d’un nouveau sous-menu

Lorsqu’un utilisateur ouvre le menu Fichier dans Windows Explorer, l’une des commandes affichées est Nouvelle. La sélection de cette commande affiche un sous-menu. Par défaut, le sous-menu contient deux commandes, Dossier et Raccourci, qui permettent aux utilisateurs de créer des sous-dossiers et des raccourcis. Ce sous-menu peut être étendu pour inclure des commandes de création de fichiers pour n’importe quel type de fichier.

Pour ajouter une commande de création de fichier au sous-menu Nouveau , les fichiers de votre application doivent avoir un type de fichier associé. Incluez une sous-clé ShellNouveau sous le nom de fichier. Lorsque la commande Nouveau du menu Fichier est sélectionnée, l’interpréteur de commandes ajoute le type de fichier au sous-menu Nouveau. La chaîne d’affichage de la commande est la chaîne descriptive affectée au ProgID du programme.

Pour spécifier la méthode de création de fichier, affectez une ou plusieurs valeurs de données à la sous-clé ShellNew . Les valeurs disponibles sont répertoriées dans le tableau suivant.

ShellNew valeur de sous-clé Description
Commande Exécute une application. Cette valeur REG_SZ spécifie le chemin de l’application à exécuter. Par exemple, vous pouvez le définir pour lancer un Assistant.
Données Crée un fichier contenant les données spécifiées. Cette valeur REG_BINARY spécifie les données du fichier. Les données sont ignorées si NullFile ou FileName est spécifié.
FileName Crée un fichier qui est une copie d’un fichier spécifié. Cette valeur REG_SZ spécifie le chemin complet du fichier à copier.
NullFile Crée un fichier vide. Aucune valeur n’est affectée à NullFile. Si NullFile est spécifié, les valeurs de Registre Data et FileName sont ignorées.

 

L’exemple de clé de Registre et la capture d’écran suivants illustrent le sous-menu Nouveau pour le type de fichier .myp-ms. Il a une commande, MyProgram Application.

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

La capture d’écran illustre le sous-menu Nouveau . Lorsqu’un utilisateur sélectionne MyProgram Application à partir du nouveau sous-menu, l’interpréteur de commandes crée un fichier nommé New MyProgram Application.myp-ms et le transmet à MyProgram.exe.

capture d’écran de l’Explorateur Windows montrant une nouvelle commande « myprogram application » sur le sous-menu « new »

Création de gestionnaires glisser-déplacer

La procédure de base pour l’implémentation d’un gestionnaire de glisser-déplacer est la même que pour les gestionnaires de menus contextuels classiques. Toutefois, les gestionnaires de menus contextuels utilisent normalement uniquement le pointeur IDataObject passé à la méthode IShellExtInit::Initialize du gestionnaire pour extraire le nom de l’objet. Un gestionnaire glisser-déplacer peut implémenter un gestionnaire de données plus sophistiqué pour modifier le comportement de l’objet déplacé.

Lorsqu’un utilisateur clique avec le bouton droit sur un objet Shell pour faire glisser un objet, un menu contextuel s’affiche lorsque l’utilisateur tente de supprimer l’objet. La capture d’écran suivante illustre un menu contextuel par glisser-déplacer classique.

capture d’écran du menu contextuel glisser-déplacer

Un gestionnaire de glisser-déplacer est un gestionnaire de menu contextuel qui peut ajouter des éléments à ce menu contextuel. Les gestionnaires glisser-déplacer sont généralement inscrits sous la sous-clé suivante.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Ajoutez une sous-clé sous la sous-clé DragDropHandlers nommée pour le gestionnaire de glisser-déplacer et définissez la valeur par défaut de la sous-clé sur la forme de chaîne du GUID de l’identificateur de classe (CLSID) du gestionnaire. L’exemple suivant active le gestionnaire de glisser-déplacer MyDD .

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

Suppression des verbes et contrôle de la visibilité

Vous pouvez utiliser les paramètres de stratégie Windows pour contrôler la visibilité des verbes. Les verbes peuvent être supprimés via des paramètres de stratégie en ajoutant une valeur SuppressionPolicy ou une valeur GUID SuppressionPolicyEx à la sous-clé de Registre du verbe. Définissez la valeur de la sous-clé SuppressionPolicy sur l’ID de stratégie. Si la stratégie est activée, le verbe et l’entrée de menu contextuel associée sont supprimés. Pour connaître les valeurs d’ID de stratégie possibles, consultez l’énumération RESTRICTIONS .

Utilisation du modèle de sélection de verbes

Les valeurs de Registre doivent être définies pour les verbes afin de gérer les situations où un utilisateur peut sélectionner un seul élément, plusieurs éléments ou une sélection à partir d’un élément. Un verbe nécessite des valeurs de Registre distinctes pour chacune de ces trois situations qu’il prend en charge. Les valeurs possibles pour le modèle de sélection de verbes sont les suivantes :

  • Spécifiez la valeur MultiSelectModel pour tous les verbes. Si la valeur MultiSelectModel n’est pas spécifiée, elle est déduite du type d’implémentation de verbe que vous avez choisi. Pour les méthodes COM (telles que DropTarget et ExecuteCommand), Player est supposé, et pour les autres méthodes , Document est supposé.
  • Spécifiez Single pour les verbes qui ne prennent en charge qu’une seule sélection.
  • Spécifiez Player pour les verbes qui prennent en charge un nombre quelconque d’éléments.
  • Spécifiez Document pour les verbes qui créent une fenêtre de niveau supérieur pour chaque élément. Cela limite le nombre d’éléments activés et permet d’éviter de manquer de ressources système si l’utilisateur ouvre trop de fenêtres.

Lorsque le nombre d’éléments sélectionnés ne correspond pas au modèle de sélection de verbe ou est supérieur aux limites par défaut décrites dans le tableau suivant, le verbe n’apparaît pas.

Type d’implémentation de verbe Document Lecteur
Hérité 15 éléments 100 éléments
COM 15 éléments Aucune limite

 

Voici des exemples d’entrées de Registre utilisant la valeur MultiSelectModel.

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

Utilisation des attributs d’élément

Les valeurs d’indicateur SFGAO des attributs shell d’un élément peuvent être testées pour déterminer si le verbe doit être activé ou désactivé.

Pour utiliser cette fonctionnalité d’attribut, ajoutez les valeurs REG_DWORD suivantes sous le verbe :

  • La valeur AttributeMask spécifie la valeur SFGAO des valeurs de bits du masque à tester.
  • La valeur AttributeValue spécifie la valeur SFGAO des bits testés.
  • La méthode ImpliedSelectionModel spécifie zéro pour les verbes d’élément, ou une valeur différente de zéro pour les verbes dans le menu contextuel en arrière-plan.

Dans l’exemple d’entrée de Registre suivant, AttributeMask est défini sur SFGAO_READONLY (0x40000).

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

Implémentation de verbes personnalisés pour les dossiers via Desktop.ini

Dans Windows 7 et versions ultérieures, vous pouvez ajouter des verbes à un dossier via Desktop.ini. Pour plus d’informations sur les fichiers Desktop.ini, consultez Comment personnaliser des dossiers avec Desktop.ini.

Notes

Desktop.ini fichiers doivent toujours êtremarqués Comme étant masquéspar le système + , ils ne s’affichent pas aux utilisateurs.

 

Pour ajouter des verbes personnalisés pour les dossiers via un fichier Desktop.ini, effectuez les étapes suivantes :

  1. Créez un dossier marqué en lecture seule ou Système.

  2. Créez un fichier Desktop.ini qui inclut un [. ShellClassInfo] DirectoryClass=Folder ProgID.

  3. Dans le Registre , créez HKEY_CLASSES_ROOT\ProgID du dossier avec la valeur CanUseForDirectory. La valeur CanUseForDirectory évite l’utilisation incorrecte des progID qui sont définis pour ne pas participer à l’implémentation de verbes personnalisés pour les dossiers via Desktop.ini.

  4. Ajoutez des verbes sous la sous-clé FolderProgID, par exemple :

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

Notes

Ces verbes peuvent être le verbe par défaut, auquel cas le double-clic sur le dossier active le verbe.

 

Meilleures pratiques pour les gestionnaires de menus contextuels et les verbes de sélection multiple

Choix d’un verbe statique ou dynamique pour votre menu contextuel

Personnalisation d’un menu contextuel à l’aide de verbes dynamiques

Menus contextuels et gestionnaires de menus contextuels

Verbes et associations de fichiers

Informations de référence sur le menu contextuel