Di bawah Windows 8 / 8.1 x64, saya ingin menetapkan ikon khusus untuk item menu konteks Windows default seperti Salin , Potong , Tempel , Hapus , Batalkan , Ulangi dan Kirim Ke item, yang secara default memiliki ikon apa pun:
Di mana saya dapat menemukan "referensi" ke item-item menu konteks dalam registri kemudian menambahkan nilai registri "ikon" untuk mereka?
Atau dengan kata lain, bagaimana cara menetapkan ikon ke menu ekstensi shell seperti shellex SendTo ?.
Penelitian
Seperti yang dikomentari oleh @ Sk8erPeter , tampaknya:
"Menambahkan nilai
Icon
string ke penangan menu konteks yang berbeda tidak berfungsi seperti saat menambahkannya ke item khusus seperti misalnyaHKEY_CLASSES_ROOT\*\shell\MYCUSTOMKEY
"
windows-8
context-menu
shell-extensions
ElektroStudios
sumber
sumber
Icon
Nilai String dalam kunci sepertiHKEY_CLASSES_ROOT\*\shell\MYCUSTOMITEM
(dan nilaiIcon
akan seperti misalnya%SystemRoot%\System32\shell32.dll,-133
atau sg. lain). TETAPI menambahkan nilaiIcon
string ke penangan menu konteks yang berbeda tidak berfungsi seperti saat menambahkannya ke item kustom ini.SetMenuItemInfo
sebagai responsQueryContextMenu
.Jawaban:
Pemberitahuan afiliasi: Saya adalah pembuat perangkat lunak yang disebutkan dalam jawaban ini.
Pertama, saya ingin Anda tahu bahwa saya belajar C ++ dan Win32 hanya untuk pertanyaan ini .
Saya telah mengembangkan ekstensi shell 64-bit yang terdaftar sebagai penangan menu konteks. Ketika dipanggil, ia menggeledah item menu yang ada, mencari entri yang menarik. Jika menemukan satu, itu menempel ikon di atasnya (yang harus dimuat sebelumnya). Saat ini, ia mencari Copy , Cut , Delete , Paste , Redo , Send to , dan Undo . Anda dapat menambahkan sendiri dengan mengubah kode; prosedur untuk ini dijelaskan di bawah ini. (Maaf, saya tidak cukup baik di C ++ untuk membuatnya dapat dikonfigurasi.)
Tangkapan layar itu sedang beraksi, dengan ikon-ikon paling jelek diketahui manusia:
Anda dapat mengunduh ikon-ikon ini jika Anda benar-benar mau.
Menyiapkannya
Unduh (dari Dropbox saya). Perhatikan : file ini terdeteksi oleh satu pemindai VirusTotal sebagai bentuk malware. Ini bisa dimengerti, mengingat hal-hal yang harus dilakukan untuk memukul entri yang ada. Saya memberi Anda kata-kata saya bahwa itu tidak membahayakan komputer Anda. Jika Anda curiga dan / atau ingin memodifikasi dan memperluasnya, lihat kode di GitHub !
Buat folder di drive C Anda:
C:\shellicon
. Buat file BMP dengan judul berikut:copy
,cut
,delete
,paste
,redo
,sendto
,undo
. (Semoga jelas yang mana melakukan hal yang mana.) Gambar-gambar ini mungkin harus 16 x 16 piksel (atau seberapa besar pengaturan DPI Anda membuat margin menu), tapi saya sudah sukses dengan yang lebih besar juga. Jika Anda ingin ikon terlihat transparan, Anda harus membuat latar belakangnya dengan warna yang sama dengan menu konteks. (Trik ini digunakan oleh Dropbox juga.) Saya membuat ikon mengerikan saya dengan MS Paint; program lain mungkin atau mungkin tidak menyimpan dengan cara yang kompatibel denganLoadImageA
. 16 dengan 16 pada kedalaman warna 24-bit pada 96 piksel per inci tampaknya merupakan properti gambar yang paling dapat diandalkan.Letakkan DLL di tempat yang dapat diakses oleh semua pengguna, folder yang baru saja Anda buat adalah pilihan yang baik. Buka prompt admin di folder yang berisi DLL dan lakukan
regsvr32 ContextIcons.dll
. Hal ini menciptakan informasi pendaftaran untuk jenis shell*
,Drive
,Directory
, danDirectory\Background
. Jika Anda ingin menghapus ekstensi shell, lakukanregsvr32 /u ContextIcons.dll
.Kode yang relevan
Pada dasarnya, ekstensi hanya menanyakan teks setiap item menu konteks dengan
GetMenuItemInfo
dan, jika sesuai, menyesuaikan ikon denganSetMenuItemInfo
.Visual Studio menghasilkan banyak kode ajaib ajaib untuk proyek ATL, tetapi ini adalah isinya
IconInjector.cpp
, yang mengimplementasikan penangan menu konteks:Perhatikan bahwa
HBITMAP
s tidak pernah dibersihkan, tetapi ini tidak terlalu penting mengingat barang-barang DLL akan hilang ketika Explorer dimatikan. Ikon hampir tidak mengambil memori apa pun.Jika Anda mengompilasi untuk 32-bit, parameter pertama
GetCommandString
adalah hanya sebagaiUINT
ganti aUINT_PTR
.Jika Anda benar-benar ingin ikon transparan, Anda harus membuat jendela dengan ikon yang diinginkan dan kemudian mengatur
mii.hBmpItem
untukHBMMENU_SYSTEM
dan menempatkan pegangan untuk jendela dimii.dwItemData
, seperti yang dijelaskan di bagian bawah artikel MSDN padaMENUITEMINFO
. Saya tidak dapat menemukan cara membuat windows dari ekstensi shell.LR_LOADTRANSPARENT
terlihat menjanjikan sebagai benderaLoadImageA
, tetapi memiliki perangkapnya sendiri - khususnya, tidak berfungsi kecuali jika Anda menggunakan bitmap 256-warna.Jika Anda mengalami masalah dengan pemuatan gambar, coba hapus
LR_DEFAULTSIZE
bendera dariLoadImageA
panggilan.Seseorang yang cukup cakap dalam C ++ mungkin dapat mengambil sumber daya dari DLL lain dan mengonversinya menjadi
HBITMAP
s, tetapi seseorang itu bukan saya.Memodifikasinya
Saya menulis ini di Visual Studio, yang saya yakini sebagai editor terbaik untuk Windows C ++.
Memuat file SLN ke dalam Visual Studio 2015 setelah Anda menginstal alat C ++. Di
IconInjector.cpp
, Anda dapat menambahkanHBITMAP
entri di bagian atas danLoadImageA
memanggilInitialize
untuk menambahkan ikon baru. Dielse if
bagian bawah, gunakanwcscmp
panggilan untuk mencari kecocokan yang tepat, atauwcsstr
panggilan untuk mencari keberadaan substring. Dalam kedua kasus,&
mewakili posisi garis bawah / akselerator saat menggunakan Shift + F10. Atur mode Anda ke Release dan arsitektur Anda ke x64, dan lakukan Build → Build Solution . Anda akan mendapatkan kesalahan tentang gagal mendaftarkan output, tetapi jangan khawatir; Anda tetap ingin melakukan ini secara manual. End Explorer, salin DLL baru (\x64\Release\ContextIcons.dll
dalam folder solusi) ke tempat itu, lalu lakukanregsvr32
dansa.Atribusi
Terima kasih banyak kepada penulis MSDN, dan kepada pencipta " Panduan Lengkap Idiot untuk Menulis Ekstensi Shell ", yang sangat saya referensikan.
Sanjungan
Untuk banyak contoh Explorer yang terbunuh dalam produksi ekstensi shell ini: Anda mati karena suatu alasan, bahwa beberapa orang di Internet dapat memiliki ikon di sebelah kata-kata mereka.
sumber
C:\shellicon\copy.bmp
, dll. - ini adalah 20x20 piksel ikon dalam format BMP) dan saya mendaftarkan dll sebagai admin di command prompt denganregsvr32 ContextIcons.dll
yang berjalan dengan sukses, tetapi Saya tidak melihat perubahan dalam menu konteks. Saya bahkan me-restart komputer, tidak terdaftar dan mendaftar ulang dll lagi, tetapi tidak ada perubahan. Saya mencoba mengkompilasi sumber di VS2015!Saya tidak memiliki cukup perwakilan untuk memberikan komentar tetapi tampaknya info ini terdapat di dalam shell32.dll. File-file telah dikompilasi sehingga sulit untuk melihat fungsi apa yang ada di dalamnya, tetapi tampaknya menjadi satu-satunya.
Yang menarik (ekspor registri):
HKEY_CLASSES_ROOT \ CLSID {3ad05575-8857-4850-9277-11b85bdb8e09}
(Default) REG_SZ Salin / Pindahkan / Ubah Nama / Hapus / Tautkan Objek
AppID REG_SZ {3ad05575-8857-4850-9277-11b85bdb8e09}
LocalizedString REG_EXPAND_SZ @% SystemRoot% \ system32 \ shell32.dll, -50176
Di bawah kunci InProcServer32 itu merujuk shell32.dll. Ada beberapa yang lain juga dengan nama yang terdengar relevan. Mungkin juga yang menarik adalah windows.storage.dll
sumber