Registrando manipuladores de extensão do Shell

Um objeto de manipulador de extensão shell deve ser registrado antes que o Shell possa usá-lo. Este tópico é uma discussão geral sobre como registrar um manipulador de extensão shell.

Sempre que você cria ou altera um manipulador de extensão shell, é importante notificar o sistema de que você fez uma alteração. Faça isso chamando SHChangeNotify, especificando o evento SHCNE_ASSOCCHANGED . Se você não chamar SHChangeNotify, a alteração poderá não ser reconhecida até que o sistema seja reinicializado.

Há alguns fatores adicionais que se aplicam a sistemas Windows 2000. Para obter detalhes, consulte a seção Registrar manipuladores de extensão do Shell na seção Windows 2000 Systems.

Assim como acontece com todos os objetos COM (Component Object Model), você deve criar um GUID para o manipulador usando uma ferramenta como Guidgen.exe, que é fornecida com o SDK (Software Development Kit) do Windows. Crie uma subchave em HKEY_CLASSES_ROOT\CLSID cujo nome é a forma de cadeia de caracteres desse GUID. Como os manipuladores de extensão do Shell são servidores em processo, você também deve criar uma subchave InprocServer32 sob essa subchave GUID com o valor (Padrão) definido como o caminho da DLL do manipulador. Use o modelo de threading de apartamento. Um exemplo é mostrado aqui:

HKEY_CLASSES_ROOT
   CLSID
      {00021500-0000-0000-C000-000000000046}
         InprocServer32
            (Default) = %windir%\System32\Example.dll
            ThreadingModel = Apartment

Importante

ThreadingModel deve ser Apartment para manipuladores de extensões do shell. As exibições de pasta do Shell e o Explorer são executados em um thread sta (apartamento de thread único). O uso dos modelos de threading Free ou Both pode causar falhas intermitentes, impasses ou travamentos difíceis de diagnosticar.

Para aplicativos de área de trabalho empacotados (MSIX), prefira o registro baseado no manifesto usando o elemento desktop4:Extension em vez de gravar chaves do Registro diretamente. Isso garante a identidade adequada do pacote e uma desinstalação sem resíduos.

Sempre que o Shell executa uma ação que pode envolver um manipulador de extensão shell, ele verifica a subchave apropriada do Registro. A subchave sob a qual um manipulador de extensão é registrado controla quando ele será chamado. Por exemplo, é uma prática comum ter um manipulador de menu de atalho chamado quando o Shell exibe um menu de atalho para um membro de um tipo de arquivo. Nesse caso, o manipulador deve ser registrado na subchave ProgID do tipo de arquivo.

Este tópico aborda os seguintes assuntos:

Nomes de manipuladores

Para habilitar um manipulador de extensão do Shell, crie uma subchave com o nome da subchave do manipulador (veja abaixo) sob a subchave ShellEx de ProgID (para tipos de arquivo) ou do nome do tipo de objeto do Shell (para predefined_shell_objects).

Por exemplo, se você quiser registrar um manipulador de extensão de menu de atalho para MyProgram.1, comece criando a seguinte subchave:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Para os manipuladores a seguir, crie uma subchave sob a subchave "Handler Subkey name", com o nome correspondente à representação em cadeia de caracteres do identificador de classe (CLSID) da extensão do Shell. Várias extensões podem ser registradas no nome da subchave do manipulador criando várias subchaves.

Manipulador Interface Nome da subchave do manipulador
Manipulador do provedor de colunas IColumnProvider ColumnHandlers
Manipulador de menu de atalho IContextMenu ContextMenuHandlers
Manipulador de Copyhook ICopyHook CopyHookHandlers
Manipulador de arrastar e soltar IContextMenu DragDropHandlers
Manipulador de folha de propriedades IShellPropSheetExt PropertySheetHandlers

 

Para os manipuladores a seguir, o valor padrão da chave "Nome da Subchave do Manipulador" é a versão da cadeia de caracteres do CLSID da extensão shell. Somente uma extensão pode ser registrada para esses manipuladores.

Manipulador Interface Nome da subchave do manipulador
Manipulador de dados IDataObject Datahandler
Manipulador de soltar IDropTarget DropHandler
Manipulador de ícones IExtractIconA/W IconHandler
Manipulador de imagem em miniatura IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Manipulador de infodicas IQueryInfo {00021500-0000-0000-C000-00000000046}
Link do Shell (ANSI) IShellLinkA {000214EE-0000-0000-C000-00000000046}
Link do Shell (UNICODE) IShellLinkW {000214F9-0000-0000-C000-00000000046}
Armazenamento estruturado IStorage {0000000B-0000-0000-C000-00000000046}
Metadados IPropertySetStorage PropertyHandler
Fixar no menu Iniciar IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
Fixar na barra de tarefas {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

As subchaves especificadas para adicionar Fixar no menu Iniciar e Fixar na Barra de Tarefas ao menu de atalho de um item são necessárias apenas para tipos de arquivo que incluem a entrada IsShortCut.

Objetos de shell predefinidos

O Shell define objetos adicionais em HKEY_CLASSES_ROOT que podem ser estendidos da mesma forma que os tipos de arquivo. Por exemplo, para adicionar um manipulador de folha de propriedades para todos os arquivos, você pode se registrar na subchave PropertySheetHandlers .

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

A tabela a seguir fornece as várias subchaves de HKEY_CLASSES_ROOT sob as quais os manipuladores de extensão podem ser registrados. Observe que muitos manipuladores de extensão não podem ser registrados em todas as subchaves listadas. Para obter mais detalhes, consulte a documentação do manipulador específico.

Subchave Descrição Manipuladores possíveis
* Todos os arquivos Menu de atalho, folha de propriedades, verbos (veja abaixo)
AllFileSystemObjects Todos os arquivos e pastas de arquivo Menu de Atalho, Página de Propriedades, Verbos
Folder Todas as pastas Menu de Atalho, Página de Propriedades, Verbos
Directory Pastas de arquivo Menu de Atalho, Folha de Propriedades, Verbos
Directory\Background Plano de fundo da pasta de arquivo Menu de atalho apenas
DesktopBackground Plano de fundo da área de trabalho (Windows 7 e superior) Menu de atalho, verbos
Unidade Todas as unidades em Meu Computador, como "C:\" Menu de Atalho, Folha de Propriedades, Verbos
Rede Rede inteira (em Meus Locais de Rede) Menu de Atalho, Folha de Propriedades, Verbos
Network\Type\ # Todos os objetos do tipo # (veja abaixo) Menu de Atalho, Folha de Propriedades, Verbos
Netshare Todos os compartilhamentos de rede Menu de Atalho, Folha de Propriedades, Verbos
NetServer Todos os servidores de rede Menu de Atalho, Folha de Propriedades, Verbos
network_provider_name Todos os objetos fornecidos pelo provedor de rede "network_provider_name" Menu de Atalho, Folha de Propriedades, Verbos
Printers Todas as impressoras Menu de atalho, Página de propriedades
AudioCD CD de áudio na unidade de CD Somente verbos
DVD Unidade de DVD (Windows 2000) Menu de Atalho, Folha de Propriedades, Verbos

 

Observações

  • O menu de atalho de plano de fundo da pasta de arquivo é acessado clicando com o botão direito do mouse em uma pasta de arquivo, mas não sobre qualquer conteúdo da pasta.
  • "Verbos" são comandos especiais registrados em HKEY_CLASSES_ROOT\Subchave\Shell\Verbo.
  • Para Rede\Tipo\#, "#" é um código decimal do tipo de provedor de rede. O código de tipo de provedor de rede é a palavra alta de um tipo de rede. A lista de tipos de rede é fornecida no arquivo de cabeçalho Winnetwk.h (valores WNNC_NET_*). Por exemplo, WNNC_NET_SHIVA é 0x00330000, portanto, a subchave de tipo correspondente seria HKEY_CLASSES_ROOT\Tipo\ deRede\51.
  • "network_provider_name" é um nome de provedor de rede, conforme especificado por WNetGetProviderName, com os espaços convertidos em sublinhados. Por exemplo, se o provedor de rede Microsoft estiver instalado, seu nome de provedor será "rede Microsoft Windows" e o network_provider_name correspondente será Microsoft_Windows_Network.

Exemplo de registro de um manipulador de extensão

Para habilitar um manipulador específico, crie uma subchave sob a subchave do tipo de manipulador de extensão com o nome desse manipulador. O Shell não usa o nome do manipulador, mas deve ser diferente de todos os outros nomes sob essa subchave de tipo. Defina o valor padrão da subchave de nome como a forma de cadeia de caracteres do GUID do manipulador.

O exemplo a seguir ilustra entradas do Registro que habilitam manipuladores de extensão de menu de atalho e de folha de propriedades, usando como exemplo o tipo de arquivo .myp.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   CLSID
      {00000000-1111-2222-3333-444444444444}
         InProcServer32
            (Default) = C:\MyDir\MyCommand.dll
            ThreadingModel = Apartment
      {11111111-2222-3333-4444-555555555555}
         InProcServer32
            (Default) = C:\MyDir\MyPropSheet.dll
            ThreadingModel = Apartment
   MyProgram.1
      (Default) = MyProgram Application
      Shellex
         ContextMenuHandler
            MyCommand
               (Default) = {00000000-1111-2222-3333-444444444444}
         PropertySheetHandlers
            MyPropSheet
               (Default) = {11111111-2222-3333-4444-555555555555}

Inicializando manipuladores de extensão do Shell