Como Criar Manipuladores do Menu de Atalho

Manipuladores de menu de atalho, também conhecidos como manipuladores de menu de contexto ou manipuladores de verbo, são um tipo de manipulador de tipo de arquivo. Esses manipuladores podem ser impelmentados de uma maneira que faça com que eles sejam carregados em seu próprio processo ou no explorer ou em outros processos de terceiros. 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 diferente, o subsistema WOW64 redireciona o acesso do sistema de arquivos a alguns caminhos. Se o manipulador de .exe estiver armazenado em um desses caminhos, ele não estará acessível nesse contexto. Portanto, como uma solução alternativa, armazene seu .exe em um caminho que não seja redirecionado ou armazene uma versão stub do seu .exe que inicia 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 caracteres de exibição localizadas para os verbos definidos. No entanto, para fornecer um grau de independência linguística, 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 linguagem de 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 para o equivalente alemão em um sistema alemão.

Verbo canônico Descrição
Aberto Abre o arquivo ou pasta.
Opennew Abre o arquivo ou a pasta em uma nova janela.
Imprimir Imprime o arquivo.
Printto 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. Membro lpVerb passado 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 dar 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 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 são diferenciados 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 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. Sua finalidade é 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 forma.

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 do verbo for especificada
  3. O verbo Abrir
  4. O verbo Abrir com

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

Crie uma subchave para cada verbo que você deseja adicionar na subchave shell. Cada uma dessas subchaves deve ter um valor REG_SZ definido como 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 corretamente localizada. Para verbos não canônicos, se você omitir a cadeia de caracteres de exibição, a cadeia de caracteres de verbo será exibida.

No exemplo do registro a seguir, observe que:

  • Como Doit não é um verbo canônico, ele recebe 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. Esse menu de atalho tem verbos Open, Do It e Print em seu menu, com Do It como o verbo padrão.

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

Ativando seu manipulador usando a interface IDropTarget

O DDE (Troca Dinâmica de Dados) foi preterido; em vez disso, use IDropTarget . O IDropTarget é mais robusto e tem melhor suporte à ativação porque usa a ativação COM do manipulador. No caso de várias seleções de itens, IDropTarget não está sujeito às restrições de tamanho do 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 consultas IDropTarget e Shell para atributos de associação de arquivos, 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. No último caso, o primeiro item na 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. Exibir
  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. Exibir
HKEY_CLASSES_ROOT
   DesktopBackground
      Shell = "Personalization,Gadgets"
      Display

Posicionando 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 fazer isso terá prioridade:

Position=Top | Bottom 

Criando menus estáticos em cascata

No Windows 7 e posterior, há suporte para a implementação do menu em cascata por meio das configurações do Registro. Antes do Windows 7, a criação de menus em cascata só era possível por meio da implementação da interface IContextMenu . No Windows 7 e posteriores, você deve recorrer a soluções baseadas em código COM somente quando os métodos estáticos forem 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 posteriores, há três maneiras de criar menus em cascata:

Criando menus em cascata com a entrada do Registro de SubComandos

No Windows 7 e posteriores, 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\shellProgID\ para representar o 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. À subchave CascadeTest , adicione uma entrada MUIVerb do tipo REG_SZ e atribua o texto que aparecerá como seu nome no menu de atalho. Neste exemplo, atribuimos a ele "Menu em cascata de teste".

    HKEY_CLASSES_ROOT
       *
          shell
             CascadeTest
                (Default)
                MUIVerb = Test Cascade Menu
    
  3. À subchave CascadeTest , adicione uma entrada SubComandos 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, atribuimos vários 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 verbo estático 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 SubComandos. No entanto, ele exige que o aplicativo tenha permissão para modificar o registro em HKEY_LOCAL_MACHINE.

 

Criando menus em cascata com a entrada do Registro ExtendedSubCommandsKey

No Windows 7 e posteriores, você pode usar a entrada ExtendedSubCommandKey para criar menus estendidos em cascata: menus em cascata em 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 na subchave\ HKEY_CURRENT_USERClasses deSoftware\. A vantagem main de fazer isso é que a permissão elevada não é necessária. Além disso, outras associações de arquivos 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 no pai, mas garantir que o valor Padrão do pai esteja vazio.

Para criar um menu em cascata usando uma entrada ExtendedSubCommandsKey

  1. Crie uma subchave em HKEY_CLASSES_ROOT\shellProgID\ para representar o 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. À subchave CascadeTest , adicione uma entrada MUIVerb do tipo REG_SZ e atribua o texto que aparecerá como seu nome no menu de atalho. Neste exemplo, atribuimos a ele "Menu em cascata de teste".

    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); por exemplo:

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

    Verifique se o valor padrão da subchave menu de cascata de teste 2 está vazio e mostrado como (valor não definido).

  4. Preencha os subverbos usando qualquer uma das seguintes implementações de verbo estático. 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 é por meio 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 posteriores, você pode fornecer a mesma implementação de verbo usando IExplorerCommand como 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 IExplorerCommand dá suporte apenas à ativação em processo, é recomendável usar 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. Esse 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 posteriores dão suporte a valores canônicos que evitam problemas em builds localizados. A sintaxe canônica a seguir é necessária em builds localizados para aproveitar esse aprimoramento do Windows 7.

System.StructuredQueryType.Boolean#True

Na seguinte entrada de registro de exemplo:

  • 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 UAC (Controle de Conta de Usuário) é 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 bitlocker que empregam a seguinte abordagem:

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

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

Preterido: associando verbos a comandos dinâmicos do Troca de Dados

O DDE foi preterido; em vez disso, use IDropTarget . O DDE foi preterido porque se baseia em uma mensagem de janela de transmissão para descobrir o servidor DDE. Um servidor DDE trava a mensagem da janela de difusão e, portanto, trava as conversas de 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 de várias seleções de itens, IDropTarget não está sujeito às restrições de tamanho do 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 consultas IDropTarget e Shell para atributos de associação de arquivos, consulte Tipos percebidos e registro de aplicativo.

Concluindo tarefas de implementação de verbo

As tarefas a seguir para implementar verbos são relevantes para implementações de verbo estático e dinâmico. 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 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 do Shell. Esses 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. Selecionar esse comando exibe um submenu. Por padrão, o submenu contém dois comandos, Pasta e Atalho, que permitem que os usuários criem 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 são listados na tabela a seguir.

Valor da subchave ShellNew 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 que contém 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.
NullFile 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 a seguir e a captura de tela ilustram o novo submenu 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 o Aplicativo MyProgram no submenu Novo , o Shell cria um arquivo chamado Novo Aplicativo MyProgram.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 pode 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 remover 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. Manipuladores de arrastar e soltar normalmente são registrados na subchave a seguir.

HKEY_CLASSES_ROOT
   Directory
      shellex
         DragDropHandlers

Adicione uma subchave sob a subchave DragDropHandlers chamada para o manipulador de arrastar e soltar e defina o valor padrão da subchave para a forma de cadeia de caracteres do GUID do IDENTIFICADOR de classe (CLSID) do manipulador. O exemplo a seguir habilita o manipulador de arrastar e soltar do 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 política do Windows para controlar a visibilidade do verbo. Os verbos podem ser suprimidos por meio de configurações de política adicionando um valor SuppressionPolicy ou um valor de GUID SuppressionPolicyEx à subchave do registro do verbo. Defina o valor da subchave SuppressionPolicy como 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 RESTRICTIONS .

Empregando o modelo de seleção de verbo

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 separados do Registro para cada uma dessas três situações compatíveis com o verbo. Os valores possíveis para o modelo de seleção de verbo 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 dão suporte apenas a uma única seleção.
  • Especifique Player para verbos que dão 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 ficar sem 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 verbo ou é maior que os limites padrão descritos na tabela a seguir, o verbo não aparece.

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

 

Veja a seguir as entradas de registro de exemplo 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 no verbo:

  • O valor AttributeMask especifica o valor SFGAO dos valores de bit da máscara com os quais testar.
  • O valor AttributeValue especifica o valor SFGAO dos bits testados.
  • O ImplicitSelectionModel especifica zero para verbos de item ou diferente de zero para verbos no menu de atalho em segundo plano.

Na entrada de 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 de Desktop.ini

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

Observação

Desktop.ini arquivos sempre devem 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=Folder ProgID.

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

  4. Adicione verbos na subchave ProgID da Pasta, 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, nesse caso, clicar duas vezes na pasta ativa o verbo.

 

Práticas recomendadas para manipuladores de menu de atalho e vários verbos de seleção

Escolhendo 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

Verbos e associações de arquivos

Referência de menu de atalho