Partilhar via


Registrando manipuladores de extensão do shell

Um objeto 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ê criar ou alterar um manipulador de extensão do 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 pode não ser reconhecida até que o sistema seja reinicializado.

Existem alguns fatores adicionais que se aplicam aos sistemas Windows 2000. Para obter detalhes, consulte a seção Registrando manipuladores de extensão de shell em sistemas Windows 2000.

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 Windows Software Development Kit (SDK). 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, deve-se também criar uma subchave InprocServer32 debaixo da subchave GUID com o valor (Default) definido como o caminho da DLL do manipulador. Use o modelo de rosca de apartamento. Um exemplo é mostrado aqui:

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

Sempre que o Shell executa uma ação que pode envolver um manipulador de extensão do Shell, ele verifica a subchave do Registro apropriada. 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 contexto ativado quando o Shell exibe um menu de contexto para um membro de um tipo de arquivo . Nesse caso, o manipulador deve ser registado sob a subchave ProgID do tipo de arquivo.

Este tópico aborda os seguintes assuntos:

Nomes dos manipuladores

Para habilitar um manipulador de extensão Shell, crie uma subchave com o nome da subchave do manipulador (veja abaixo) sob a subchave ShellEx de ProgID (para tipos de arquivo) ou sob o nome do tipo de objeto 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 abaixo da subchave "Nome da subchave do manipulador" nomeada como a versão da cadeia de caracteres do identificador de classe (CLSID) da extensão do Shell. Várias extensões podem ser registradas sob o nome da subchave do manipulador criando várias subchaves.

Handler Interface Nome da subchave do manipulador
Manipulador do provedor de coluna IColumnProvider ColumnHandlers
Manipulador de menu de atalho IContextMenu ContextMenuHandlers
Manipulador Copyhook ICopyHook CopyHookHandlers
Manipulador de arrastar e soltar IContextMenu DragDropHandlers
Manipulador de ficha 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. Apenas uma extensão pode ser registrada para esses manipuladores.

Manipulador Interface Nome da subchave do manipulador
Manipulador de dados IDataObject ManipuladorDeDados
Manipulador de drop IDropTarget DropHandler
Manipulador de ícones IExtractIconA/W IconHandler
Manipulador de imagens em miniatura IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Manipulador de dica de informações IQueryInfo {00021500-0000-0000-C000-000000000046}
Atalho do shell (ANSI) IShellLinkA {000214EE-0000-0000-C000-000000000046}
Link do comando (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Armazenamento estruturado IStorage {0000000B-0000-0000-C000-000000000046}
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 Pin ao Menu Iniciar e Pin à Barra de Tarefas ao menu de atalho de um item só são necessárias para tipos de ficheiro 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 sob a 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 ficheiros Menu de Atalho, Folha de Propriedades, Verbos (veja abaixo)
AllFileSystemObjects Todos os ficheiros e pastas de ficheiros Menu de Atalho, Folha de Propriedades, Verbos
Pasta Todas as pastas Menu de Atalho, Folha de Propriedades, Verbos
Diretório Pastas de ficheiros Menu de Atalho, Folha de Propriedades, Verbos
Directory\Background Fundo da pasta de ficheiros Apenas menu de atalho
DesktopBackground Fundo do ambiente de trabalho (Windows 7 e superior) Menu de Atalho, Verbos
Drive Todas as unidades em 'O 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
Rede\Tipo\# Todos os objetos do tipo # (veja abaixo) Menu de Atalho, Folha de Propriedades, Verbos
NetShare Todas as partilhas de rede Menu de Atalho, Folha de Propriedades, Verbos
NetServer Todos os servidores de rede Menu de Atalho, Ficha de Propriedades, Verbos
network_provider_name Todos os objetos fornecidos pelo provedor de rede "network_provider_name" Menu de Atalho, Folha de Propriedades, Verbos
Impressoras Todas as impressoras Menu de Atalho, Folha de Propriedades
CD de Áudio CD de áudio na unidade de CD Apenas 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 arquivos é 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 sob HKEY_CLASSES_ROOT\Subchave\Shell\Verb.
  • Para o Tipo de Rede \\#, "#" é um código de tipo de provedor de rede em decimal. O código de tipo de provedor de rede é a palavra alta de um tipo de rede. A lista de tipos de rede é dada 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\Network\Type\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 Networking estiver instalado, seu nome de provedor será "Microsoft Windows Network" e o network_provider_name correspondente será Microsoft_Windows_Network.

Exemplo de um registo de manipulador de extensão

Para habilitar um manipulador específico, crie uma subchave sob a subchave do tipo manipulador de extensão com o nome do 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 para a forma de cadeia de texto do GUID do manipulador.

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

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 de Shell