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 Shell) et des gestionnaires de types de fichiers (également appelés extensions Shell, gestionnaires d’extensions ou gestionnaires d’extensions Shell).

Cette rubrique décrit les interfaces suivantes :

Implémentation de gestionnaires de types de fichiers

Ces extensions Shell ou gestionnaires de types de fichiers fournissent à vos utilisateurs les expériences Shell 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 lancer des événements tels que l’ouverture du fichier.
  • Les utilisateurs peuvent cliquer avec le bouton droit sur des éléments pour accéder à un menu contextuel.
  • 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 classes.

Dans Windows XP ou une 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 ensuite de « fabrique » pour les gestionnaires d’icônes, les gestionnaires de menus contextuels, les gestionnaires d’aperçu, etc. Les implémentations minimales d’IPersist Interface et IPersistFolder Interface sont requises par IShellFolder Interface, 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’objet de dossier de base.

Ipersist

L’interface IPersist définit la méthode unique GetClassID, qui est 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 des objets de dossier Shell. L’implémentation de cette interface, qui est dérivée d’IPersist, est la façon dont le dossier est indiqué où il se trouve dans l’espace de noms Shell. Vous n’utilisez pas cette interface directement. Il est utilisé par l’implémentation du système de fichiers de la méthode IShellFolder::BindToObject lorsqu’elle initialise un objet de dossier Shell.

Méthode Description
Initialize Demande à un objet de dossier Shell de s’initialiser en fonction des informations transmises et retourne S_OK

 

IShellFolder

L’interface IShellFolder Est utilisée pour gérer les dossiers, et une implémentation partielle est requise pour que l’icône et les interfaces 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 via la méthode GetUIObjectOf . Cette méthode permet à un complément d’interroger les interfaces IExtractIcon et IContextMenu .

L’interface IShellFolder Utilise des PIDLs au lieu d’URL. Contrairement aux exigences 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 similaire à la méthode IUnknown::QueryInterface. Si une icône est demandée, l’appelant demande le IID_IExtractIcon ; si un menu contextuel est demandé, l’appelant demande le IID_IContextMenu

 

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

IContextMenu

Lorsque Recherche Windows affiche des résultats à l’utilisateur, celui-ci 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 action effectuée lorsque l’élément est double-cliqué. Sans les interfaces IShellFolder ou IContextMenu correspondantes pour l’élément, le comportement par défaut d’un événement de double-clic consiste à passer l’URL en tant qu’argument à la fonction ShellExecute Function .

Pour plus d’informations sur la création de gestionnaires de menus contextuels , consultez Création de gestionnaires de menus contextuels et Exemple : Extensions d’interpréteur de commandes pour les gestionnaires de protocole pour l’exemple de code.

IExtractIcon

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

Pour plus d’informations sur la création de gestionnaires d’icônes , consultez Création de gestionnaires d’icônes et Exemple : Extensions d’interpréteur de commandes pour les gestionnaires de protocole pour l’exemple de code.

IPreviewHandler

IPreviewHandler affiche un aperçu enrichi d’un élément sélectionné dans Windows Explorer. Les préversions sont disponibles dans Windows Search 4.0 ou dans Windows Vista avec Windows Desktop Search 3.x.

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

  1. Implémentez un IPreviewHandler qui prend un IStream, en suivant les instructions fournies dans Gestionnaires en préversion.

  2. Inscrivez votre gestionnaire d’aperçu :

    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 IShellFolder::GetUIObjectOf, gérezIQueryAssociations et retournez votre association pour vos éléments Shell, comme indiqué 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 a demandé à votre dossier Shell d’initialiser le flux de données pour initialiser le gestionnaire d’aperçu, accédez à votre méthode IShellFolder::BindToObject , gérez IID_IStream et retournez un IStream à votre URL.

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

  1. Inscrivez ce gestionnaire d’aperçu pour votre type de fichier à l’aide du CLSID du gestionnaire d’aperçu existant à la place de <Your_PreviewHandler_GUID>.
  2. Implémentez un dossier Shell.

Pour plus d’informations sur la création de gestionnaires d’aperçu, consultez Gestionnaires IPreviewHandler et Preview Handlers.

Ressources supplémentaires

Conceptuel

Développement de gestionnaires de protocole

Présentation des gestionnaires de protocole

Notification de modifications à l’index

Exemple de code : Extensions d’interpréteur de commandes 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 des gestionnaires de protocole