Partilhar via


Como Criar Manipuladores do Menu de Atalho

Manipuladores de menu de atalho, também conhecidos como manipuladores de menu de contexto ou manipuladores de verbos, são um tipo de manipulador de tipo de arquivo. Esses manipuladores podem ser implementados de uma forma que faz com que eles carreguem em seu próprio processo ou no explorador, ou outros processos de terceiros 3rd. Tome cuidado ao criar manipuladores em processo, pois eles podem causar danos ao processo que os carrega.

Observação

Há considerações especiais para versões baseadas em 64 bits do Windows ao registrar manipuladores que funcionam no contexto de aplicativos de 32 bits: quando invocado no contexto de um aplicativo de bits diferentes, o subsistema WOW64 redireciona o acesso ao sistema de arquivos para alguns caminhos. Se o manipulador de .exe estiver armazenado em um desses caminhos, ele não estará acessível nesse contexto. Portanto, como solução alternativa, armazene seus .exe em um caminho que não seja redirecionado ou armazene uma versão stub do .exe que inicie a versão real.

Este tópico é organizado da seguinte maneira:

Verbos Canônicos

Os aplicativos geralmente são responsáveis por fornecer cadeias de exibição localizadas para os verbos que definem. No entanto, para fornecer um grau de independência da língua, o sistema define um conjunto padrão de verbos comumente usados chamados verbos canônicos. Um verbo canônico nunca é exibido para o usuário e pode ser usado com qualquer idioma da interface do usuário. O sistema usa o nome canônico para gerar automaticamente uma cadeia de caracteres de exibição localizada corretamente. Por exemplo, a cadeia de caracteres de exibição do verbo aberto é definida como Abrir em um sistema inglês e como o equivalente em alemão em um sistema alemão.

Verbo canônico Descrição
Aberto Abre o arquivo ou pasta.
Abrirnovo Abre o arquivo ou pasta em uma nova janela.
Imprimir Imprime o arquivo.
Impressão Permite que o usuário imprima um arquivo arrastando-o para um objeto de impressora.
Explorar Abre o Windows Explorer com a pasta selecionada.
Propriedades Abre a folha de propriedades do objeto.

Observação

O verbo Printto também é canônico, mas nunca é exibido. Sua inclusão permite que o usuário imprima um arquivo arrastando-o para um objeto de impressora.

Os manipuladores de menu de atalho podem fornecer seus próprios verbos canônicos por meio de IContextMenu::GetCommandString com GCS_VERBW ou GCS_VERBA. O sistema usará os verbos canônicos como o segundo parâmetro (lpOperation) passado para ShellExecute, e é o CMINVOKECOMMANDINFO.O membro lpVerb passou para o método IContextMenu::InvokeCommand.

Verbos estendidos

Quando o usuário clica com o botão direito do mouse em um objeto, o menu de atalho exibe os verbos padrão. Talvez você queira adicionar e oferecer suporte a comandos em alguns menus de atalho que não são exibidos em todos os menus de atalho. Por exemplo, você pode ter comandos que não são comumente usados ou que são destinados a usuários experientes. Por esse motivo, você também pode definir um ou mais verbos estendidos. Esses verbos são semelhantes aos verbos normais, mas se distinguem dos verbos normais pela maneira como são registrados. Para ter acesso a verbos estendidos, o usuário deve clicar com o botão direito do mouse em um objeto enquanto pressiona a tecla SHIFT. Quando o usuário faz isso, os verbos estendidos são exibidos além dos verbos padrão.

Você pode usar o Registro para definir um ou mais verbos estendidos. Os comandos associados serão exibidos somente quando o usuário clicar com o botão direito do mouse em um objeto enquanto também pressiona a tecla SHIFT. Para definir um verbo como estendido, adicione um valor de REG_SZ "estendido" à subchave do verbo. O valor não deve ter nenhum dado associado a ele.

Verbos somente de acesso programático

Esses verbos nunca são exibidos em um menu de contexto. Eles podem ser acessados usando ShellExecuteEx e especificando o campo lpVerb do parâmetro pExecInfo (um objeto SHELLEXECUTEINFO). Para definir um verbo apenas como acesso programático, adicione um valor de REG_SZ "ProgrammaticAccessOnly" à subchave do verbo. O valor não deve ter nenhum dado associado a ele.

Você pode usar o Registro para definir um ou mais verbos estendidos. Os comandos associados serão exibidos somente quando o usuário clicar com o botão direito do mouse em um objeto enquanto também pressiona a tecla SHIFT. Para definir um verbo como estendido, adicione um valor de REG_SZ "estendido" à subchave do verbo. O valor não deve ter nenhum dado associado a ele.

Personalizando um menu de atalho usando verbos estáticos

Depois de escolher um verbo estático ou dinâmico para o menu de atalho, você pode estender o menu de atalho para um tipo de arquivo registrando um verbo estático para o tipo de arquivo. Para fazer isso, adicione uma subchave do Shell abaixo da subchave para o ProgID do aplicativo associado ao tipo de arquivo. Opcionalmente, você pode definir um verbo padrão para o tipo de arquivo tornando-o o valor padrão da subchave Shell .

O verbo padrão é exibido primeiro no menu de atalho. Seu objetivo é fornecer ao Shell um verbo que ele pode usar quando a função ShellExecuteEx é chamada, mas nenhum verbo é especificado. O Shell não seleciona necessariamente o verbo padrão quando ShellExecuteEx é usado dessa maneira.

O Shell usa o primeiro verbo disponível na seguinte ordem:

  1. O verbo padrão
  2. O primeiro verbo no registro, se a ordem verbal for especificada
  3. O verbo Abrir
  4. O Abrir com verbo

Se nenhum dos verbos listados estiver disponível, a operação falhará.

Crie uma subchave para cada verbo que você deseja adicionar sob a subchave Shell. Cada uma dessas subchaves deve ter um valor de REG_SZ definido para a cadeia de caracteres de exibição do verbo (cadeia de caracteres localizada). Para cada subchave de verbo, crie uma subchave de comando com o valor padrão definido como a linha de comando para ativar os itens. Para verbos canônicos, como Abrir e Imprimir, você pode omitir a cadeia de caracteres de exibição porque o sistema exibe automaticamente uma cadeia de caracteres localizada corretamente. Para verbos não canônicos, se você omitir a cadeia de caracteres de exibição, a cadeia de caracteres do verbo será exibida.

No exemplo do Registro a seguir, observe que:

  • Como Doit não é um verbo canônico, é atribuído um nome de exibição, que pode ser selecionado pressionando a tecla D.
  • O verbo Printto não aparece no menu de atalho. No entanto, sua inclusão no registro permite que o usuário imprima arquivos soltando-os em um ícone de impressora.
  • Uma subchave é mostrada para cada verbo. %1 representa o nome do arquivo e %2 o nome da impressora.
HKEY_CLASSES_ROOT
   .myp-ms
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = My Program Application
      Shell
         (Default) = doit
         doit
            (Default) = &Do It
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         open
            command
               (Default) = c:\MyDir\MyProgram.exe /d "%1"
         print
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1"
         printto
            command
               (Default) = c:\MyDir\MyProgram.exe /p "%1" "%2"

O diagrama a seguir ilustra a extensão do menu de atalho de acordo com as entradas do Registro acima. Este menu de atalho tem os verbos Abrir, Fazer e Imprimir em seu menu, com Do It como o verbo padrão.

captura de tela do menu de atalho de verbo padrão do it

Ativando o manipulador usando a interface IDropTarget

O intercâmbio dinâmico de dados (DDE) foi preterido; em vez disso, use IDropTarget. IDropTarget é mais robusto e tem melhor suporte à ativação porque usa a ativação COM do manipulador. No caso da seleção de vários itens, IDropTarget não está sujeito às restrições de tamanho de buffer encontradas no DDE e no CreateProcess. Além disso, os itens são passados para o aplicativo como um objeto de dados que pode ser convertido em uma matriz de itens usando a função SHCreateShellItemArrayFromDataObject. Isso é mais simples e não perde informações de namespace, como ocorre quando o item é convertido em um caminho para protocolos de linha de comando ou DDE.

Para obter mais informações sobre IDropTarget e consultas Shell para atributos de associação de arquivo, consulte Tipos percebidos e registro de aplicativo.

Especificando a posição e a ordem dos verbos estáticos

Normalmente, os verbos são ordenados em um menu de atalho com base em como eles são enumerados; A enumeração é baseada primeiro na ordem da matriz de associação e, em seguida, na ordem dos itens na matriz de associação, conforme definido pela ordem de classificação do registro.

Os verbos podem ser ordenados especificando o valor padrão da subchave Shell para a entrada de associação. Esse valor padrão pode incluir um único item, que será exibido na posição superior do menu de atalho, ou uma lista de itens separados por espaços ou vírgulas. Neste último caso, o primeiro item da lista é o item padrão, e os outros verbos são exibidos imediatamente abaixo dele na ordem especificada.

Por exemplo, a seguinte entrada do Registro produz verbos de menu de atalho na seguinte ordem:

  1. Exibição
  2. Gadgets
  3. Personalização
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell
         Display
         Gadgets
         Personalization

Da mesma forma, a seguinte entrada do Registro produz verbos de menu de atalho na seguinte ordem:

  1. Personalização
  2. Gadgets
  3. Exibição
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Posicionar verbos na parte superior ou inferior do menu

O atributo do Registro a seguir pode ser usado para colocar um verbo na parte superior ou inferior do menu. Se houver vários verbos que especificam esse atributo, o último a fazê-lo terá prioridade:

Position=Top | Bottom 

Criando menus estáticos em cascata

No Windows 7 e posterior, a implementação de menu em cascata é suportada por meio das configurações do Registro. Antes do Windows 7, a criação de menus em cascata só era possível através da implementação da interface IContextMenu. No Windows 7 e posterior, você deve recorrer a soluções baseadas em código COM somente quando os métodos estáticos são insuficientes.

A captura de tela a seguir fornece um exemplo de um menu em cascata.

captura de tela mostrando um exemplo de um menu em cascata

No Windows 7 e posterior, há três maneiras de criar menus em cascata:

Criando menus em cascata com a entrada do Registro SubCommands

No Windows 7 e posterior, você pode usar a entrada Subcomandos para criar menus em cascata usando o procedimento a seguir.

Para criar um menu em cascata usando a entrada SubComandos

  1. Crie uma subchave em HKEY_CLASSES_ROOT shell ProgID\para representar seu\menu em cascata. Neste exemplo, damos a essa subchave o nome CascadeTest. Verifique se o valor padrão da subchave CascadeTest está vazio e é mostrado como (valor não definido).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
    
  2. Para sua subchave CascadeTest , adicione uma entrada MUIVerb do tipo REG_SZ e atribua-lhe o texto que aparecerá como seu nome no menu de atalho. Neste exemplo, atribuímos a ele "Test Cascade Menu".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. Para sua subchave CascadeTest , adicione uma entrada SubCommands do tipo REG_SZ que é atribuída lista, delimitada por ponto-e-vírgula, dos verbos que devem aparecer no menu, na ordem de aparência. Por exemplo, aqui atribuímos uma série de verbos fornecidos pelo sistema:

    HKEY_CLASSES_ROOT
       *
          Shell
             CascadeTest
                SubCommands
                Windows.delete;Windows.properties;Windows.rename;Windows.cut;Windows.copy;Windows.paste
    
  4. No caso de verbos personalizados, implemente-os usando qualquer um dos métodos de implementação de verbos estáticos e liste-os sob a subchave CommandStore, conforme mostrado neste exemplo para um verbo fictício VerbName:

    HKEY_LOCAL_MACHINE
       Software
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      CommandStore
                         Shell
                            VerbName
                            command
                               (Default) = notepad.exe %1
    

Observação

Esse método tem a vantagem de que os verbos personalizados podem ser registrados uma vez e reutilizados listando o nome do verbo na entrada SubCommands. No entanto, ele requer que o aplicativo tenha permissão para modificar o registro sob HKEY_LOCAL_MACHINE.

 

Criando menus em cascata com a entrada do Registro ExtendedSubCommandsKey

No Windows 7 e posterior, você pode usar a entrada ExtendedSubCommandKey para criar menus em cascata estendidos: menus em cascata dentro de menus em cascata.

A captura de tela a seguir é um exemplo de um menu em cascata estendido.

Captura de tela mostrando o menu em cascata estendido para dispositivos

Como HKEY_CLASSES_ROOT é uma combinação de HKEY_CURRENT_USER e HKEY_LOCAL_MACHINE, você pode registrar quaisquer verbos personalizados sob a subchave Classes de Software\HKEY_CURRENT_USER\. A principal vantagem de fazer isso é que a permissão elevada não é necessária. Além disso, outras associações de arquivo podem reutilizar todo esse conjunto de verbos especificando a mesma subchave ExtendedSubCommandsKey. Se você não precisar reutilizar esse conjunto de verbos, poderá listar os verbos sob o pai, mas verifique se o valor Padrão do pai está vazio.

Para criar um menu em cascata usando uma entrada ExtendedSubCommandsKey

  1. Crie uma subchave em HKEY_CLASSES_ROOT shell ProgID\para representar seu\menu em cascata. Neste exemplo, damos a essa subchave o nome CascadeTest2. Verifique se o valor padrão da subchave CascadeTest está vazio e é mostrado como (valor não definido).

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest2
                (Default)
    
  2. Para sua subchave CascadeTest , adicione uma entrada MUIVerb do tipo REG_SZ e atribua-lhe o texto que aparecerá como seu nome no menu de atalho. Neste exemplo, atribuímos a ele "Test Cascade Menu".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu 2
    
  3. Na subchave CascadeTest que você criou, adicione uma subchave ExtendedSubCommandsKey e adicione os subcomandos do documento (de REG_SZ tipo);

    HKEY_CLASSES_ROOT
       txtfile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Layout
                   Properties
                   Select all
    

    Verifique se o valor padrão da subchave Test Cascade Menu 2 está vazio e é mostrado como (valor não definido).

  4. Preencha os subverbos usando qualquer uma das seguintes implementações de verbos estáticos. Observe que a subchave CommandFlags representa valores EXPCMDFLAGS. Se você quiser adicionar um separador antes ou depois do item de menu em cascata, use ECF_SEPARATORBEFORE (0x20) ou ECF_SEPARATORAFTER (0x40). Para obter uma descrição desses sinalizadores do Windows 7 e posteriores, consulte IExplorerCommand::GetFlags. ECF_SEPARATORBEFORE funciona apenas para os itens de menu de nível superior. MUIVerb é do tipo REG_SZ e CommandFlags é do tipo REG_DWORD.

    HKEY_CLASSES_ROOT
       txtile
          Shell
             Test Cascade Menu 2
                (Default)
                ExtendedSubCommandsKey
                   Shell
                      cmd1
                         MUIVerb = Notepad
                         command
                            (Default) = %SystemRoot%\system32\notepad.exe %1
                      cmd2
                         MUIVerb = Wordpad
                         CommandFlags = 0x20
                         command
                            (Default) = "C:\Program Files\Windows NT\Accessories\wordpad.exe" %1
    

A captura de tela a seguir é uma ilustração dos exemplos de entrada de chave do Registro anteriores.

Captura de tela mostrando um exemplo de um menu em cascata mostrando opções de bloco de notas e Wordpad

Criando menus em cascata com a interface IExplorerCommand

Outra opção para adicionar verbos a um menu em cascata é através de IExplorerCommand::EnumSubCommands. Esse método permite que fontes de dados que fornecem seus comandos de módulo de comando por meio de IExplorerCommandProvider usem esses comandos como verbos em um menu de atalho. No Windows 7 e posterior, você pode fornecer a mesma implementação de verbo usando IExplorerCommand que você pode com IContextMenu.

As duas capturas de tela a seguir ilustram o uso de menus em cascata na pasta Dispositivos .

Captura de tela que mostra um exemplo de um menu em cascata na pasta dispositivos.

A captura de tela a seguir ilustra outra implementação de um menu em cascata na pasta Dispositivos .

Captura de tela mostrando um exemplo de um menu em cascata na pasta Dispositivos

Observação

Como o IExplorerCommand oferece suporte apenas à ativação em processo, ele é recomendado para uso por fontes de dados do Shell que precisam compartilhar a implementação entre comandos e menus de atalho.

 

Obtendo comportamento dinâmico para verbos estáticos usando sintaxe de consulta avançada

A sintaxe de consulta avançada (AQS) pode expressar uma condição que será avaliada usando propriedades do item para o qual o verbo está sendo instanciado. Este sistema funciona apenas com propriedades rápidas. Essas são propriedades que a fonte de dados do Shell relata tão rapidamente ao não retornar SHCOLSTATE_SLOW de IShellFolder2::GetDefaultColumnState.

O Windows 7 e versões posteriores oferecem suporte a valores canônicos que evitam problemas em compilações localizadas. A sintaxe canônica a seguir é necessária em compilações localizadas para aproveitar esse aprimoramento do Windows 7.

System.StructuredQueryType.Boolean#True

No seguinte exemplo de entrada do Registro:

  • O valor AppliesTo controla se o verbo é exibido ou oculto.
  • O valor DefaultAppliesTo controla qual verbo é o padrão.
  • O valor HasLUAShield controla se um escudo de Controle de Conta de Usuário (UAC) é exibido.

Neste exemplo, o valor DefaultAppliesTo torna esse verbo o padrão para qualquer arquivo com a palavra "exampleText1" em seu nome de arquivo. O valor AppliesTo habilita o verbo para qualquer arquivo com "exampleText1" no nome. O valor HasLUAShield exibe o escudo para arquivos com "exampleText2" no nome.

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            DefaultAppliesTo = System.ItemName:"exampleText1"
            HasLUAShield = System.ItemName:"exampleText2"
            AppliesTo = System.ItemName:"exampleText1"

Adicione a subchave Command e um valor:

HKEY_CLASSES_ROOT
   txtile
      shell
         test.verb
            Command
               (Default) = %SystemRoot%\system32\notepad.exe %1

No registro do Windows 7, consulte HKEY_CLASSES_ROOT\unidade como um exemplo de verbos de bitlocker que empregam a seguinte abordagem:

  • AppliesTo = System.Volume.BitlockerProtection:=2
  • System.Volume.BitlockerRequiresAdmin:=System.StructuredQueryType.Boolean#True

Para obter mais informações sobre AQS, consulte Sintaxe de consulta avançada.

Preterido: Associando verbos a comandos dinâmicos de troca de dados

O DDE foi preterido; em vez disso, use IDropTarget. O DDE foi preterido porque depende de uma mensagem de janela de difusão para descobrir o servidor DDE. Um servidor DDE trava a mensagem da janela de transmissão e, portanto, trava as conversas DDE para outros aplicativos. É comum que um único aplicativo preso cause travamentos subsequentes em toda a experiência do usuário.

O método IDropTarget é mais robusto e tem melhor suporte à ativação porque usa a ativação COM do manipulador. No caso da seleção de vários itens, IDropTarget não está sujeito às restrições de tamanho de buffer encontradas no DDE e no CreateProcess. Além disso, os itens são passados para o aplicativo como um objeto de dados que pode ser convertido em uma matriz de itens usando a função SHCreateShellItemArrayFromDataObject. Isso é mais simples e não perde informações de namespace, como ocorre quando o item é convertido em um caminho para protocolos de linha de comando ou DDE.

Para obter mais informações sobre IDropTarget e consultas Shell para atributos de associação de arquivo, consulte Tipos percebidos e registro de aplicativo.

Concluindo tarefas de implementação de verbos

As tarefas a seguir para implementar verbos são relevantes para implementações de verbos estáticos e dinâmicos. Para obter mais informações sobre verbos dinâmicos, consulte Personalizando um menu de atalho usando verbos dinâmicos.

Personalizando o menu de atalho para objetos de shell predefinidos

Muitos objetos Shell predefinidos têm menus de atalho que podem ser personalizados. Registre o comando da mesma maneira que você registra tipos de arquivo típicos, mas use o nome do objeto predefinido como o nome do tipo de arquivo.

Uma lista de objetos predefinidos está na seção Objetos de Shell Predefinidos de Criando manipuladores de extensão de Shell. Os objetos Shell predefinidos cujos menus de atalho podem ser personalizados adicionando verbos no Registro são marcados na tabela com a palavra Verbo.

Estendendo um novo submenu

Quando um usuário abre o menu Arquivo no Windows Explorer, um dos comandos exibidos é Novo. A seleção desse comando exibe um submenu. Por padrão, o submenu contém dois comandos, Pasta e Atalho, que permitem aos usuários criar subpastas e atalhos. Esse submenu pode ser estendido para incluir comandos de criação de arquivo para qualquer tipo de arquivo.

Para adicionar um comando de criação de arquivo ao submenu Novo , os arquivos do aplicativo devem ter um tipo de arquivo associado. Inclua uma subchave ShellNew sob o nome do arquivo. Quando o comando Novo do menu Arquivo é selecionado, o Shell adiciona o tipo de arquivo ao submenu Novo. A cadeia de caracteres de exibição do comando é a cadeia de caracteres descritiva atribuída ao ProgID do programa.

Para especificar o método de criação de arquivo, atribua um ou mais valores de dados à subchave ShellNew . Os valores disponíveis estão listados na tabela a seguir.

ShellNovo valor de subchave Descrição
Comando Executa um aplicativo. Esse valor REG_SZ especifica o caminho do aplicativo a ser executado. Por exemplo, você pode defini-lo para iniciar um assistente.
Dados Cria um arquivo contendo dados especificados. Esse valor REG_BINARY especifica os dados do arquivo. Os dados serão ignorados se NullFile ou FileName for especificado.
FileName Cria um arquivo que é uma cópia de um arquivo especificado. Esse valor REG_SZ especifica o caminho totalmente qualificado do arquivo a ser copiado.
Arquivo nulo Cria um arquivo vazio. NullFile não tem um valor atribuído. Se NullFile for especificado, os valores do Registro Data e FileName serão ignorados.

 

O exemplo de chave do Registro e a captura de tela a seguir ilustram o submenu Novo para o tipo de arquivo .myp-ms. Ele tem um comando, MyProgram Application.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
      MyProgram.1
         ShellNew
         NullFile

A captura de tela ilustra o submenu Novo . Quando um usuário seleciona Aplicativo MyProgram no submenu Novo , o Shell cria um arquivo chamado New MyProgram Application.myp-ms e o passa para MyProgram.exe.

Captura de tela do Windows Explorer mostrando um novo comando

Criando manipuladores de arrastar e soltar

O procedimento básico para implementar um manipulador de arrastar e soltar é o mesmo que para manipuladores de menu de atalho convencionais. No entanto, os manipuladores de menu de atalho normalmente usam apenas o ponteiro IDataObject passado para o método IShellExtInit::Initialize do manipulador para extrair o nome do objeto. Um manipulador de arrastar e soltar poderia implementar um manipulador de dados mais sofisticado para modificar o comportamento do objeto arrastado.

Quando um usuário clica com o botão direito do mouse em um objeto Shell para arrastar um objeto, um menu de atalho é exibido quando o usuário tenta soltar o objeto. A captura de tela a seguir ilustra um menu de atalho típico de arrastar e soltar.

captura de tela do menu de atalho arrastar e soltar

Um manipulador de arrastar e soltar é um manipulador de menu de atalho que pode adicionar itens a esse menu de atalho. Os manipuladores de arrastar e soltar normalmente são registrados sob a seguinte subchave.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Adicione uma subchave sob a subchave DragDropHandlers nomeada para o manipulador de arrastar e soltar e defina o valor padrão da subchave para a forma de cadeia de caracteres do GUID de identificador de classe (CLSID) do manipulador. O exemplo a seguir habilita o manipulador de arrastar e soltar MyDD .

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers
            MyDD
               (Default) = {MyDD CLSID GUID}

Suprimindo verbos e controlando a visibilidade

Você pode usar as configurações de diretiva do Windows para controlar a visibilidade do verbo. Os verbos podem ser suprimidos por meio de configurações de diretiva adicionando um valor SuppressionPolicy ou um valor GUID SuppressionPolicyEx à subchave do Registro do verbo. Defina o valor da subchave SuppressionPolicy para a ID da política. Se a política estiver ativada, o verbo e sua entrada de menu de atalho associada serão suprimidos. Para obter possíveis valores de ID de política, consulte a enumeração CONSTRAINTS .

Empregando o Modelo de Seleção de Verbos

Os valores do Registro devem ser definidos para verbos para lidar com situações em que um usuário pode selecionar um único item, vários itens ou uma seleção de um item. Um verbo requer valores de registro separados para cada uma dessas três situações que o verbo suporta. Os valores possíveis para o modelo de seleção de verbos são os seguintes:

  • Especifique o valor MultiSelectModel para todos os verbos. Se o valor MultiSelectModel não for especificado, ele será inferido do tipo de implementação de verbo que você escolheu. Para métodos baseados em COM (como DropTarget e ExecuteCommand) Player é assumido e para os outros métodos Document é assumido.
  • Especifique Single para verbos que oferecem suporte a apenas uma única seleção.
  • Especifique Player para verbos que oferecem suporte a qualquer número de itens.
  • Especifique Documento para verbos que criam uma janela de nível superior para cada item. Isso limita o número de itens ativados e ajuda a evitar a falta de recursos do sistema se o usuário abrir muitas janelas.

Quando o número de itens selecionados não corresponde ao modelo de seleção de verbos ou é maior do que os limites padrão descritos na tabela a seguir, o verbo não aparece.

Tipo de implementação do verbo Documento Jogador
Herdada 15 itens 100 itens
COM 15 itens Sem limite

 

A seguir estão exemplos de entradas do Registro usando o valor MultiSelectModel.

HKEY_CLASSES_ROOT
   Folder
      shell
         open
             = MultiSelectModel = Document
HKEY_CLASSES_ROOT
   ProgID
      shell
         verb
             = MultiSelectModel = Single | Document | Player

Usando atributos de item

Os valores de sinalizador SFGAO dos atributos do Shell para um item podem ser testados para determinar se o verbo deve ser habilitado ou desabilitado.

Para usar esse recurso de atributo, adicione os seguintes valores de REG_DWORD sob o verbo:

  • O valor AttributeMask especifica o valor SFGAO dos valores de bit da máscara com a qual testar.
  • O valor AttributeValue especifica o valor SFGAO dos bits testados.
  • O ImpliedSelectionModel especifica zero para verbos de item ou diferente de zero para verbos no menu de atalho de plano de fundo.

Na entrada do Registro de exemplo a seguir, o AttributeMask é definido como SFGAO_READONLY (0x40000).

HKEY_CLASSES_ROOT
   txtfile
      Shell
         test.verb2
            AttributeMask = 0x40000
            AttributeValue = 0x0
            ImpliedSelectionModel = 0x0
            command
               (Default) = %SystemRoot%\system32\notepad.exe %1

Implementando verbos personalizados para pastas por meio do Desktop.ini

No Windows 7 e posterior, você pode adicionar verbos a uma pasta por meio do Desktop.ini. Para obter mais informações sobre Desktop.ini arquivos, consulte Como personalizar pastas com Desktop.ini.

Observação

Desktop.ini arquivos devem sempre ser marcados como Sistema + oculto para que não sejam exibidos aos usuários.

 

Para adicionar verbos personalizados para pastas por meio de um arquivo Desktop.ini, execute as seguintes etapas:

  1. Crie uma pasta marcada como Somente leitura ou Sistema.

  2. Crie um arquivo Desktop.ini que inclua um [. ShellClassInfo] DirectoryClass=Pasta ProgID.

  3. No registro, crie HKEY_CLASSES_ROOT\pasta ProgID com um valor de CanUseForDirectory. O valor CanUseForDirectory evita o uso indevido de ProgIDs que são definidos para não participar da implementação de verbos personalizados para pastas por meio de Desktop.ini.

  4. Adicione verbos na subchave FolderProgID, por exemplo:

    HKEY_CLASSES_ROOT
       CustomFolderType
          Shell
             MyVerb
                command
                   (Default) = %SystemRoot%\system32\notepad.exe %1\desktop.ini
    

Observação

Esses verbos podem ser o verbo padrão, caso em que clicar duas vezes na pasta ativa o verbo.

 

Melhores Práticas para Manipuladores de Menu de Atalho e Vários Verbos de Seleção

Escolher um Verbo Estático ou Dinâmico para o Menu de Atalho

Personalizando um menu de atalho usando verbos dinâmicos

Menus de Atalho (Contexto) e Manipuladores de Menu de Atalho

Associações de Verbos e Arquivos

Referência do Menu de Atalho