Jak mogę utworzyć element menu kontekstowego powłoki, który przyjmuje wiele plików jako argumenty?

11

Tworzenie elementu menu kontekstowego powłoki systemu Windows, który przyjmuje jako argument pojedynczy plik, jest łatwe. Zobacz to pytanie jako przykład.

Jak jednak utworzyć element menu kontekstowego, który przyjmuje wiele plików jako argumenty? Powiedzmy, dla narzędzia scalania różnic (w moim przypadku P4Merge), chociaż ta sama technika bez wątpienia miałaby zastosowanie również do innych aplikacji.

Zainstalowałem P4Merge, ale nie dodaje on automatycznie pozycji do menu kontekstowego, więc będę musiał to zrobić ręcznie.

Kiedy próbowałem użyć:

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

jako wiersz polecenia dostałem błąd:

Błędy: potrzebne są co najmniej dwa pliki. Nie można otworzyć tylko jednego pliku. P4Merge potrzebuje 0, 2 lub 3 plików.

Kiedy próbowałem użyć:

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

jako wiersz poleceń otworzył dwie instancje P4Merge, po jednej dla każdego pliku.

Wygląda na to, że prawidłowe nazwy plików są przekazywane do% 0 i% 1, ale dla każdego z nich wykonywana jest inna instancja aplikacji P4Merge.

Obecnie mam narzędzie DiffMerge firmy SourceGear, które ma element w menu kontekstowym powłoki i działa pięknie, ponieważ jestem w stanie wybrać dwa pliki i użyć elementu menu kontekstowego, aby uruchomić na nich różnicę. Próbuję przeszukać rejestr, aby zobaczyć, jakich argumentów używa DiffMerge, ale nie mogłem znaleźć wiersza polecenia DiffMerge zawierającego argumenty.

SimonTewsi
źródło
3
Jak się dowiedziałeś, nie możesz zrobić tego, co chcesz, za pomocą zwykłego hakowania rejestru. Jest tylko% 1, ponieważ rozszerzenie dotyczy tylko jednego obiektu i jest wykonywane osobno dla wielu obiektów. Wymaga zaprogramowania pełnego rozszerzenia powłoki. Istnieją jednak niektóre programy / rozszerzenia powłoki, które pozwalają robić bardziej zaawansowane rzeczy z menu kontekstowego, niż pozwala na to hack rejestru. (Jedyne, co pamiętam, to MMM .) Niestety, myślę, że ograniczają się one raczej do tworzenia podmenu niż do upuszczania wielu obiektów.
Synetech

Odpowiedzi:

20

Możesz także spróbować dodać program do menu SendTo.

surfasb
źródło
Tak, to ładnie działa.
Synetech
1
Działał idealnie. Oto instrukcje dodawania aplikacji do menu SendTo w Windows 7. Nie było potrzeby dodawania żadnych parametrów wiersza poleceń, po prostu upuściłem skrót aplikacji do folderu% APPDATA% \ Microsoft \ Windows \ SendTo. Z powrotem w Eksploratorze Windows, wybierając dwa pliki, a następnie klikając prawym przyciskiem myszy i wybierając Wyślij do> P4Merge wykonał różnicę dla wybranych plików.
SimonTewsi,
4

Szukając odpowiedzi, wydaje się, że nie ma prostej poprawki i że potrzebne jest rozszerzenie powłoki. Patrząc ponownie na wpisy rejestru dotyczące DiffMerge, wydaje się, że używa rozszerzenia powłoki: DiffMergeShellExtension64.dll. Jeśli P4Merge nie ma takiego rozszerzenia powłoki, wygląda na to, że jedynym sposobem na poprawne działanie w menu kontekstowym Eksploratora Windows byłoby napisanie go osobiście.

Kompletny przewodnik Idiot's Guide to Writing Shell Extensions w Code Project to przydatny przewodnik po pisaniu rozszerzeń powłoki. Część II tej serii dotyczy pisania rozszerzenia obsługującego wiele plików jednocześnie (dokładnie tego, czego potrzebuję).

Ostrzeżenie: Kompletny przewodnik Idiota dotyczący pisania rozszerzeń powłoki wykorzystuje C i COM, ATL (Active Template Library) i MFC (Microsoft Foundation Classes). Więc napisanie rozszerzenia powłoki, jeśli nie znasz tych technologii, będzie długim i potencjalnie trudnym procesem; zdecydowanie nie można tego zrobić w ciągu godziny.

SimonTewsi
źródło
2

Możesz to zrobić za pomocą mojego programu uruchamiającego menu kontekstowe (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
źródło
Nie umieszczaj linków bezpośrednio do .exeplików w swoich odpowiedziach bez wyraźnego zaznaczenia, że ​​rozpocznie się automatyczne pobieranie.
DavidPostill
Działa jak urok, dzięki. Czy istnieje jakiś sposób na powiązanie aplikacji z pojedynczą instancją z dowolnym typem pliku, bez dodawania jej do skojarzeń plików dla każdego typu pliku osobno? Na przykład obecnie używam DiffMerge do porównywania rzeczy takich jak pliki XML, skrypty SQL, pliki konfiguracyjne, pliki * .cs, pliki .gitignore i inne.
SimonTewsi