Comment puis-je créer un élément de menu contextuel du shell qui accepte plusieurs fichiers comme arguments?

10

La création d'un élément de menu contextuel Windows Shell qui prend un seul fichier comme argument est facile. Voir cette question pour un exemple.

Cependant, comment créez-vous un élément de menu contextuel qui prend plusieurs fichiers comme arguments? Disons, pour un outil de fusion-diff (dans mon cas P4Merge), bien que la même technique serait sans doute également applicable pour d'autres applications.

J'ai installé P4Merge mais il n'ajoute pas automatiquement d'élément au menu contextuel, je devrai donc le faire manuellement.

Quand j'ai essayé d'utiliser:

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

comme ligne de commande, j'ai eu une erreur:

Erreurs: au moins deux fichiers sont nécessaires. Impossible d'ouvrir un seul fichier. P4Merge a besoin de 0, 2 ou 3 fichiers.

Quand j'ai essayé d'utiliser:

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

en tant que ligne de commande, il a ouvert deux instances de P4Merge, une pour chaque fichier.

Il semble que les noms de fichiers corrects soient transmis à% 0 et% 1 mais une instance différente de l'application P4Merge est en cours d'exécution pour chacun.

J'ai actuellement l'outil DiffMerge de SourceGear qui a un élément dans le menu contextuel de Shell et qui fonctionne à merveille, car je suis capable de sélectionner deux fichiers et d'utiliser l'élément de menu contextuel pour exécuter un diff sur eux. J'ai essayé de rechercher dans le registre pour voir quels arguments DiffMerge utilise, mais je n'ai pas pu trouver une ligne de commande DiffMerge qui comprenait des arguments.

SimonTewsi
la source
2
Comme vous l'avez découvert, il n'y a aucun moyen de faire ce que vous voulez avec un simple hack de registre. Il n'y a que% 1 car l'extension ne s'applique qu'à un seul objet et est exécutée séparément pour plusieurs objets. Cela nécessite de programmer une extension de shell complète. Il existe cependant certains programmes / extensions de shell qui vous permettent de faire des choses de menu contextuel plus avancées qu'un piratage de registre ne le permettra. (Le seul dont je me souvienne est MMM .) Malheureusement, je pense qu'ils ont tendance à se limiter à vous permettre de créer des sous-menus plutôt que de permettre la suppression de plusieurs objets.
Synetech

Réponses:

19

Vous pouvez également essayer d'ajouter le programme au menu SendTo.

surfasb
la source
Ouais, ça marche bien.
Synetech
1
Fonctionne parfaitement. Voici des instructions sur la façon d'ajouter une application au menu SendTo dans Windows 7. Il n'était pas nécessaire d'ajouter des paramètres de ligne de commande, il suffit de déposer le raccourci d'application dans le dossier% APPDATA% \ Microsoft \ Windows \ SendTo. De retour dans l'Explorateur Windows, en sélectionnant deux fichiers puis en cliquant avec le bouton droit et en sélectionnant Envoyer vers> P4Merge a effectué une différence sur les fichiers sélectionnés.
SimonTewsi
3

En cherchant la réponse, il semble qu'il n'y ait pas de correctif simple et qu'une extension de shell soit nécessaire. En regardant à nouveau les entrées de Registre pour DiffMerge, il semble utiliser une extension shell: DiffMergeShellExtension64.dll. Si P4Merge n'a pas une telle extension shell, il semble que la seule façon de la faire fonctionner correctement dans le menu contextuel de l'Explorateur Windows serait d'en écrire une moi-même.

Le guide complet de l'idiot pour l'écriture de la série d' extensions shell dans Code Project est un guide utile pour écrire des extensions shell. La partie II de la série concerne l'écriture d'une extension qui gère plusieurs fichiers à la fois (exactement ce dont j'ai besoin).

Avertissement: le guide complet de l'idiot pour l'écriture d'extensions shell utilise C et COM, ATL (bibliothèque de modèles actifs) et MFC (classes Microsoft Foundation). Donc, écrire une extension shell, si vous n'êtes pas familier avec ces technologies, va être un processus long et potentiellement difficile; ce n'est certainement pas quelque chose que vous pouvez faire en une heure.

SimonTewsi
la source
2

Vous pouvez le faire avec mon programme 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
la source
Veuillez ne pas lier directement aux .exefichiers dans vos réponses sans indiquer clairement qu'un téléchargement automatique commencera.
DavidPostill
Fonctionne comme un charme, merci. Existe-t-il un moyen d'associer l'application à instance unique à n'importe quel type de fichier, sans l'ajouter aux associations de fichiers pour chaque type de fichier individuellement? Par exemple, j'utilise actuellement DiffMerge pour comparer des choses comme les fichiers XML, les scripts SQL, les fichiers de configuration, les fichiers * .cs, les fichiers .gitignore et bien d'autres.
SimonTewsi