Wie kann ich ein Shell-Kontextmenüelement erstellen, das mehrere Dateien als Argumente verwendet?

10

Das Erstellen eines Windows Shell-Kontextmenüelements, das eine einzelne Datei als Argument verwendet, ist einfach. In dieser Frage finden Sie ein Beispiel.

Wie erstellen Sie jedoch ein Kontextmenüelement, das mehrere Dateien als Argumente verwendet? Angenommen, für ein Diff-Merge-Tool (in meinem Fall P4Merge), obwohl die gleiche Technik zweifellos auch für andere Anwendungen anwendbar wäre.

Ich habe P4Merge installiert, aber es fügt dem Kontextmenü nicht automatisch ein Element hinzu, sodass ich es manuell ausführen muss.

Als ich versuchte:

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

Als Kommandozeile habe ich eine Fehlermeldung erhalten:

Fehler: Es werden mindestens zwei Dateien benötigt. Es kann nicht nur eine Datei geöffnet werden. P4Merge benötigt 0, 2 oder 3 Dateien.

Als ich versuchte:

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

Als Befehlszeile wurden zwei Instanzen von P4Merge geöffnet, eine für jede Datei.

Es scheint, dass die richtigen Dateinamen an% 0 und% 1 übergeben werden, aber für jede wird eine andere Instanz der P4Merge-Anwendung ausgeführt.

Ich habe derzeit das DiffMerge-Tool von SourceGear, das ein Element im Shell-Kontextmenü enthält und das hervorragend funktioniert, da ich zwei Dateien auswählen und das Kontextmenüelement verwenden kann, um ein Diff für sie auszuführen. Ich habe versucht, die Registrierung zu durchsuchen, um festzustellen, welche Argumente DiffMerge verwendet, aber ich konnte keine DiffMerge-Befehlszeile finden, die Argumente enthielt.

SimonTewsi
quelle
2
Wie Sie herausgefunden haben, gibt es keine Möglichkeit, mit einem einfachen Registrierungs-Hack das zu tun, was Sie wollen. Es gibt nur% 1, da die Erweiterung nur für ein Objekt gilt und für mehrere Objekte separat ausgeführt wird. Es erfordert die Programmierung einer vollständigen Shell-Erweiterung. Es gibt jedoch einige Programme / Shell-Erweiterungen, mit denen Sie fortgeschrittenere Kontextmenüs ausführen können, als es ein Registrierungs-Hack zulässt. (Das einzige, an das ich mich erinnern kann, ist MMM .) Leider beschränken sie sich meiner Meinung nach eher darauf, dass Sie Untermenüs erstellen, als dass mehrere Objekte gelöscht werden.
Synetech

Antworten:

18

Sie können auch versuchen, das Programm zum SendTo-Menü hinzuzufügen.

surfasb
quelle
Ja, das funktioniert gut.
Synetech
1
Hat perfekt funktioniert. Hier finden Sie Anweisungen zum Hinzufügen einer Anwendung zum SendTo-Menü in Windows 7. Es mussten keine Befehlszeilenparameter hinzugefügt werden. Legen Sie einfach die Anwendungsverknüpfung im Ordner% APPDATA% \ Microsoft \ Windows \ SendTo ab. Zurück im Windows Explorer führte die Auswahl von zwei Dateien, das Klicken mit der rechten Maustaste und die Auswahl von Senden an> P4Merge zu einem Unterschied bei den ausgewählten Dateien.
SimonTewsi
3

Beim Durchsuchen nach der Antwort scheint es keine einfache Lösung zu geben und dass eine Shell-Erweiterung erforderlich ist. Bei erneuter Betrachtung der Registrierungseinträge für DiffMerge wird anscheinend eine Shell-Erweiterung verwendet: DiffMergeShellExtension64.dll. Wenn P4Merge nicht über eine solche Shell-Erweiterung verfügt, kann ich sie nur im Windows Explorer-Kontextmenü ordnungsgemäß ausführen, indem ich selbst eine schreibe.

Der vollständige Leitfaden für Idioten zum Schreiben von Shell-Erweiterungen in Code Project ist ein nützlicher Leitfaden zum Schreiben von Shell-Erweiterungen. In Teil II der Serie geht es darum, eine Erweiterung zu schreiben, die mehrere Dateien gleichzeitig verarbeitet (genau das, was ich brauche).

Warnung: Das vollständige Handbuch für Idioten zum Schreiben von Shell-Erweiterungen verwendet C und COM, ATL (Active Template Library) und MFC (Microsoft Foundation Classes). Das Schreiben einer Shell-Erweiterung ist also ein langer und möglicherweise schwieriger Prozess, wenn Sie mit diesen Technologien nicht vertraut sind. Es ist definitiv nicht etwas, was Sie in einer Stunde tun können.

SimonTewsi
quelle
2

Sie können dies mit meinem Programm Kontext-Menü-Launcher (Singleinstance) tun :

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
quelle
Bitte verlinken Sie nicht direkt auf .exeDateien in Ihren Antworten, ohne klar zu machen, dass ein automatischer Download startet.
DavidPostill
Funktioniert wie ein Zauber, danke. Gibt es eine Möglichkeit, die Singleinstance-Anwendung einem beliebigen Dateityp zuzuordnen, ohne sie den Dateizuordnungen für jeden Dateityp einzeln hinzuzufügen? Zum Beispiel verwende ich derzeit DiffMerge zum Vergleichen von Dingen wie XML-Dateien, SQL-Skripten, Konfigurationsdateien, * .cs-Dateien, .gitignore-Dateien und anderen.
SimonTewsi