Agregar iconos, vistas previas y menús contextuales
Para asegurarse de que los datos se indexan y presentan correctamente al usuario durante las búsquedas, debe implementar almacenes de datos de Shell (también conocidos como extensiones de espacio de nombres de Shell) y controladores de tipos de archivo (también conocidos como extensiones de Shell, controladores de extensiones o controladores de extensiones de Shell).
En este tema se describen las siguientes interfaces:
Implementación de controladores de tipos de archivo
Estas extensiones de Shell o controladores de tipo de archivo proporcionan a los usuarios las siguientes experiencias de Shell:
- La vista de resultados muestra un icono específico para el tipo de elemento.
- La vista de resultados muestra una vista previa del elemento cuando el usuario selecciona el elemento.
- Los usuarios pueden hacer doble clic en elementos para iniciar eventos como abrir el archivo.
- Los usuarios pueden hacer clic con el botón derecho en los elementos para acceder a un menú contextual (contextual).
- Los usuarios pueden arrastrar y colocar elementos.
Al igual que todos los objetos Component Object Model (COM), los controladores de tipos de archivo deben implementar una interfaz IUnknown y un generador de clases.
En Windows XP o versiones anteriores, los controladores también deben implementar:
- Interfaz IPersistFile
- O interfaz IShellExtInit
En Windows Vista, IPersistFile Interface e IShellExtInit Interface se reemplazaron por las tres interfaces siguientes para que Shell inicialice el controlador:
Para proporcionar una experiencia de usuario razonable, debe proporcionar un almacén de datos de Shell con el controlador de protocolo. Después, ese almacén de datos actúa como "fábrica" para los controladores de iconos, los controladores de menú contextual, los controladores de vista previa, etc. Las implementaciones mínimas de IPersist Interface e IPersistFolder Interface son necesarias para IShellFolder Interface y se requiere una implementación mínima de IShellFolder Interface para IContextMenu e IExtractIcon.
Nota
Se debe implementar el mismo identificador de clase (CLSID) para IPersist, IPersistFolder e IShellFolder.
Para obtener más información sobre cómo crear un almacén de datos de Shell para admitir un controlador de protocolos, consulte Implementación de las interfaces básicas de objetos de carpeta.
IPersist
La interfaz IPersist define el método único GetClassID, que está diseñado para proporcionar el CLSID de un objeto que se puede almacenar de forma persistente en el sistema.
Método | Descripción |
---|---|
GetClassID | Devuelve el CLSID del objeto de almacén de datos de Shell. |
IPersistFolder
La interfaz IPersistFolder se usa para inicializar objetos de carpeta de Shell. La implementación de esta interfaz, que se deriva de IPersist, es cómo se le indica a la carpeta dónde se encuentra en el espacio de nombres de Shell. Esta interfaz no se usa directamente. Lo usa la implementación del sistema de archivos del método IShellFolder::BindToObject cuando inicializa un objeto de carpeta shell.
Método | Descripción |
---|---|
Initialize | Indica a un objeto de carpeta de Shell que se inicialice en función de la información pasada y devuelva S_OK |
IShellFolder
La interfaz IShellFolder Interface se usa para administrar carpetas y se requiere una implementación parcial para que las interfaces de icono y contexto implementadas para un controlador de protocolo se comporten correctamente en la interfaz de usuario de resultados de Windows Search. La mayor parte de la funcionalidad necesaria se expone a través del método GetUIObjectOf . Este método permite que un complemento consulte las interfaces IExtractIcon e IContextMenu .
La interfaz IShellFolder Interface usa PIDLs en lugar de direcciones URL. A diferencia de los requisitos de un almacén de datos de Shell completo, los complementos pueden usar una estructura IDL sencilla que contenga solo la dirección URL.
Se deben implementar los métodos siguientes de IShellFolder Interface . Cinco de estos métodos requieren una implementación mínima.
Método | Descripción |
---|---|
BindToObject | Devuelve E_NOTIMPL |
BindToStorage | Devuelve E_NOTIMPL |
CreateViewObject | Devuelve E_NOTIMPL |
SetNameOf | Devuelve E_NOTIMPL |
ParseDisplayName | Convierte una dirección URL en la estructura PIDL. |
CompareIDs | Compara dos valores PIDL. |
GetDisplayNameOf | Devuelve la dirección URL de un PIDL. |
GetUIObjectOf | Este método es similar al método IUnknown::QueryInterface. Si se solicita un icono, el autor de la llamada solicita el IID_IExtractIcon; si se solicita un menú contextual, el autor de la llamada solicita el IID_IContextMenu |
IShellFolder no se usa para enumerar carpetas. Esto significa que el nombre para mostrar de una carpeta será la dirección URL física. En el futuro, esto puede cambiar.
IContextMenu
Cuando Windows Search muestra los resultados al usuario, el usuario puede hacer clic con el botón derecho en un elemento y ver un menú contextual definido por la interfaz IContextMenu . Los menús contextuales también se conocen como menús contextuales.
La acción predeterminada en el menú contextual es la misma acción realizada cuando se hace doble clic en el elemento. Sin las interfaces IShellFolder o IContextMenu correspondientes para el elemento, el comportamiento predeterminado de un evento de doble clic es pasar la dirección URL como argumento a la función ShellExecute Function .
Consulte Crear controladores de menú contextual para obtener más información sobre cómo crear controladores de menú contextual y Ejemplo: Extensiones de shell para controladores de protocolo para código de ejemplo.
IExtractIcon
IExtractIcon recupera un icono para la interfaz de usuario de Windows Search basada en la dirección URL del PIDL proporcionado por el controlador de protocolo.
Consulte Crear controladores de iconos para obtener más información sobre cómo crear controladores de iconos y Ejemplo: Extensiones de shell para controladores de protocolo para código de ejemplo.
IPreviewHandler
IPreviewHandler representa una vista previa enriquecida de un elemento seleccionado en el Explorador de Windows. Las versiones preliminares están disponibles en Windows Search 4.0 o en Windows Vista con Windows Desktop Search 3.x.
Para crear un controlador de vista previa personalizado:
Implemente un IPreviewHandler que tome un IStream siguiendo las instrucciones proporcionadas en Controladores de vista previa.
Registre el controlador de vista previa:
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>}
Complete los dos pasos siguientes para implementar una carpeta de Shell para la dirección URL:
En IShellFolder::GetUIObjectOf (Método), controle IQueryAssociations y devuelva la asociación para los elementos de Shell, como se muestra en el ejemplo de código siguiente.
CComPtr<IQueryAssociations> spqa; AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa); spqa->Init(0, L"Your_Object_Type", NULL, NULL); spqa->QueryInterface(riid, ppvReturn);
Después de que shell consulte la carpeta shell del flujo de datos para inicializar el controlador de vista previa, vaya al método IShellFolder::BindToObject Method , controle IID_IStream y devuelva un IStream a la dirección URL.
Para reutilizar un controlador de vista previa existente para el tipo de archivo, siga estos dos pasos:
- Registre ese controlador de vista previa para el tipo de archivo mediante el CLSID del controlador de vista previa existente en lugar de <Your_PreviewHandler_GUID>.
- Implemente una carpeta shell.
Para obtener más información sobre cómo crear controladores de vista previa, vea IPreviewHandler y Controladores de vista previa.
Recursos adicionales
- Para obtener información general sobre el proceso de indexación, consulte El proceso de indexación.
- Para obtener información sobre cómo crear controladores, vea Registrar extensiones de shell, Crear controladores de extensiones de shell, menú contextual, extensiones de espacio de nombres de shell y controladores de vista previa.
Temas relacionados
-
Conceptual
-
Ejemplo de código: Extensiones de shell para controladores de protocolo
-
Creación de un conector de búsqueda para un controlador de protocolo