Як я можу створити пункт контекстного меню оболонки, який приймає кілька аргументів як аргументи?


11

Створити пункт контекстного меню Windows Shell, який сприймає один файл як аргумент, дуже просто. Дивіться це питання для прикладу.

Однак як створити пункт контекстного меню, який сприймає кілька аргументів як аргументи? Скажімо, для інструмента розлиття (у моєму випадку 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.

Наразі у мене є інструмент DiffMerge SourceGear, який містить пункт контекстного меню Shell, і він прекрасно працює, оскільки я в змозі вибрати два файли та використовувати пункт контекстного меню, щоб запустити на них відмінності. Я намагаюся шукати в реєстрі, щоб побачити, які аргументи використовує DiffMerge, але я не зміг знайти командний рядок DiffMerge, який включав аргументи.


3
Як ви з’ясували, немає можливості зробити те, що ви хочете, за допомогою простого злому реєстру. Існує лише% 1, оскільки розширення стосується лише одного об'єкта і виконується окремо для кількох об'єктів. Він вимагає програмування повного розширення оболонки. Однак є деякі програми / розширення оболонки, які дозволяють виконувати деякі більш досконалі речі контекстного меню, ніж дозволить злом реєстру. (Єдине, що я пам'ятаю, це MMM .) На жаль, я думаю, що вони, як правило, обмежуються тим, що дозволяють вам створювати підменю, а не дозволяти відмовлятися від декількох об'єктів.
Synetech

Відповіді:


20

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


Так, це прекрасно працює.
Synetech

1
Працювали чудово. Ось інструкції, як додати додаток до меню SendTo в Windows 7. Не потрібно було додавати жодних параметрів командного рядка, просто скинув ярлик програми у папку% APPDATA% \ Microsoft \ Windows \ SendTo. Повернувшись у Провідник Windows, вибравши два файли, потім клацніть правою кнопкою миші та виберіть Надіслати до> P4Merge.
SimonTewsi

4

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

Повне керівництво Idiot щодо написання розширень оболонок у кодовому проекті є корисним посібником для написання розширень оболонок. Частина II серії стосується написання розширення, яке обробляє декілька файлів одночасно (саме те, що мені потрібно).

Попередження: Повний посібник Idiot щодо написання розширень оболонок використовує C та COM, ATL (активна бібліотека шаблонів) та MFC (класи Microsoft Foundation). Отже, написання розширення оболонки, якщо ви не знайомі з цими технологіями, буде довгим та потенційно складним процесом; це точно не те, що ти можеш зробити за годину.


2

Ви можете зробити це за допомогою мого програмного контекстного меню-запуску (одиночна речовина) :

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файли у своїх відповідях, не даючи зрозуміти, що почнеться автоматичне завантаження.
DavidPostill

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