Adicionar ícones, visualizações e menus de atalho

Para garantir que seus dados sejam indexados e apresentados corretamente ao usuário durante as pesquisas, você precisa implementar armazenamentos de dados do Shell (também conhecidos como Extensões de Namespace do Shell) e manipuladores de tipo de arquivo (também conhecidos como extensões do Shell, manipuladores de extensões ou manipuladores de extensão do Shell).

Este tópico descreve as seguintes interfaces:

Implementando manipuladores de tipo de arquivo

Essas extensões do Shell ou manipuladores de tipo de arquivo fornecem aos usuários as seguintes experiências de Shell:

  • A exibição de resultados exibe um ícone específico para o tipo de item.
  • A exibição de resultados exibe uma visualização do item quando o usuário seleciona o item.
  • Os usuários podem clicar duas vezes em itens para iniciar eventos como abrir o arquivo.
  • Os usuários podem clicar com o botão direito do mouse em itens para acessar um menu de atalho (contexto).
  • Os usuários podem arrastar e soltar itens.

Como todos os objetos COM (Component Object Model), os manipuladores de tipo de arquivo devem implementar uma interface IUnknown e uma fábrica de classes.

No Windows XP ou anterior, os manipuladores também devem implementar:

No Windows Vista, a Interface IPersistFile e a Interface IShellExtInit foram substituídas pelas três interfaces a seguir para o Shell inicializar o manipulador:

Para fornecer uma experiência de usuário razoável, você deve fornecer um armazenamento de dados do Shell com seu manipulador de protocolo. Em seguida, esse armazenamento de dados serve como a "fábrica" para manipuladores de ícones, manipuladores de menu de atalho, manipuladores de visualização e assim por diante. Implementações mínimas da Interface IPersist e da Interface IPersistFolder são exigidas pela Interface IShellFolder e uma implementação mínima da Interface IShellFolder é necessária para iContextMenu e IExtractIcon.

Observação

O mesmo CLSID (identificador de classe) deve ser implementado para IPersist, IPersistFolder e IShellFolder.

 

Para obter mais informações sobre como criar um armazenamento de dados do Shell para dar suporte a um manipulador de protocolo, consulte Implementando as Interfaces básicas de objeto de pasta.

IPersist

A interface IPersist define o método único GetClassID, que foi projetado para fornecer o CLSID de um objeto que pode ser armazenado persistentemente no sistema.

Método Descrição
Getclassid Retorna o CLSID do objeto de armazenamento de dados shell

 

IPersistFolder

A interface IPersistFolder é usada para inicializar objetos de pasta shell. A implementação dessa interface, que é derivada do IPersist, é como a pasta é informada onde ela está no namespace do Shell. Você não usa essa interface diretamente. Ele é usado pela implementação do sistema de arquivos do Método IShellFolder::BindToObject quando inicializa um objeto de pasta shell.

Método Descrição
Initialize Instrui um objeto de pasta shell a se inicializar com base nas informações passadas e retorna S_OK

 

Ishellfolder

A interface IShellFolder Interface é usada para gerenciar pastas e uma implementação parcial é necessária para que o ícone e as interfaces de contexto implementadas para um manipulador de protocolo se comportem corretamente na interface do usuário de resultados da Pesquisa do Windows. A maior parte da funcionalidade necessária é exposta por meio do método GetUIObjectOf . Esse método permite que um suplemento consulte as interfaces IExtractIcon e IContextMenu .

A interface IShellFolder Interface usa PIDLs em vez de URLs. Ao contrário dos requisitos de um armazenamento de dados do Shell completo, os suplementos podem usar uma estrutura de IDL simples que contém apenas a URL.

Os métodos a seguir da Interface IShellFolder devem ser implementados. Cinco desses métodos exigem implementação mínima.

Método Descrição
Bindtoobject Retorna E_NOTIMPL
Bindtostorage Retorna E_NOTIMPL
CreateViewObject Retorna E_NOTIMPL
SetNameOf Retorna E_NOTIMPL
Parsedisplayname Converte uma URL na estrutura PIDL
CompareIDs Compara dois valores de PIDL
GetDisplayNameOf Retorna a URL de um PIDL
GetUIObjectOf Esse método é semelhante ao Método IUnknown::QueryInterface. Se um ícone for solicitado, o chamador solicitará o IID_IExtractIcon; se um menu de atalho for solicitado, o chamador solicitará o IID_IContextMenu

 

IShellFolder não é usado para enumerar pastas. Isso significa que o nome de exibição de uma pasta será a URL física. Isso pode mudar no futuro.

Icontextmenu

Quando a Pesquisa do Windows exibe resultados para o usuário, o usuário pode clicar com o botão direito do mouse em um item e ver um menu de atalho definido pela interface IContextMenu . Os menus de atalho também são conhecidos como menus de contexto.

A ação padrão no menu de contexto é a mesma ação executada quando o item é clicado duas vezes. Sem as interfaces IShellFolder ou IContextMenu correspondentes para o item, o comportamento padrão de um evento de clique duplo é passar a URL como um argumento para a função ShellExecute Function .

Consulte Criando manipuladores de menu de contexto para obter mais informações sobre como criar manipuladores de menu de atalho e Exemplo: Extensões de shell para manipuladores de protocolo para código de exemplo.

IExtractIcon

IExtractIcon recupera um ícone para a interface do usuário da Pesquisa do Windows com base na URL no PIDL fornecido pelo manipulador de protocolo.

Consulte Criando manipuladores de ícones para obter mais informações sobre como criar manipuladores de ícone e Exemplo: Extensões de shell para manipuladores de protocolo para código de exemplo.

IPreviewHandler

O IPreviewHandler renderiza uma visualização avançada de um item selecionado no Windows Explorer. As visualizações estão disponíveis no Windows Search 4.0 ou no Windows Vista com o Windows Desktop Search 3.x.

Para criar um manipulador de visualização personalizado:

  1. Implemente um IPreviewHandler que usa um IStream, seguindo as diretrizes fornecidas em Manipuladores de Visualização.

  2. Registre seu manipulador de visualização:

    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. Conclua as duas etapas a seguir para implementar uma pasta shell para sua URL:

    1. No Método IShellFolder::GetUIObjectOf, manipule IQueryAssociations e retorne sua associação para seus itens do Shell, conforme mostrado no exemplo de código a seguir.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Depois que o Shell consultar sua pasta Shell para o fluxo de dados para inicializar o manipulador de visualização, vá para o método método IShellFolder::BindToObject , manipule IID_IStream e retorne um IStream à URL.

Para reutilizar um manipulador de visualização existente para o tipo de arquivo, siga estas duas etapas:

  1. Registre esse manipulador de visualização para o tipo de arquivo usando o CLSID do manipulador de visualização existente no lugar de <Your_PreviewHandler_GUID>.
  2. Implementar uma pasta shell.

Para obter mais informações sobre como criar manipuladores de visualização, consulte Manipuladores IPreviewHandler e Preview.

Recursos adicionais

Conceitual

Desenvolvendo manipuladores de protocolo

Noções básicas sobre manipuladores de protocolo

Notificando o índice de alterações

Exemplo de código: extensões de shell para manipuladores de protocolo

Instalando e registrando manipuladores de protocolo

Criando um conector de pesquisa para um manipulador de protocolo

Manipuladores de protocolo de depuração