Как я могу создать пункт контекстного меню оболочки, который принимает несколько файлов в качестве аргументов?


11

Создать элемент контекстного меню оболочки Windows, который принимает в качестве аргумента один файл, очень просто. Смотрите этот вопрос для примера.

Тем не менее, как вы создаете пункт контекстного меню, который принимает несколько файлов в качестве аргументов? Скажем, для инструмента diff-merge (в моем случае P4Merge), хотя та же методика, без сомнения, будет применима и для других приложений.

Я установил P4Merge, но он не добавляет элемент в контекстное меню автоматически, поэтому мне придется делать это вручную.

Когда я пытался использовать:

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

в командной строке я получил ошибку:

Ошибки: необходимы как минимум два файла. Невозможно открыть только один файл. P4Merge требуется 0, 2 или 3 файла.

Когда я пытался использовать:

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

в качестве командной строки он открыл два экземпляра P4Merge, по одному для каждого файла.

Похоже, что правильные имена файлов передаются в% 0 и% 1, но для каждого из них выполняется отдельный экземпляр приложения P4Merge.

В настоящее время у меня есть инструмент SourceGear DiffMerge, у которого есть пункт в контекстном меню оболочки и который прекрасно работает, так как я могу выбрать два файла и использовать пункт контекстного меню для запуска сравнения с ними. Я пытаюсь найти в реестре аргументы DiffMerge, но не могу найти командную строку DiffMerge, в которой есть аргументы.


3
Как вы узнали, нет простого способа сделать то, что вы хотите, простым взломом реестра. Существует только% 1, поскольку расширение применяется только к одному объекту и выполняется отдельно для нескольких объектов. Это требует программирования полного расширения оболочки. Однако есть некоторые программы / расширения оболочки, которые позволяют вам выполнять более сложные контекстные меню, чем это позволяет взлом реестра. (Единственное, что я помню, это MMM .) К сожалению, я думаю, что они, как правило, ограничены возможностью создания подменю, а не возможностью удаления нескольких объектов.
Synetech

Ответы:


20

Вы также можете попробовать добавить программу в меню SendTo.


Да, это работает хорошо.
Synetech

1
Работал отлично. Ниже приведены инструкции по добавлению приложения в меню SendTo в Windows 7. Не нужно было добавлять какие-либо параметры командной строки, просто удалили ярлык приложения в папку% APPDATA% \ Microsoft \ Windows \ SendTo. Вернувшись в Windows Explorer, выбрав два файла, затем щелкнув правой кнопкой мыши и выбрав Send To> P4Merge, выполнил различие для выбранных файлов.
SimonTewsi

4

Просматривая ответ, кажется, что простого исправления не существует и требуется расширение оболочки. Еще раз заглядывая в записи реестра для DiffMerge, он, похоже, использует расширение оболочки: DiffMergeShellExtension64.dll. Если у P4Merge нет такого расширения оболочки, то похоже, что единственный способ заставить его работать правильно в контекстном меню Windows Explorer - это написать его самостоятельно.

Полное идиотское руководство по написанию расширений оболочки в Code Project - полезное руководство по написанию расширений оболочки. Вторая часть серии посвящена написанию расширения, которое обрабатывает несколько файлов одновременно (именно то, что мне нужно).

Предупреждение: полное руководство идиота по написанию расширений оболочки использует C и COM, ATL (Active Template Library) и MFC (классы Microsoft Foundation). Поэтому написание расширения оболочки, если вы не знакомы с этими технологиями, будет долгим и потенциально трудным процессом; это определенно не то, что вы можете сделать за час.


2

Вы можете сделать это с помощью моей программы 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"

Пожалуйста, не связывайтесь напрямую с .exeфайлами в ваших ответах, не давая понять, что автоматическая загрузка начнется.
ДэвидПостилл

Работает как шарм, спасибо. Есть ли способ связать одноэкземплярное приложение с любым типом файлов, не добавляя его в ассоциации файлов для каждого типа файлов по отдельности? Например, в настоящее время я использую DiffMerge для сравнения таких вещей, как файлы XML, сценарии SQL, файлы конфигурации, файлы * .cs, файлы .gitignore и другие.
SimonTewsi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.