Come posso creare una voce di menu contestuale della shell che accetta più file come argomenti?


10

La creazione di una voce di menu di scelta rapida della shell di Windows che accetta un singolo file come argomento è semplice. Vedi questa domanda per un esempio.

Tuttavia, come si crea una voce di menu di scelta rapida che accetta più file come argomenti? Per esempio, per uno strumento di fusione-differenze (nel mio caso P4Merge), anche se la stessa tecnica sarebbe senza dubbio applicabile anche per altre applicazioni.

Ho installato P4Merge ma non aggiunge automaticamente una voce al menu contestuale, quindi dovrò farlo manualmente.

Quando ho provato ad usare:

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

come riga di comando ho ricevuto un errore:

Errori: sono necessari almeno due file. Impossibile aprire solo un file. P4Merge necessita di 0, 2 o 3 file.

Quando ho provato ad usare:

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

come riga di comando ha aperto due istanze di P4Merge, una per ciascun file.

Sembra che i nomi di file corretti vengano passati a% 0 e% 1 ma per ognuna viene eseguita un'istanza diversa dell'applicazione P4Merge.

Al momento ho lo strumento DiffMerge di SourceGear che ha una voce nel menu contestuale di Shell e funziona perfettamente, dato che sono in grado di selezionare due file e usare la voce del menu contestuale per eseguire un diff su di essi. Ho provato a cercare nel registro per vedere quali argomenti utilizza DiffMerge ma non sono riuscito a trovare una riga di comando DiffMerge che includesse argomenti.


2
Come hai scoperto, non c'è modo di fare quello che vuoi con un semplice hack del registro. Esiste solo% 1 perché l'estensione si applica solo a un oggetto ed è eseguita separatamente per più oggetti. Richiede la programmazione di un'estensione shell completa. Esistono tuttavia alcuni programmi / estensioni della shell che consentono di eseguire alcune operazioni di menu contestuale più avanzate di quelle consentite da un hack del registro. (L'unica che posso ricordare è MMM .) Sfortunatamente, penso che tendano ad essere limitati a permetterti di creare sottomenu piuttosto che consentire la caduta di più oggetti.
Synetech,

Risposte:


19

Puoi anche provare ad aggiungere il programma al menu Invia.


Sì, funziona bene.
Synetech,

1
Ha funzionato perfettamente. Ecco le istruzioni su come aggiungere un'applicazione al menu SendTo in Windows 7. Non è stato necessario aggiungere alcun parametro della riga di comando, è stato semplicemente rilasciato il collegamento dell'applicazione nella cartella% APPDATA% \ Microsoft \ Windows \ SendTo. Di nuovo in Esplora risorse, selezionando due file quindi facendo clic con il pulsante destro del mouse e selezionando Invia a> P4Merge è stato eseguito un diff sui file selezionati.
SimonTewsi,

3

Cercando la risposta sembra che non ci sia una soluzione semplice e che sia necessaria un'estensione della shell. Guardando di nuovo le voci del registro di sistema per DiffMerge, sembra utilizzare un'estensione shell: DiffMergeShellExtension64.dll. Se P4Merge non ha una tale estensione shell, sembra che l'unico modo per farlo funzionare correttamente nel menu contestuale di Windows Explorer sia scriverne uno da solo.

La guida completa di Idiot alla scrittura delle estensioni della shell in Code Project è una guida utile alla scrittura delle estensioni della shell. La parte II della serie riguarda la scrittura di un'estensione che gestisce più file contemporaneamente (esattamente ciò di cui ho bisogno).

Avvertenza: la guida completa dell'idiota alla scrittura delle estensioni della shell utilizza C e COM, ATL (Active Template Library) e MFC (Microsoft Foundation Classes). Quindi scrivere un'estensione della shell, se non si ha familiarità con quelle tecnologie, sarà un processo lungo e potenzialmente difficile; sicuramente non è qualcosa che puoi fare in un'ora.


2

Puoi farlo con il mio programma 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"

Non collegare direttamente ai .exefile nelle risposte senza chiarire che verrà avviato un download automatico.
DavidPostill

Funziona come un incantesimo, grazie. Esiste un modo per associare l'applicazione a istanza singola a qualsiasi tipo di file, senza aggiungerla alle associazioni di file per ciascun tipo di file singolarmente? Ad esempio, attualmente uso DiffMerge per confrontare cose come file XML, script SQL, file di configurazione, file * .cs, file .gitignore e altri.
SimonTewsi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.