Como posso criar um item de menu de contexto do shell que usa vários arquivos como argumentos?

10

É fácil criar um item de menu de contexto do Windows Shell que utiliza um único arquivo como argumento. Veja esta pergunta para um exemplo.

No entanto, como você cria um item de menu de contexto que usa vários arquivos como argumentos? Digamos, para uma ferramenta diff-merge (no meu caso, o P4Merge), embora a mesma técnica também seja aplicável a outras aplicações.

Eu instalei o P4Merge, mas ele não adiciona um item ao menu de contexto automaticamente, então terei que fazê-lo manualmente.

Quando tentei usar:

"C:\Program Files\Perforce\p4merge.exe" %1 %2

como linha de comando, recebi um erro:

Erros: São necessários pelo menos dois arquivos. Não é possível abrir apenas um arquivo. O P4Merge precisa de 0, 2 ou 3 arquivos.

Quando tentei usar:

"C:\Program Files\Perforce\p4merge.exe" %0 %1

como linha de comando, ele abriu duas instâncias do P4Merge, uma para cada arquivo.

Parece que os nomes de arquivos corretos estão sendo transmitidos para% 0 e% 1, mas uma instância diferente do aplicativo P4Merge está sendo executada para cada um.

Atualmente, tenho a ferramenta DiffMerge do SourceGear, que possui um item no menu de contexto do Shell e funciona perfeitamente, pois eu posso selecionar dois arquivos e usar o item de menu de contexto para executar uma comparação neles. Estou tentando pesquisar no registro para ver quais argumentos o DiffMerge usa, mas não consegui encontrar uma linha de comando do DiffMerge que incluísse argumentos.

SimonTewsi
fonte
2
Como você descobriu, não há como fazer o que deseja com um simples hack do registro. Existe apenas% 1 porque a extensão se aplica apenas a um objeto e é executada separadamente para vários objetos. Requer a programação de uma extensão de shell completa. No entanto, existem alguns programas / extensões de shell que permitem fazer algumas coisas mais avançadas no menu de contexto do que um hack do registro permitirá. (O único que me lembro é o MMM .) Infelizmente, acho que eles tendem a se limitar a permitir que você crie submenus em vez de permitir que vários objetos sejam descartados.
Synetech 26/07/12

Respostas:

19

Você também pode tentar adicionar o programa ao menu SendTo.

surfasb
fonte
Sim, isso funciona muito bem.
Synetech 26/07/12
1
Funcionou perfeitamente. Aqui estão as instruções sobre como adicionar um aplicativo ao menu SendTo no Windows 7. Não havia necessidade de adicionar nenhum parâmetro de linha de comando, basta soltar o atalho do aplicativo na pasta% APPDATA% \ Microsoft \ Windows \ SendTo. De volta ao Windows Explorer, selecionar dois arquivos, clicar com o botão direito do mouse e selecionar Enviar para> P4Merge executou uma diferença nos arquivos selecionados.
SimonTewsi
3

Procurando a resposta, parece que não há uma correção simples e que é necessária uma extensão do shell. Olhando novamente para as entradas do Registro do DiffMerge, ele parece usar uma extensão do shell: DiffMergeShellExtension64.dll. Se o P4Merge não tiver essa extensão de shell, parece que a única maneira de fazê-lo funcionar corretamente no menu de contexto do Windows Explorer seria escrever uma.

A série Guia completo do idiota para escrever extensões de shell no Code Project é um guia útil para escrever extensões de shell. A parte II da série trata de escrever uma extensão que lida com vários arquivos de uma só vez (exatamente o que eu preciso).

Aviso: O Guia completo do idiota para criar extensões de shell usa C e COM, ATL (Active Template Library) e MFC (Microsoft Foundation Classes). Portanto, escrever uma extensão de shell, se você não estiver familiarizado com essas tecnologias, será um processo longo e potencialmente difícil; definitivamente não é algo que você pode fazer em uma hora.

SimonTewsi
fonte
2

Você pode fazer isso com meu programa context-menu-launcher (singleinstance) :

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"
zenden2k
fonte
Não vincule diretamente aos .exearquivos de suas respostas sem deixar claro que um download automático será iniciado.
DavidPostill
Funciona como um encanto, obrigado. Existe alguma maneira de associar o aplicativo de instância única a qualquer tipo de arquivo, sem adicioná-lo às associações de arquivos para cada tipo de arquivo individualmente? Por exemplo, atualmente uso o DiffMerge para comparar itens como arquivos XML, scripts SQL, arquivos de configuração, arquivos * .cs, arquivos .gitignore e outros.
SimonTewsi