Ajout d’icônes, d’aperçus et de menus contextuels

Pour vous assurer que vos données sont indexées et présentées correctement à l’utilisateur pendant les recherches, vous devez implémenter des magasins de données Shell (également appelés extensions d’espace de noms de Shell) et des gestionnaires de type de fichier (également appelés extensions d’interpréteur de commandes, gestionnaires d' extensionou gestionnaires d’extension de Shell).

Cette rubrique décrit les interfaces suivantes :

Implémentation de gestionnaires de types de fichiers

Ces extensions de Shell ou gestionnaires de type de fichier fournissent à vos utilisateurs les expériences d’environnement suivantes :

  • La vue résultats affiche une icône spécifique pour votre type d’élément.
  • La vue résultats affiche un aperçu de l’élément lorsque l’utilisateur sélectionne l’élément.
  • Les utilisateurs peuvent double-cliquer sur des éléments pour initier des événements tels que l’ouverture du fichier.
  • Les utilisateurs peuvent cliquer avec le bouton droit sur les éléments pour accéder à un menu contextuel (contexte).
  • Les utilisateurs peuvent glisser-déplacer des éléments.

Comme tous les objets COM (Component Object Model), les gestionnaires de types de fichiers doivent implémenter une interface IUnknown et une fabrique de classe.

dans Windows XP ou version antérieure, les gestionnaires doivent également implémenter :

dans Windows Vista, l’interface IPersistFile et l' interface IShellExtInit ont été remplacées par les trois interfaces suivantes pour que Shell initialise le gestionnaire :

Pour fournir une expérience utilisateur raisonnable, vous devez fournir un magasin de données Shell avec votre gestionnaire de protocole. Ce magasin de données sert alors de « fabrique » pour les gestionnaires d’icônes, les gestionnaires de menus contextuels, les gestionnaires d’aperçus, etc. Les implémentations minimales de l’interface IPersist et de l' interface IPersistFolder sont requises par l' interface IShellFolder, et une implémentation minimale de l’interface IShellFolder est requise pour IContextMenu et IExtractIcon.

Notes

Le même identificateur de classe (CLSID) doit être implémenté pour IPersist, IPersistFolder et IShellFolder.

Pour plus d’informations sur la création d’un magasin de données Shell pour prendre en charge un gestionnaire de protocole, consultez implémentation des interfaces d’objets de dossier de base.

IPersist

L’interface IPersist définit la méthode unique GetClassID, conçue pour fournir le CLSID d’un objet qui peut être stocké de manière permanente dans le système.

Méthode Description
GetClassID Retourne le CLSID de l’objet de magasin de données Shell

IPersistFolder

L’interface IPersistFolder est utilisée pour initialiser les objets de dossier de l’interpréteur de commandes. L’implémentation de cette interface, dérivée de IPersist, est la manière dont le dossier est indiqué à l’emplacement où il se trouve dans l’espace de noms Shell. Vous n’utilisez pas cette interface directement. Elle est utilisée par l’implémentation du système de fichiers de la méthode IShellFolder :: BindToObject lors de l’initialisation d’un objet de dossier de l’interpréteur de commandes.

Méthode Description
Initialiser Demande à un objet de dossier de Shell de s’initialiser en fonction des informations transmises et des retours _ OK

IShellFolder

l’interface d' interface IShellFolder est utilisée pour gérer les dossiers, et une implémentation partielle est nécessaire pour que les interfaces d’icône et de contexte implémentées pour un gestionnaire de protocole se comportent correctement dans l’Interface utilisateur des résultats de recherche Windows. La plupart des fonctionnalités requises sont exposées par le biais de la méthode GetUIObjectOf . Cette méthode permet à un complément d’interroger les interfaces IExtractIcon et IContextMenu .

L’interface d' interface IShellFolder utilise PIDL à la place des URL. Contrairement aux spécifications d’un magasin de données Shell complet, les compléments peuvent utiliser une structure IDL simple qui contient uniquement l’URL.

Les méthodes suivantes de l' interface IShellFolder doivent être implémentées. Cinq de ces méthodes nécessitent une implémentation minimale.

Méthode Description
BindToObject Retourne E _ NOTIMPL
BindToStorage Retourne E _ NOTIMPL
CreateViewObject Retourne E _ NOTIMPL
SetNameOf Retourne E _ NOTIMPL
ParseDisplayName Convertit une URL en structure PIDL
CompareIDs Compare deux valeurs PIDL
GetDisplayNameOf Retourne l’URL d’un PIDL
GetUIObjectOf Cette méthode est semblable à la méthode IUnknown :: QueryInterface. Si une icône est demandée, l’appelant demande l’IID _ IExtractIcon ; si un menu contextuel est demandé, l’appelant demande l’IID _ IContextMenu

IShellFolder n’est pas utilisé pour énumérer des dossiers. Cela signifie que le nom complet d’un dossier sera l’URL physique. Cela peut changer à l’avenir.

IContextMenu

lorsque Windows recherche affiche les résultats à l’utilisateur, l’utilisateur peut cliquer avec le bouton droit sur un élément et afficher un menu contextuel défini par votre interface IContextMenu . Les menus contextuels sont également appelés menus contextuels.

L’action par défaut dans le menu contextuel est la même que celle effectuée lors d’un double-clic sur l’élément. Sans les interfaces IShellFolder ou IContextMenu correspondantes pour l’élément, le comportement par défaut d’un événement de double-clic consiste à transmettre l’URL en tant qu’argument à la fonction ShellExecute .

Pour plus d’informations sur la création de gestionnaires de menus contextuels et sur les Exemples : extensions de Shell pour les gestionnaires de protocole pour l’exemple de code, consultez Création de gestionnaires de menus contextuels.

IExtractIcon

IExtractIcon récupère une icône pour l’interface utilisateur de recherche Windows en fonction de l’URL figurant dans le PIDL fourni par votre gestionnaire de protocole.

Pour plus d’informations sur la création de gestionnaires d’icône et d' Exemples : extensions de Shell pour les gestionnaires de protocole pour l’exemple de code, consultez création de gestionnaires d’icône .

IPreviewHandler

le IPreviewHandler affiche un aperçu complet d’un élément sélectionné dans Windows Explorer. les aperçus sont disponibles dans Windows search 4,0 ou dans Windows Vista avec Windows Desktop search 3. x.

Pour créer un gestionnaire d’aperçus personnalisé :

  1. Implémentez un IPreviewHandler qui prend un IStream, en suivant les instructions fournies dans les gestionnaires d’aperçus.

  2. Inscrire votre gestionnaire d’aperçus :

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Effectuez les deux étapes suivantes pour implémenter un dossier Shell pour votre URL :

    1. Dans la méthode IShellFolder :: GetUIObjectOf, gérez IQueryAssociations et retournez votre Association pour vos éléments de Shell, comme illustré dans l’exemple de code suivant.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Une fois que l’interpréteur de commandes interroge votre dossier Shell pour obtenir le flux de données pour initialiser le gestionnaire d’aperçus, accédez à votre méthode de méthode IShellFolder :: BindToObject , gérez IID IID _ et renvoyez un IStream à votre URL.

Pour réutiliser un gestionnaire d’aperçus existant pour votre type de fichier, procédez comme suit :

  1. Inscrivez ce gestionnaire d’aperçus pour votre type de fichier à l’aide du CLSID du gestionnaire d’aperçus existant à la place de <votre _ _ GUID PreviewHandler>.
  2. Implémentez un dossier shell.

Pour plus d’informations sur la création de gestionnaires d’aperçus, consultez IPreviewHandler et les gestionnaires d’aperçus.

Ressources supplémentaires

Méthodologique

Développement de gestionnaires de protocole

Fonctionnement des gestionnaires de protocole

Notification de l’index des modifications

Exemple de code : extensions de Shell pour les gestionnaires de protocole

Installation et inscription de gestionnaires de protocole

Création d’un connecteur de recherche pour un gestionnaire de protocole

Débogage de gestionnaires de protocole