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 implémentés de manière à les charger dans leur propre processus ou dans l’explorateur, ou dans d’autres processus tiers. Prenez soin de créer des gestionnaires in-process, car ils peuvent causer des dommages au processus qui les charge.

Remarque

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’elles sont appelées dans le contexte d’une application de bits différente, le sous-système WOW64 redirige l’accès au système de fichiers vers certains chemins. Si votre gestionnaire .exe est stocké dans l’un de ces chemins, il n’est pas accessible dans ce contexte. Par conséquent, pour contourner ce problème, stockez votre fichier .exe dans un chemin d’accès qui n’est pas redirigé, ou stockez une version stub de votre fichier .exe qui lance la version réelle.

Cette rubrique est organisée comme suit :

Verbes canoniques

Les applications sont généralement responsables de la fourniture de chaînes d’affichage localisées pour les verbes qu’elles définissent. Toutefois, pour fournir un degré d’indépendance du langage, 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. Par exemple, la chaîne d’affichage du verbe ouvert est définie sur Open 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.
Ouvrirnew Ouvre le fichier ou le dossier dans une nouvelle fenêtre.
Imprimer Imprime le fichier.
Printto Permet à l’utilisateur d’imprimer un fichier en le faisant glisser vers un objet d’imprimante.
Explorer Ouvre l’Explorateur Windows avec le dossier sélectionné.
Propriétés Ouvre la feuille de propriétés de l’objet.

Remarque

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 sur certains menus contextuels qui ne sont pas affichés dans chaque menu contextuel. 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 aux verbes étendus, l’utilisateur doit cliquer avec le bouton droit sur un objet en appuyant sur la touche Maj. Lorsque l’utilisateur le fait, les verbes étendus sont affichés 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. La valeur ne doit pas avoir de données associées.

Verbes d’accès par programmation uniquement

Ces verbes ne sont jamais affichés dans un menu contextuel. Ces informations sont accessibles à 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 REG_SZ « ProgramAccessOnly » à la sous-clé du verbe. La valeur ne doit pas avoir de données associées.

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. La valeur ne doit pas avoir de données associées.

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 le faisant de 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 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. Ouvrir avec un verbe

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 activer les éléments. Pour les verbes canoniques, tels que Open et Print, vous pouvez omettre la chaîne d’affichage, car le système affiche automatiquement une chaîne correctement localisée. Pour les verbes noncanoniques, si vous omettez la chaîne d’affichage, la chaîne de verbe est affichée.

Dans l’exemple de Registre suivant, notez que :

  • Étant donné que Doit n’est pas un verbe canonique, il reçoit un nom d’affichage, qui peut être sélectionné en appuyant sur la touche D.
  • Le verbe Printto n’apparaît pas dans le menu contextuel. Toutefois, son inclusion dans le Registre permet à l’utilisateur d’imprimer des fichiers en les supprimant sur une icône d’imprimante.
  • Une sous-clé est affichée 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 comporte des verbes Open, Do It et Print dans son menu, avec Do It comme verbe par défaut.

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

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

Dynamic Data Exchange (DDE) est déconseillé ; utilisez IDropTarget à la place. 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 plusieurs sélections d’é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 passés à 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, car 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 sur 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 du tableau d’association, comme défini par l’ordre de tri du Registre.

Les verbes peuvent être classé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é à la position supérieure 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 sont affichés immédiatement sous celui-ci 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. S’il existe plusieurs verbes qui spécifient cet attribut, le dernier à faire obtient la priorité :

Position=Top | Bottom 

Création de menus en cascade statiques

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 com basées sur du code 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\shell 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. Dans votre sous-clé CascadeTest , ajoutez une entrée MUIVerb de type REG_SZ et affectez-la au texte qui apparaîtra comme son 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. Dans votre sous-clé CascadeTest , ajoutez une entrée SubCommands de type REG_SZ qui est affecté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 assignons 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 de verbes personnalisés, implémentez-les à l’aide de l’une des méthodes d’implémentation de verbes statiques et les répertoriez sous la sous-clé CommandStore , comme indiqué dans cet exemple pour un verbe verbe fictif VerbName :

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

Remarque

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 les menus en cascade.

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

capture d’écran montrant le menu en cascade étendu 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é classes logicielles\HKEY_CURRENT_USER.\ L’avantage principal de cette opération 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 cet ensemble complet 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 vérifier 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\shell 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. Dans votre sous-clé CascadeTest , ajoutez une entrée MUIVerb de type REG_SZ et affectez-la au texte qui apparaîtra comme son 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 type REG_SZ ) ; 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é Test Cascade Menu 2 est vide et affichée comme (valeur non définie).

  4. Remplissez les sous-clés à l’aide de l’une des implémentations de verbe 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 ultérieurs, 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 du bloc-notes et du bloc-notes

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

Une autre option pour 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 verbe à 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

Remarque

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

 

Obtention d’un 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 de 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 des propriétés que la source de données Shell signale aussi rapidement en ne retournant pas SHCOLSTATE_SLOW à partir d’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 le verbe par défaut.
  • La valeur HasLUAShield contrôle si une protection de contrôle de compte d’utilisateur (UAC) est affichée.

Dans cet exemple, la valeur DefaultAppliesTo rend ce verbe le verbe par défaut pour n’importe quel 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 des 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 :

  • AppliesTo = 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 serveur DDE bloque le message de fenêtre de diffusion et bloque donc les conversations DDE pour d’autres applications. Il est courant qu’une seule application bloquée provoque un blocage ultérieur 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 plusieurs sélections d’é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 passés à 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, car 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.

Fin des tâches d’implémentation détaillées

Les tâches suivantes pour implémenter des 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 la création de gestionnaires d’extensions Shell. Ces 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 Verbe.

Extension d’un nouveau sous-menu

Lorsqu’un utilisateur ouvre le menu Fichier dans l’Explorateur Windows, 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 fichiers au sous-menu Nouveau , les fichiers de votre application doivent avoir un type de fichier associé. Incluez une sous-clé ShellNew 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.

Valeur de sous-clé ShellNew Description
Commande Exécute une application. Cette valeur REG_SZ spécifie le chemin d’accès de l’application à exécuter. Par exemple, vous pouvez le définir pour lancer un Assistant.
Données Crée un fichier contenant des 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. NullFile n’a aucune valeur affectée. 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 nouveau sous-menu 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 nouveau sous-menu. Lorsqu’un utilisateur sélectionne l’application MyProgram à partir du sous-menu Nouveau, 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 conventionnels. Toutefois, les gestionnaires de menus contextuels utilisent normalement uniquement le pointeur IDataObject transmis à la méthode IShellExtInit ::Initialize du gestionnaire pour extraire le nom de l’objet. Un gestionnaire de 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 de glisser-déplacer classique.

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

Un gestionnaire de glisser-déplacer est un gestionnaire de menus contextuels 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, puis définissez la valeur par défaut de la sous-clé sur la forme de chaîne du GUID CLSID (Class Identifier) 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 de verbes et contrôle de la visibilité

Vous pouvez utiliser les paramètres de stratégie Windows pour contrôler la visibilité détaillée. Les verbes peuvent être supprimés via les 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é 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 que les verbes gèrent 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 que le verbe prend en charge. Les valeurs possibles pour le modèle de sélection de verbe 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 choisie. Pour les méthodes COM (telles que DropTarget et ExecuteCommand) Player est supposée, 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 ne s’affiche pas.

Type d’implémentation de verbe Document Joueur
Ancien 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 non 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.

Remarque

Desktop.ini fichiers doivent toujours être marqués Comme masqués par le système + , ils ne seront pas affichés aux utilisateurs.

 

Pour ajouter des verbes personnalisés pour les dossiers via un fichier Desktop.ini, procédez comme suit :

  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\Folder ProgID avec la valeur CanUseForDirectory. La valeur CanUseForDirectory évite l’utilisation incorrecte des ProgID qui ne sont pas définis pour 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
    

Remarque

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

 

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

Choisir entre un verbe statique et 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