Bagaimana saya bisa membuat item menu konteks shell yang mengambil beberapa file sebagai argumen?

10

Membuat item menu konteks Windows Shell yang menggunakan satu file sebagai argumen adalah mudah. Lihat pertanyaan ini sebagai contoh.

Namun, bagaimana Anda membuat item menu konteks yang mengambil banyak file sebagai argumen? Katakanlah, untuk alat diff-merge (dalam kasus saya P4Merge), meskipun teknik yang sama tidak diragukan lagi berlaku untuk aplikasi lain juga.

Saya telah menginstal P4Merge tetapi tidak menambahkan item ke menu konteks secara otomatis sehingga saya harus melakukannya secara manual.

Ketika saya mencoba menggunakan:

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

sebagai baris perintah saya mendapat kesalahan:

Kesalahan: Setidaknya diperlukan dua file. Tidak dapat membuka hanya satu file. P4Merge membutuhkan 0, 2, atau 3 file.

Ketika saya mencoba menggunakan:

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

ketika baris perintah membuka dua instance P4Merge, satu untuk setiap file.

Tampaknya nama file yang benar sedang diteruskan ke% 0 dan% 1 tetapi contoh berbeda dari aplikasi P4Merge sedang dieksekusi untuk masing-masing.

Saat ini saya memiliki alat DiffMerge SourceGear yang memiliki item pada menu konteks Shell dan itu berfungsi dengan baik, karena saya dapat memilih dua file dan menggunakan item menu konteks untuk menjalankan diff pada mereka. Saya sudah mencoba mencari registri untuk melihat argumen apa yang digunakan DiffMerge tetapi saya tidak dapat menemukan commandline DiffMerge yang menyertakan argumen.

SimonTewsi
sumber
2
Ketika Anda mengetahuinya, tidak ada cara untuk melakukan apa yang Anda inginkan dengan peretasan registri sederhana. Hanya ada% 1 karena ekstensi hanya berlaku untuk satu objek dan dieksekusi secara terpisah untuk beberapa objek. Ini membutuhkan pemrograman ekstensi shell penuh. Namun ada beberapa program / ekstensi shell yang memungkinkan Anda melakukan beberapa hal menu konteks yang lebih maju daripada yang diizinkan oleh peretas registri. (Satu-satunya yang dapat saya ingat adalah MMM .) Sayangnya, saya pikir mereka cenderung terbatas untuk membiarkan Anda membuat submenu daripada membiarkan beberapa objek dijatuhkan.
Synetech

Jawaban:

19

Anda juga dapat mencoba menambahkan program ke menu SendTo.

surfasb
sumber
Yup, itu bekerja dengan baik.
Synetech
1
Bekerja dengan sempurna. Berikut adalah petunjuk untuk cara menambahkan aplikasi ke menu SendTo di Windows 7. Tidak perlu menambahkan parameter baris perintah, cukup masukkan pintasan aplikasi ke folder% APPDATA% \ Microsoft \ Windows \ SendTo. Kembali di Windows Explorer, pilih dua file kemudian klik kanan dan pilih Kirim Ke> P4Merge melakukan perbedaan pada file yang dipilih.
SimonTewsi
3

Menjelajahi jawaban tampaknya tidak ada perbaikan sederhana dan ekstensi shell diperlukan. Melihat lagi entri registri untuk DiffMerge, tampaknya menggunakan ekstensi shell: DiffMergeShellExtension64.dll. Jika P4Merge tidak memiliki ekstensi shell seperti itu maka sepertinya satu-satunya cara saya dapat membuatnya bekerja dengan benar dalam menu konteks Windows Explorer adalah dengan menulis sendiri.

Panduan Lengkap Idiot untuk Menulis Ekstensi Ekstensi Shell dalam Proyek Kode adalah panduan yang berguna untuk menulis ekstensi shell. Bagian II dari seri ini adalah tentang menulis ekstensi yang menangani banyak file sekaligus (persis apa yang saya butuhkan).

Peringatan: Panduan Lengkap Idiot untuk Menulis Ekstensi Shell menggunakan C dan COM, ATL (Perpustakaan Templat Aktif) dan MFC (Kelas Yayasan Microsoft). Jadi, menulis ekstensi shell, jika Anda tidak terbiasa dengan teknologi itu, akan menjadi proses yang panjang dan berpotensi sulit; itu jelas bukan sesuatu yang dapat Anda lakukan dalam satu jam.

SimonTewsi
sumber
2

Anda dapat melakukannya dengan launcher menu konteks- program (singleinstance) program saya :

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
sumber
Tolong jangan menautkan langsung ke .exefile dalam jawaban Anda tanpa membuatnya jelas bahwa unduhan otomatis akan dimulai.
DavidPostill
Bekerja seperti pesona, terima kasih. Apakah ada cara untuk mengaitkan aplikasi singleinstance dengan jenis file apa pun, tanpa menambahkannya ke asosiasi file untuk setiap jenis file secara individual? Sebagai contoh, saya saat ini menggunakan DiffMerge untuk membandingkan hal-hal seperti file XML, skrip SQL, file konfigurasi, file * .cs, file .gitignore, plus yang lainnya.
SimonTewsi