14 votes

Comment puis-je créer un élément de menu contextuel Shell qui prend plusieurs fichiers comme arguments ?

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

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

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

Quand j'ai essayé d'utiliser :

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

en ligne de commande, j'ai obtenu 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

comme 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 qu'une instance différente de l'application P4Merge soit exécutée pour chacun d'eux.

J'ai actuellement l'outil DiffMerge de SourceGear qui a un élément sur le menu contextuel Shell et cela fonctionne à merveille, car je suis capable de sélectionner deux fichiers et d'utiliser l'élément du menu contextuel pour lancer une diff sur eux. J'ai essayé de chercher 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.

25voto

Thad Points 725

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

6voto

SimonTewsi Points 901

En cherchant la réponse, il semble qu'il n'y ait pas de solution simple et qu'une extension 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 alors il semble que la seule façon de le faire fonctionner correctement dans le menu contextuel de l'explorateur Windows serait d'en écrire un moi-même.

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

Avertissement : The Complete Idiot's Guide to Writing Shell Extensions utilise C et COM, ATL (Active Template Library) et MFC (Microsoft Foundation Classes). 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.

3voto

zenden2k Points 131

Vous pouvez le faire avec mon programme Lanceur de menu contextuel (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"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X