Registrando manipuladores de extensão de 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 do Shell.

Sempre que você cria ou altera 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 poderá não ser reconhecida até que o sistema seja reinicializado.

Há 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 .

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 apartment. 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 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 discute os seguintes assuntos:

Nomes de manipulador

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

Manipulador Interface Nome da subchave do manipulador
Manipulador de provedor de colunas IColumnProvider ColumnHandlers
Manipulador de menu de atalho Icontextmenu ContextMenuHandlers
Manipulador de copyhook ICopyHook CopyHookHandlers
Manipulador do tipo "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 remoção Idroptarget DropHandler
Manipulador de ícones IExtractIconA/W IconHandler
Manipulador de imagens em miniatura IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Manipulador de infodicas IQueryInfo {00021500-0000-0000-C000-000000000046}
Link do Shell (ANSI) IShellLinkA {000214EE-0000-0000-C000-000000000046}
Link do Shell (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 à barra de tarefas {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

As subchaves especificadas para adicionar Pin ao 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 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, folha de propriedades, verbos
Pasta Todas as pastas Menu de atalho, folha de propriedades, verbos
Diretório Pastas de arquivos Menu de atalho, folha de propriedades, verbos
Directory\Background Plano de fundo da pasta de arquivos Somente menu de atalho
DesktopBackground Plano de fundo da área de trabalho (Windows 7 e superior) Menu de atalho, verbos
Dirigir Todas as unidades no MyComputer, 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
Impressoras Todas as impressoras Menu de Atalho, Folha 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 em segundo plano da pasta de arquivos é acessado clicando com o botão direito do mouse em uma pasta de arquivo, mas não sobre nenhum conteúdo da pasta.
  • "Verbos" são comandos especiais registrados em HKEY_CLASSES_ROOT\Verbo doShell\de Subchave\.
  • ParaTipo\#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 é 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 do 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 registro de manipulador de extensão

Para habilitar um manipulador específico, crie uma subchave na subchave de tipo de 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 name para 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 folha de propriedades e menu de atalho, 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 do Shell