Integrasi shell Windows saat ini ── menu klik kanan, asosiasi file, dan perubahan di Windows 11

· Diperbarui pada: · · Windows, Ekstensi shell, Menu klik kanan, Asosiasi file, COM, Windows 11, Explorer, MSIX, Pengembangan Windows

Riwayat revisi (1 pembaruan, terakhir pada 31 Aug 2026)

Catatan perubahan yang dilakukan pada artikel ini. Jika versi sebelumnya telah diarsipkan, versi itu tetap dapat dibaca melalui tautan permanen dengan DOI.

Diterjemahkan ulang sebagai terjemahan lengkap dari naskah Jepang. Versi bahasa Indonesia sebelumnya adalah ringkasan yang hanya memindahkan sebagian naskah, sehingga bagian, tabel, gambar Mermaid, keterangan gambar, dan FAQ tidak ada. Semuanya dipulihkan sesuai naskah Jepang, dan klaim teknisnya sama dengan versi Jepang.
Publikasi pertama
Mengutip artikel ini(DOI (arsip terdaftar): 10.5281/zenodo.22176266)

DOI di bawah mengarah ke versi yang telah diarsipkan sebelumnya dan mungkin berbeda dari teks saat ini. Gunakan URL halaman ini untuk merujuk teks saat ini.

Go Komura (2026). Integrasi shell Windows saat ini ── menu klik kanan, asosiasi file, dan perubahan di Windows 11. KomuraSoft LLC. https://comcomponent.com/id/blog/windows-shell-integration-context-menu-file-association/

DOI (arsip terdaftar)
10.5281/zenodo.22176266
DOI (versi terakhir yang didaftarkan)
10.5281/zenodo.22176267

Saya menerima konsultasi seperti ini: “Kami mengganti PC ke Windows 11, dan menu klik kanan aplikasi yang dulu Anda buat untuk kami tidak muncul lagi.” Setelah ditanya lebih teliti, ternyata menu itu tidak hilang. Klik kanan sebuah file, pilih “Tampilkan opsi selengkapnya” di bagian bawah menu, dan menu yang sudah familiar muncul seperti semula. Artinya, item menu aplikasi perusahaan hanya tersembunyi satu langkah lebih dalam. Dari lapangan terdengar keluhan “jadi bertambah satu kali klik” dan “pertanyaan karena itemnya tidak ditemukan meningkat”.

Ini bukan kerusakan atau salah konfigurasi, melainkan perubahan desain Windows 11. Menu klik kanan Explorer menjadi struktur ganda, baru dan lama, dan syarat untuk menempatkan item di menu baru sama sekali berbeda dari sebelumnya.

Sementara itu, mekanisme asosiasi file dan ekstensi shell di bawahnya masih dunia COM dan registri yang lama. Kunci ekstensi menunjuk ke ProgID, verb pada ProgID memegang baris perintah, dan ekstensi yang lebih rumit berjalan sebagai server COM in-process (DLL) yang dimuat ke Explorer ── struktur ini tidak berubah selama lebih dari dua puluh tahun. Jika fondasi yang tidak berubah itu dan menu yang menjadi dua lapis di Windows 11 tidak keduanya dipahami, “menu tidak muncul”, “tersembunyi”, atau “muncul dua kali” tidak dapat diisolasi.

Artikel ini ditujukan kepada staf IT perusahaan kecil dan menengah serta pengembang Windows yang merawat aplikasi bisnis. Dari struktur tiga lapis asosiasi file, catatan penting tentang ekstensi shell klasik, cara menarget menu konteks baru Windows 11, hingga pendaftaran, pembersihan, dan pemecahan masalah di penginstal, semuanya dihubungkan dalam satu alur.

1. Kesimpulan dulu

  • Fondasi menu klik kanan dan asosiasi file adalah struktur registri tiga lapis “kunci ekstensi → ProgID → verb”. Kunci ekstensi adalah penunjuk ke ProgID, ProgID adalah objeknya, dan shell\<verb>\command di bawahnya memegang baris perintah.1
  • HKEY_CLASSES_ROOT (HKCR) bukan hive independen, melainkan tampilan gabungan HKLM\Software\Classes dan HKCU\Software\Classes. Pendaftaran untuk semua pengguna ditulis ke HKLM, pendaftaran per pengguna ke HKCU, dan HKCR diperlakukan sebagai tempat baca.2
  • Aplikasi default (yang terbuka saat diklik dua kali) dirancang untuk dipilih pengguna, dan tidak dapat direbut dari program. OS melindungi pilihan pengguna; yang dapat dilakukan penginstal adalah mendaftar sebagai kandidat.3
  • Ekstensi shell klasik adalah DLL COM in-process yang dimuat ke Explorer. Crash atau penundaan di ekstensi merambat ke Explorer secara keseluruhan (dan ke aplikasi lain yang memakai shell). Di lingkungan 64-bit DLL 64-bit wajib, dan implementasi dalam kode terkelola tidak didukung.45
  • Di Windows 11 menu klik kanan menjadi dua lapis. Yang masuk ke menu baru hanyalah perintah yang didaftarkan dengan IExplorerCommand plus identitas paket. Ekstensi IContextMenu klasik dipindahkan ke sisi menu lama di “Tampilkan opsi selengkapnya” (Shift+F10).67
  • Jalur resmi untuk menampilkan perintah kustom di menu baru adalah mendaftarkan DLL native yang mengimplementasikan IExplorerCommand di manifes MSIX (desktop4:FileExplorerContextMenus). Aplikasi yang tidak dapat dikemas MSIX dapat diberi identitas saja lewat sparse package (MSIX dengan lokasi eksternal).78
  • Jika yang ingin diwujudkan hanya “buka dengan aplikasi ini”, asosiasi dan verb statis masih cukup. DLL ekstensi shell tidak diperlukan, dan Microsoft sendiri menyatakan dengan tegas “pilih metode paling sederhana yang memenuhi persyaratan (verb statis)”.9
  • Setelah pendaftaran atau perubahan, beritahu dengan SHChangeNotify(SHCNE_ASSOCCHANGED). Saat uninstall, hapus ProgID tetapi jangan hapus nilai default kunci ekstensi — itu panduan resmi. Integrasi shell mencakup desain pembersihan.110

Dalam satu kalimat: dunia asosiasi dan verb tidak berubah; yang menjadi dua lapis di Windows 11 hanya cara menu ditampilkan. Berikut ini ditelusuri dari fondasinya.

Pada diagram, garis utuh menunjukkan relasi yang selalu berlaku dan garis putus-putus menunjukkan relasi bersyarat (syaratnya ada pada penjelasan masing-masing relasi di halaman rincian). Daftar lengkap relasi (total 16, beserta bukti dan tingkat kepastian) serta definisi konsep utama dikumpulkan di halaman rincian peta pengetahuan (dalam bahasa Jepang). Data: JSON-LD / Turtle

2. Cara kerja asosiasi file ── struktur tiga lapis kunci ekstensi → ProgID → verb

2.1. Membaca struktur tiga lapis dari satu contoh

Apa yang terjadi saat file dengan suatu ekstensi diklik dua kali diputuskan oleh tiga lapis kunci registri.1

HKEY_CLASSES_ROOT
   .kmrpt                                  ← (1) kunci ekstensi
      (Default) = KomuraSoft.Report.1      ←     penunjuk yang hanya menamai ProgID
      OpenWithProgids
         KomuraSoft.Report.1               ←     kandidat di "Buka dengan"
   KomuraSoft.Report.1                     ← (2) ProgID (objek asosiasi)
      (Default) = Dokumen laporan Komura
      DefaultIcon
         (Default) = "C:\Program Files\KomuraSoft\Report.exe",0
      shell                                ← (3) daftar verb (kata kerja)
         open
            command
               (Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
  • (1) Kunci ekstensi (.kmrpt) hanya menunjuk ke nama ProgID sebagai nilai default. Menulis perintah langsung di sini adalah kesalahan.
  • (2) ProgID (KomuraSoft.Report.1) adalah objek asosiasi; ia memegang nama tampilan, ikon, dan daftar verb.
  • (3) Verb adalah kata kerja seperti “buka” atau “cetak”, dan nilai default shell\open\command adalah baris perintah yang benar-benar diluncurkan.

Pemisahan ini memungkinkan beberapa ekstensi (.kmrpt dan .kmrpt-file, misalnya) diarahkan ke ProgID yang sama, atau ProgID diganti saat aplikasi di-upgrade.

Struktur tiga lapis asosiasi fileKunci ekstensi adalah penunjuk yang nilai defaultnya menamai ProgID; ProgID adalah objek yang memegang nama tampilan, ikon, dan daftar verb; nilai default command di bawah verb adalah baris perintah yang benar-benar diluncurkanmenamai ProgID sebagai nilai defaultKunci ekstensi .kmrptProgID KomuraSoft.Report.1verb (open dan lainnya di bawah shell)nilai default commandReport.exe diluncurkanJuga memegang nama tampilan dan DefaultIcon

Gambar 1: Kunci ekstensi adalah penunjuk, ProgID adalah objeknya, dan command pada verb adalah baris perintah yang benar-benar diluncurkan.

2.2. HKCR adalah “tampilan gabungan” ── ke mana ditulis mengubah makna

Contoh di atas ditampilkan di HKEY_CLASSES_ROOT (HKCR), tetapi HKCR bukan lokasi penyimpanan fisik, melainkan tampilan gabungan HKLM\Software\Classes dan HKCU\Software\Classes. Jika kunci yang sama ada di keduanya, sisi HKCU yang menang.2

HKCR adalah tampilan gabunganHKCR adalah tumpukan Classes dari HKLM dan HKCU; jika kunci yang sama ada di keduanya, HKCU yang diutamakan; tulis pendaftaran ke HKLM atau HKCU secara eksplisit dan perlakukan HKCR sebagai tempat bacaHKLM\Software\Classes (semua pengguna)HKCR (tampilan gabungan)HKCU\Software\Classes (per pengguna)Jika kunci yang sama ada, HKCU yang menangDiperlakukan sebagai tempat baca (untuk pemeriksaan)

Gambar 2: HKCR adalah tampilan tumpukan Classes dari HKLM dan HKCU; tujuan tulis selalu disebutkan secara eksplisit ke salah satunya.

Tujuan tulis Makna Hak yang diperlukan
HKLM\Software\Classes Pendaftaran bersama untuk semua pengguna Hak administrator
HKCU\Software\Classes Pendaftaran hanya untuk pengguna itu Tidak perlu
Menulis langsung ke HKCR Dialihkan tergantung lokasi kunci yang sudah ada Tergantung kasus

Dalam praktik, yang aman adalah selalu menulis pendaftaran ke HKLM atau HKCU secara eksplisit, dan memperlakukan HKCR sebagai tempat baca (untuk pemeriksaan). Hubungan dengan pengalihan registri WOW64 juga perlu disusun. Data asosiasi langsung di bawah HKLM\Software\Classes seperti kunci ekstensi dan ProgID dibagi bersama antar tampilan registri 32-bit dan 64-bit sejak Windows 7, sehingga penginstal 32-bit yang menulisnya tidak lari ke sisi Wow6432Node. Sebaliknya, sebagian subkunci pendaftaran COM seperti Classes\CLSID menjadi sasaran pengalihan, dan pada pendaftaran ekstensi shell (COM in-process) yang dibahas kemudian, pemisahan tulis 32-bit/64-bit menjadi relevan. Detailnya dibahas di “Jebakan pengalihan dan virtualisasi registri 32-bit/64-bit”.

2.3. Pendaftaran di sisi aplikasi ── App Paths, Applications, RegisteredApplications

Berpasangan dengan sisi file (ekstensi dan ProgID), ada juga tiga jenis pendaftaran di sisi aplikasi.11

  • App Paths (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths): pendaftaran agar dapat diluncurkan dari ShellExecuteEx hanya dengan nama file eksekusi. Microsoft merekomendasikan ini karena tidak perlu mencemari variabel lingkungan PATH.
  • Applications (HKCR\Applications\<aplikasi.exe>): mendefinisikan cara buka default ketika file sembarang diserahkan lewat “Buka dengan”, serta nama tampilan aplikasi (FriendlyAppName).
  • RegisteredApplications + Capabilities: menyatakan ekstensi dan tipe MIME yang dapat ditangani aplikasi, dan merupakan pendaftaran agar muncul sebagai kandidat di halaman pengaturan aplikasi default Windows.

Sebagian besar konsultasi “aplikasi kami tidak muncul di daftar aplikasi default” adalah kasus di mana ProgID sudah didaftarkan, tetapi pendaftaran Capabilities ini dihilangkan.

Tiga jenis pendaftaran di sisi aplikasiPendaftaran sisi aplikasi ada tiga jenis, yaitu App Paths, Applications, dan RegisteredApplications, masing-masing untuk peluncuran hanya dengan nama file, cara buka default di Buka dengan, dan kemunculan di halaman aplikasi defaultPendaftaran sisi aplikasiApp PathsApplicationsRegisteredApplicationsDiluncurkan hanya dengan nama fileDefault di Buka denganMuncul di halaman aplikasi defaultSyaratnya deklarasi Capabilities

Gambar 3: Pendaftaran sisi aplikasi ada tiga jenis; agar masuk kandidat halaman aplikasi default, pendaftaran Capabilities diperlukan.

2.4. Aplikasi default milik pengguna ── perlindungan UserChoice

Menulis ProgID ke nilai default kunci ekstensi tidak otomatis menjadikan aplikasi itu aplikasi default. Hasil pilihan eksplisit pengguna lewat “Buka dengan” dan sejenisnya disimpan di HKCU\...\Explorer\FileExts\<ekstensi>\UserChoice, dan saat asosiasi diselesaikan, sisi ini yang diutamakan.

Yang penting: Windows tidak mendukung perubahan aplikasi default oleh program. Pengaturan aplikasi default dirancang agar pengguna melakukannya lewat UI Pengaturan sistem. Data UserChoice diobfuskasi, dan driver filter (UCPD.sys) memblokir penulisan dari aplikasi. Di lingkungan terkelola, sarana resminya adalah kebijakan Grup / kebijakan MDM.3

Dulu alat seperti SetUserFTA yang “meniru hash lalu menimpa” dipakai; itu adalah sisi sebaliknya dari perlindungan ini. Yang seharusnya dimasukkan ke penginstal aplikasi perusahaan bukan merebut default, melainkan tiga hal: (a) pendaftaran ProgID dan verb yang benar, (b) penambahan ke OpenWithProgIds, (c) jika perlu, pengarahan ke halaman pengaturan.

Penyelesaian aplikasi default dan perlindungan UserChoiceHasil pilihan eksplisit pengguna disimpan di UserChoice dan diutamakan saat asosiasi diselesaikan; penulisan dari aplikasi dipotong oleh UCPD.sys, sehingga yang dapat dilakukan penginstal hanya pendaftaran sebagai kandidat dan pengarahan ke halaman pengaturandiutamakanUCPD.sys memotongUserChoice (pilihan pengguna)Penyelesaian asosiasiNilai default kunci ekstensiPenulisan dari aplikasiPekerjaan penginstalPendaftaran ProgID dan verbPenambahan ke OpenWithProgIdsPengarahan ke halaman pengaturan

Gambar 4: Saat asosiasi diselesaikan, pilihan pengguna (UserChoice) yang diutamakan, dan penulisan dari aplikasi dilindungi OS.

3. Verb selain “buka” ── print, edit, runas, verb kustom

Verb tidak hanya open. Verb standar yang maknanya dikenal OS mencakup open plus edit, print, play, preview, dan lainnya. Verb standar otomatis mendapat nama tampilan sesuai locale OS. Verb default yang dipakai saat diklik dua kali ditentukan dalam urutan: nilai default kunci shell → verb pertama di registri → open → openwith.12

Urutan penentuan verb defaultVerb default saat diklik dua kali ditentukan oleh yang pertama ditemukan, dalam urutan nilai default kunci shell, verb pertama di registri, open, lalu openwithjika tidak adajika tidak adajika tidak adaNilai default kunci shellVerb pertama di registriopenopenwith

Gambar 5: Verb default saat diklik dua kali memakai yang pertama ditemukan dalam urutan ini.

Untuk menambah kata kerja sendiri, daftarkan verb kustom.

KomuraSoft.Report.1
   shell
      open
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" "%1"
      print
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" /print "%1"
      verify                          ← verb kustom
         (Default) = Verifikasi laporan(&V)   ← nama tampilan di menu
         command
            (Default) = "C:\Program Files\KomuraSoft\Report.exe" /verify "%1"

Tiga catatan kecil yang berguna:

  • Jika verb bernama runas didaftarkan, peluncuran dengan elevasi setara “Jalankan sebagai administrator” dapat didefinisikan, dan juga dipakai saat API keluarga ShellExecute diluncurkan dengan runas.
  • Jika nilai kosong bernama Extended diletakkan pada kunci verb, itu menjadi verb tambahan yang hanya tampil saat Shift ditahan sambil klik kanan. Berguna untuk menyembunyikan operasi berbahaya yang jarang dipakai.12
  • Pada asosiasi aplikasi lama, kadang masih tersisa konfigurasi yang mengirim dokumen ke proses yang sudah berjalan lewat DDE (kunci ddeexec). Peluncuran verb lewat DDE sudah warisan yang tidak direkomendasikan (Deprecated). Tidak ada alasan menulisnya untuk yang baru.12

Satu lagi yang sering menimbulkan insiden: tanda kutip pada baris perintah. Jika elemen string perintah dapat mengandung spasi, elemen itu harus selalu diapit tanda kutip. Path EXE seperti C:\Program Files\... tentu saja, dan %1 (path file yang dipilih) harus selalu ditulis "%1". Tidak ada jaminan path file pengguna bebas spasi. My Program.exe tanpa tanda kutip ditafsirkan sebagai “luncurkan My dengan argumen Program.exe”.13

Insiden tanda kutip pada baris perintahPerintah tanpa tanda kutip dipotong di posisi spasi sehingga My diluncurkan dengan argumen Program.exe; path EXE dan %1 yang merepresentasikan path file yang dipilih, jika dapat mengandung spasi, harus selalu diapit tanda kutipdipotong di spasicommand tanpa tanda kutipSalah tafsir sebagai peluncuran EXE laincommand dengan tanda kutipDiluncurkan sesuai niatApit path EXE dengan tanda kutip%1 juga selalu diapit tanda kutip

Gambar 6: Perintah tanpa tanda kutip terpotong salah di spasi, jadi path EXE dan %1 selalu diapit tanda kutip.

Mekanisme registri sampai di sini (verb statis) dapat diwujudkan tanpa menulis satu pun DLL, dan tanpa risiko membuat Explorer tidak stabil. Microsoft sendiri berulang kali menyatakan: “sebelum menulis ekstensi shell, pertimbangkan apakah persyaratan dapat dipenuhi dengan verb statis paling sederhana”.9

4. Ekstensi shell klasik ── DLL yang berjalan di dalam Explorer

4.1. Jenis ekstensi shell

Untuk persyaratan yang tidak cukup dengan verb statis — “mengubah menu secara dinamis sesuai pilihan”, “mengganti ikon atau halaman properti” — dipakai penangan ekstensi shell. Jenis yang representatif adalah sebagai berikut.4

Penangan Antarmuka utama Yang dapat dilakukan
Penangan menu konteks IContextMenu + IShellExtInit Menambah dan mengontrol item menu secara dinamis
Penangan ikon / overlay ikon IExtractIcon / IShellIconOverlayIdentifier Ikon per file dan tampilan tumpukan
Penangan lembar properti IShellPropSheetExt Menambah tab pada halaman properti
Thumbnail / infotip IThumbnailProvider / IQueryInfo Tampilan diperkecil dan deskripsi saat kursor diarahkan
Penangan drag and drop / copy hook IDropTarget / ICopyHook Intervensi saat drop serta saat salin/pindah

Semua ini diimplementasikan sebagai kelas COM dan CLSID-nya didaftarkan di registri. Cara berpikir COM sendiri dibahas di “Apa itu COM / ActiveX / OCX”.

4.2. Artinya menjadi server COM in-process

Esensi ekstensi shell klasik adalah server COM in-process (DLL) yang dimuat ke dalam proses Explorer (atau aplikasi mana pun yang membuka dialog file umum). Semua catatan penting diturunkan dari sini.4

  • Jika ekstensi crash, Explorer ikut crash. Jika hang, klik kanan membeku beberapa detik. Kerusakannya tidak terbatas pada Explorer; semua aplikasi yang menampilkan dialog buka file terkena dampak.
  • Penyusunan menu dilakukan di thread UI, jadi pemrosesan lambat seperti akses jaringan atau I/O file tidak boleh dilakukan saat menu ditampilkan.
  • Model threading pada prinsipnya didaftarkan sebagai Apartment.
Struktur terdampak pada ekstensi in-processDLL ekstensi shell dimuat tidak hanya ke Explorer tetapi juga ke proses aplikasi mana pun yang membuka dialog file, sehingga crash atau hang pada ekstensi merambat ke seluruh proses hostdimuat ke dalam prosesdimuat ke dalam prosesDLL ekstensi shellExplorerAplikasi mana pun yang membuka dialogCrash atau hang merambatJangan lakukan pemrosesan lambat saat menampilkan

Gambar 7: DLL ekstensi berjalan di dalam proses host, jadi crash atau hang merambat ke seluruh host.

Saat menyelidiki keluhan “Explorer membeku saat folder tertentu dibuka” atau “klik kanan butuh 5 detik”, tidak jarang penyebabnya bukan aplikasi perusahaan, melainkan ekstensi shell pihak ketiga. Cara isolasinya dibahas di bab 8.

4.3. Kecocokan bitness ── di lingkungan 64-bit DLL 64-bit wajib

DLL in-process harus sama bitness-nya dengan proses yang memuatnya. Explorer di Windows 64-bit adalah proses 64-bit, jadi DLL ekstensi shell yang hanya dibangun 32-bit tidak dimuat sama sekali, dan tidak pernah muncul di menu. Tidak ada error, sehingga ini penyebab klasik “sudah didaftarkan tetapi tidak muncul”. Kombinasi aplikasi 32-bit dengan DLL ekstensi shell 64-bit adalah konfigurasi yang sah, tetapi perlu diingat bahwa pendaftaran COM terpisah per bitness (Wow6432Node). Peluncuran dari command verb adalah EXE di proses terpisah, jadi tidak terkena batasan ini (tetap 32-bit tidak masalah).

Kecocokan bitness DLL ekstensi shellYang dapat dimuat ke Explorer 64-bit hanya DLL ekstensi shell 64-bit; DLL yang hanya 32-bit tidak muncul di menu tanpa error; EXE yang diluncurkan dari command verb adalah proses terpisah sehingga tidak terkena batasandapat dimuattidak dapat dimuatproses terpisahExplorer 64-bitDLL ekstensi shell 64-bitDLL hanya 32-bitTidak muncul di menu, tanpa errorEXE yang diluncurkan verbTetap 32-bit tidak masalah

Gambar 8: Yang dimuat ke Explorer 64-bit hanya DLL 64-bit; EXE yang diluncurkan verb tidak terkena batasan ini.

4.4. Alasan tidak boleh ditulis dalam kode terkelola

Pertanyaan “bisakah ekstensi shell ditulis dalam C#” sering muncul, tetapi Microsoft menyatakan dengan tegas bahwa menulis ekstensi shell in-process dalam kode terkelola (.NET) tidak direkomendasikan dan berada di luar dukungan.5

Alasannya ada pada sifat ekstensi yang dimuat ke proses mana pun. Konflik versi CLR (terutama di bawah .NET Framework 4), masalah CLR yang masuk kembali ke message loop saat menunggu kunci, dan masa hidup objek yang tidak deterministik karena garbage collection yang bertabrakan dengan kontrak reference count COM — faktor yang membuat aplikasi host tidak stabil ada secara struktural. Beberapa butir mereda di .NET Framework 4 dan seterusnya atau .NET modern, tetapi posisi resmi tidak berubah.

Pedoman praktiknya sederhana. Ekstensi in-process ditulis dalam C++ native. Jika ingin memakai kode terkelola, jadikan EXE biasa yang diluncurkan dari command verb, atau ekstensi out-of-process yang berjalan di proses terpisah (penangan pratinjau, dan sejenisnya).5

Keputusan boleh tidaknya kode terkelolaEkstensi in-process yang berjalan di dalam proses Explorer pada prinsipnya ditulis dalam C++ native; jika ingin kode terkelola, jadikan EXE biasa yang diluncurkan dari command verb atau ekstensi out-of-process di proses terpisahyatidakEkstensi yang berjalan di dalam proses?Tulis dalam C++ nativeKode terkelola juga bolehHost tidak stabil karena konflik CLR atau reentrancyEXE biasa yang diluncurkan verbEkstensi proses terpisah seperti pratinjau

Gambar 9: Ekstensi in-process pada prinsipnya C++ native; kode terkelola dibatasi pada konfigurasi yang berjalan di proses terpisah.

5. Menu konteks baru Windows 11 ── menu yang menjadi dua lapis

5.1. Apa yang terjadi

Windows 11 menyegarkan menu klik kanan Explorer. Potong, salin, dan sejenisnya menjadi deretan ikon di bagian atas; “Buka” dan “Buka dengan” dikelompokkan di bagian atas; perintah yang ditambahkan aplikasi dikelompokkan di bawah perintah standar shell. Jika satu aplikasi menambahkan beberapa perintah, perintah itu digabung ke flyout (submenu) berlabel nama aplikasi.6

Poin kuncinya ini. Ekstensi shell berbasis IContextMenu klasik tidak dihapus, melainkan dipindahkan ke sisi menu lama yang memuat menu Windows 10 apa adanya, dibuka lewat “Tampilkan opsi selengkapnya” (Shift+F10).6 Itulah identitas “menu tersembunyi” pada konsultasi di pembuka.

Menu klik kanan yang menjadi dua lapis di Windows 11Yang pertama terbuka saat klik kanan adalah menu baru; yang masuk ke sana hanyalah perintah yang didaftarkan dengan IExplorerCommand dan identitas paket; ekstensi IContextMenu klasik dipindahkan ke sisi menu lama yang dibuka lewat Tampilkan opsi selengkapnyaTampilkan opsi selengkapnya Shift+F10Klik kanan fileMenu baru (Windows 11)Perintah IExplorerCommand + identitasMenu lama (menu Windows 10)Ekstensi IContextMenu klasikBeberapa perintah digabung ke flyout

Gambar 10: Yang masuk menu baru hanyalah perintah IExplorerCommand + identitas; ekstensi klasik dipindahkan ke sisi menu lama.

5.2. Jalur resmi ke menu baru ── IExplorerCommand + pendaftaran manifes

Cara menampilkan perintah kustom di menu baru hanya satu. Siapkan DLL native yang mengimplementasikan antarmuka IExplorerCommand, lalu deklarasikan server COM dan ekstensi menu konteks di manifes paket MSIX.7

<!-- Kutipan manifes paket -->
<com:Extension Category="windows.comServer">
  <com:ComServer>
    <com:SurrogateServer DisplayName="Komura commands">
      <com:Class Id="01234567-89AB-CDEF-0123-456789ABCDEF"
                 Path="KomuraCommand.dll" ThreadingModel="STA" />
    </com:SurrogateServer>
  </com:ComServer>
</com:Extension>
<desktop4:Extension Category="windows.fileExplorerContextMenus">
  <desktop4:FileExplorerContextMenus>
    <desktop5:ItemType Type=".kmrpt">
      <desktop5:Verb Id="VerifyReport"
                     Clsid="01234567-89AB-CDEF-0123-456789ABCDEF" />
    </desktop5:ItemType>
  </desktop4:FileExplorerContextMenus>
</desktop4:Extension>

Pada Type di ItemType, selain ekstensi tertentu, dapat ditentukan * (semua file), Directory (folder), dan Directory\Background (latar folder). DLL disesuaikan dengan arsitektur Explorer (64-bit/ARM64).7

IExplorerCommand sendiri adalah antarmuka yang sudah ada sejak era Windows 7, dan mengimplementasikan judul (GetTitle), ikon (GetIcon), status aktif/nonaktif/tersembunyi (GetState), dan eksekusi (Invoke). Metode dipanggil dari thread UI, jadi akses ke sumber daya jaringan dilarang, dan metode penyusunan menu harus kembali dengan cepat. Pemrosesan berat dilakukan setelah Invoke.147

Struktur manifes pendaftaran menu baruDeklarasi server COM di manifes MSIX memasangkan CLSID dengan DLL, dan deklarasi ekstensi menu konteks mengikat target dan implementasi lewat ItemType dan Verb, sehingga perintah kustom tampil di menu barumemasangkan CLSID dan DLLditentukan lewat ItemType dan VerbManifes MSIXDeklarasi server COMDeklarasi ekstensi menuDLL implementasi IExplorerCommandPerintah tampil di menu baruTargetnya ekstensi, semua file, dan sejenisnya

Gambar 11: Dua deklarasi di manifes mengikat DLL implementasi dengan target, lalu perintah masuk ke menu baru.

5.3. Pilihan untuk aplikasi non-paket ── memperoleh identitas saja dengan sparse package

Jalan keluar jika “aplikasi kami hanya bisa didistribusikan sebagai MSI; MSIX tidak mungkin” adalah sparse package (MSIX dengan lokasi eksternal). Buat MSIX kecil berisi hanya manifes, tanpa badan aplikasi, tandatangani, lalu daftarkan di akhir penginstal yang sudah ada. Dengan itu aplikasi memperoleh identitas paket, dan pendaftaran manifes di atas (= tampil di menu baru) menjadi mungkin. Tersedia sejak Windows 10 versi 2004, dan paket memerlukan tanda tangan dengan sertifikat yang dipercaya di mesin target.8

Alur memperoleh identitas dengan sparse packageSetelah badan aplikasi diletakkan oleh penginstal yang sudah ada, sparse package yang hanya berisi manifes didaftarkan dengan lokasi eksternal; aplikasi memperoleh identitas paket dan pendaftaran manifes ke menu baru menjadi mungkinPenginstal yang sudah adaMeletakkan badan aplikasisparse packageHanya manifes, tanpa badanDidaftarkan dengan lokasi eksternalMemperoleh identitas paketPendaftaran menu baru menjadi mungkinTanda tangan yang dipercaya diperlukan

Gambar 12: Sparse package tanpa badan aplikasi, didaftarkan dengan lokasi eksternal, membuat aplikasi memperoleh identitas paket.

Keuntungan terbesarnya adalah penginstal tidak perlu diganti; ini solusi realistis bagi aplikasi yang punya aset penginstal MSI/EXE. Perbandingan dengan migrasi penuh ke MSIX juga ada di “Cara memilih metode distribusi aplikasi Windows”.

5.4. Bagaimana verb asosiasi terlihat di menu baru

Poin yang mudah disalahpahami: asosiasi di bab 2–3 (ProgID dan verb) tetap hidup di menu baru. Verb default klik dua kali, “Buka”, dan kandidat “Buka dengan” diselesaikan dari asosiasi dan ditampilkan di bagian atas menu baru. Jadi jika hanya ingin “dapat dibuka dengan aplikasi ini”, di Windows 11 pun tidak perlu penanganan tambahan. Di sisi lain, asosiasi bukan ekstensi menu yang bersifat umum, jadi jika ingin menampilkan perintah kustom sembarang di hierarki pertama menu baru, IExplorerCommand + identitas diperlukan — itu pembagian perannya.7

Pembagian peran asosiasi dan menu baruAsosiasi ProgID dan verb tetap dipakai di menu baru untuk menyelesaikan verb default klik dua kali serta Buka dan Buka dengan, lalu ditampilkan di bagian atas; untuk menampilkan perintah kustom sembarang di hierarki pertama menu baru, IExplorerCommand dan identitas diperlukanAsosiasi (ProgID dan verb)Penyelesaian verb default dan BukaDitampilkan di bagian atas menu baruDi Windows 11 pun tidak perlu penanganan tambahanPerintah kustom sembarangIExplorerCommand + identitasDitampilkan di hierarki pertama menu baru

Gambar 13: Asosiasi tetap menyelesaikan keluarga “Buka” di menu baru; hanya perintah kustom yang memerlukan IExplorerCommand + identitas.

6. Tabel keputusan praktis ── mana dari tiga pilihan yang diambil

Sampai di sini disusun menjadi tiga pilihan praktis.

Yang ingin diwujudkan Sarana yang disarankan Tampilan di Windows 11 Pekerjaan dan biaya yang diperlukan
(a) Meluncurkan aplikasi perusahaan lewat klik dua kali atau “Buka” Asosiasi + verb statis (hanya pendaftaran registri) Tampil terintegrasi di “Buka” dan “Buka dengan” pada menu baru Hanya pendaftaran registri di penginstal. DLL tidak perlu, tidak ada syarat tanda tangan tambahan
(b) Menampilkan perintah kustom untuk file/folder yang dipilih di menu baru Implementasi IExplorerCommand + pendaftaran manifes MSIX. Aplikasi non-paket diberi identitas dengan sparse package Hierarki pertama menu baru (beberapa perintah digabung ke flyout nama aplikasi) DLL C++ native + identitas paket + tanda tangan kode
(c) Tetap memakai ekstensi IContextMenu klasik yang sudah ada Dipertahankan untuk saat ini (tidak dipilih untuk pengembangan baru) Hanya sisi menu lama “Tampilkan opsi selengkapnya” (Shift+F10) Mempertahankan build 64-bit dan pendaftaran COM. Rencanakan migrasi ke (b) di kemudian hari

Ada dua titik keputusan. Pertama, jangan membawa (b) atau (c) ke persyaratan yang cukup dengan (a). Begitu ekstensi shell ditulis, tanggung jawab atas stabilitas Explorer ikut dipikul. Kedua, (c) “tidak rusak”, tetapi secara pengalaman pengguna tetap diletakkan satu tingkat lebih dalam. Semakin sering perintah itu dipakai dalam operasi harian, semakin besar imbal hasil investasi migrasi ke (b).

Cara memilih tiga opsiJika hanya ingin diluncurkan lewat klik dua kali atau Buka, asosiasi dan verb statis cukup; jika ingin perintah kustom di menu baru, IExplorerCommand dan pendaftaran manifes MSIX; jika tidak dapat MSIX, beri identitas dengan sparse package; ekstensi IContextMenu klasik yang sudah ada dipertahankan untuk saat ini di sisi menu lamayatidakyayatidaktidakCukup Buka saja?Asosiasi + verb statisPerintah kustom di menu baru?Dapat dikemas MSIX?IExplorerCommand + MSIXIdentitas lewat sparse packageKlasik dipertahankan untuk saat iniHanya tampil di sisi menu lamaTanpa DLL, risikonya kecil

Gambar 14: Pilih dari tiga opsi sesuai persyaratan: verb statis, IExplorerCommand + identitas, atau mempertahankan yang klasik.

7. Praktik penyebaran dan pendaftaran ── penginstal, sparse package, pembersihan

7.1. HKLM atau HKCU

Diselaraskan dengan bentuk penginstal. Instalasi untuk semua pengguna (diletakkan di Program Files, hak administrator) memakai HKLM\Software\Classes; instalasi per pengguna (tanpa elevasi hak) memakai HKCU\Software\Classes. Jika dicampur, muncul pertanyaan tipe “A bisa membuka, B tidak bisa”. Untuk ekstensi shell yang disertai pendaftaran CLSID, Reg-Free COM yang meniadakan pendaftaran registri itu sendiri efektif untuk pemakaian COM di dalam aplikasi, tetapi tidak dapat diterapkan pada ekstensi shell yang dimuat Explorer, jadi pendaftaran jalur resmi tetap diperlukan (“Apa itu Reg-Free COM”).

7.2. Setelah diubah, beritahu ── SHChangeNotify

Setelah asosiasi didaftarkan, diubah, atau dihapus, beritahu peristiwa SHCNE_ASSOCCHANGED dengan SHChangeNotify. Jika ini dihilangkan, perubahan kadang tidak dikenali Explorer sampai dimulai ulang.110

// Panggil sekali setelah mengubah asosiasi, misalnya di custom action penginstal
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);

7.3. Pendaftaran dan pencabutan sparse package

Pendaftaran dan pencabutan sparse package adalah pekerjaan penginstal. Pendaftaran dilakukan setelah file diletakkan; pencabutan sebelum file dihapus.8

# Saat instalasi: setelah file diletakkan, daftarkan folder instalasi sebagai lokasi eksternal
Add-AppxPackage -Path "C:\Program Files\KomuraSoft\KomuraReport.identity.msix" `
                -ExternalLocation "C:\Program Files\KomuraSoft"

# Saat uninstall: cabut pendaftaran paket sebelum menghapus file
Remove-AppxPackage <nama lengkap paket>

Catatan: Add-AppxPackage didaftarkan terhadap pengguna yang menjalankannya. Jika dipanggil dari custom action MSI per-machine, menjalankannya sebagai LocalSystem tidak memberi identitas kepada pengguna yang menginstal, jadi konfigurasinya dijalankan dengan peniruan pengguna (impersonate). Namun, yang terdaftar lewat impersonasi juga hanya pengguna yang menjalankan instalasi itu. Di lingkungan satu PC dipakai banyak pengguna, pengguna lain atau pengguna yang dibuat kemudian tidak punya identitas paket, dan perintah tidak muncul di menu baru. Agar dipakai semua pengguna, siapkan mekanisme seperti memeriksa pendaftaran paket sendiri saat aplikasi pertama kali dijalankan lalu mendaftar jika belum (pendaftaran per pengguna), dan rencanakan pencabutan dari setiap pengguna yang sudah terdaftar saat uninstall. Selain itu, agar pendaftaran manifes berlaku, kadang diperlukan mulai ulang Explorer (atau sign-out).7

Urutan pendaftaran dan pencabutan sparse packageSaat instalasi, daftarkan sparse package setelah file diletakkan; saat uninstall, cabut pendaftaran sebelum file dihapus; perhatikan bahwa pendaftaran hanya berlaku bagi pengguna yang menjalankannyaInstalasiLetakkan fileDaftarkan sparse packageUninstallCabut pendaftaran paketHapus filePendaftaran hanya berlaku bagi pengguna yang menjalankan

Gambar 15: Daftar setelah file diletakkan, cabut sebelum file dihapus, dan perhatikan bahwa pendaftaran bersifat per pengguna yang menjalankan.

7.4. Pembersihan saat uninstall ── yang dihapus dan yang ditinggalkan

Untuk pembersihan saat uninstall, panduan resmi memberi arahan yang jelas.1

  • Yang dihapus: seluruh kunci ProgID milik sendiri, pendaftaran Capabilities/RegisteredApplications, pendaftaran CLSID ekstensi shell, sparse package (Remove-AppxPackage).
  • Yang ditinggalkan: nilai default kunci ekstensi (.kmrpt). Rekomendasi resmi adalah jangan menghapusnya meski masih menunjuk ke ProgID sendiri. Sulit menilai apakah aplikasi lain sudah mengambil default setelah instalasi, dan Windows mengabaikan saja ProgID pada nilai default jika tidak terdaftar, jadi meninggalkannya tidak menimbulkan dampak nyata.
  • Di akhir pembersihan, panggil juga SHChangeNotify(SHCNE_ASSOCCHANGED).

Banyak masalah “setelah uninstall masih ada sisa di menu” berasal dari celah pada desain pembersihan ini.

Desain pembersihan saat uninstallSaat uninstall, hapus kunci ProgID sendiri, pendaftaran CLSID, dan sparse package; nilai default kunci ekstensi ditinggalkan karena diabaikan jika tidak terdaftar; di akhir pembersihan beritahu perubahan dengan SHChangeNotifyUninstallYang dihapusYang ditinggalkanPendaftaran ProgID dan CLSIDsparse packageNilai default kunci ekstensiProgID yang tidak terdaftar diabaikanDi akhir, beritahu dengan SHChangeNotify

Gambar 16: Hapus pendaftaran milik sendiri, tinggalkan nilai default kunci ekstensi, dan beritahu perubahan di akhir pembersihan.

8. Pemecahan masalah ── tidak muncul, ganda, berat

8.1. Tidak muncul di menu

Isolasi secara berurutan.

  1. Menu mana yang sedang dilihat: pendaftaran cara lama hanya muncul di sisi menu lama Shift+F10. Periksa keduanya dulu.
  2. Bitness: DLL ekstensi shell yang hanya 32-bit tidak dimuat ke Explorer 64-bit (pasal 4.3).
  3. Tujuan pendaftaran: tertukarnya HKLM/HKCU atau Wow6432Node. Periksa kunci yang benar-benar ada dengan reg query.
  4. Pendaftaran paket: jika untuk menu baru, periksa ada tidaknya pendaftaran dengan Get-AppxPackage, kepercayaan sertifikat tanda tangan, dan path -ExternalLocation, lalu mulai ulang Explorer.7
  5. Pemberitahuan terlewat: jika SHChangeNotify terlupa, dapat dibedakan dari apakah mulai ulang Explorer membuatnya berlaku.
Urutan isolasi saat tidak muncul di menuMulai dari memeriksa menu mana yang sedang dilihat, lalu bitness DLL, tujuan pendaftaran registri, pendaftaran paket dan tanda tangan, kemudian pemberitahuan SHChangeNotify yang terlewatPastikan menu baru atau lamaPeriksa bitness DLLPeriksa tujuan pendaftaran HKLM dan HKCUPeriksa pendaftaran paket dan tanda tanganBedakan pemberitahuan terlewat dengan mulai ulang

Gambar 17: Saat “tidak muncul”, isolasi dalam urutan menu yang dilihat, bitness, tujuan pendaftaran, pendaftaran paket, lalu pemberitahuan terlewat.

8.2. Muncul dua kali atau tidak hilang

Penyebab tipikal adalah pendaftaran registri cara lama dan pendaftaran manifes hidup berdampingan, pembersihan uninstall yang tidak lengkap (pasal 7.4), atau sisa ProgID versi lama. Jika ganda hanya di menu lama, arahnya sisa; jika muncul di baru dan lama, arahnya hidup berdampingan.

Isolasi tampilan gandaJika ganda hanya di menu lama, arahnya sisa pembersihan atau ProgID lama; jika muncul di baru dan lama, arahnya pendaftaran registri cara lama dan pendaftaran manifes hidup berdampinganhanya menu lamabaru dan lamaGanda di mana?Tipe sisaTipe hidup berdampinganKebocoran pembersihan atau sisa ProgID lamaPendaftaran registri lama dan pendaftaran baru hidup berdampingan

Gambar 18: Ganda hanya di menu lama → tipe sisa; muncul di baru dan lama → tipe hidup berdampingan.

8.3. Explorer berat atau crash

Jika klik kanan lambat atau crash di folder tertentu, pertama-tama inventarisasi ekstensi shell yang terpasang. Dengan alat seperti ShellExView dari NirSoft, daftarkan ekstensi non-Microsoft, nonaktifkan sementara yang mencurigakan, dan temukan DLL penyebab dengan pencarian biner. Jika crash, “modul yang mengalami gangguan” di Event Viewer juga menjadi petunjuk. Jika ekstensi internal yang menjadi penyebab, curigai I/O sinkron dan akses jaringan di jalur penyusunan menu (pasal 4.2 dan 5.2).

Menemukan DLL penyebab saat berat atau crashDaftarkan ekstensi shell non-Microsoft di ShellExView, nonaktifkan sementara yang mencurigakan sambil pencarian biner untuk menemukan DLL penyebab; jika crash, modul gangguan di Event Viewer juga menjadi petunjukInventarisasi ekstensi shellDaftarkan yang non-MicrosoftNonaktifkan sementara dan pencarian binerTemukan DLL penyebabJika crashPeriksa modul gangguan

Gambar 19: Nonaktifkan sementara ekstensi non-Microsoft sambil pencarian biner; saat crash, Event Viewer juga dipakai bersama.

8.4. Verifikasi nyaman dengan Windows Sandbox

Verifikasi integrasi shell dasarnya adalah konfirmasi “instal di lingkungan bersih → operasi → uninstall → sisa nol”. Yang nyaman di sini adalah Windows Sandbox (Pro/Enterprise/Education): setiap kali dimulai, Windows sekali pakai yang bersih berdiri dalam beberapa detik, sehingga pengujian pendaftaran dan pembersihan penginstal dapat diulang berkali-kali. Setelah ditutup semuanya hilang, jadi cocok juga untuk menyelidiki sisa registri.15

9. Ringkasan

  • Asosiasi file adalah struktur tiga lapis “kunci ekstensi → ProgID → verb”, dan HKCR adalah tampilan gabungan Classes HKLM/HKCU. Tujuan tulis disebutkan secara eksplisit, dan %1 selalu diapit tanda kutip.
  • Aplikasi default dirancang untuk dipilih pengguna, dan tidak dapat diubah dari program. Pekerjaan penginstal hanya mendaftar dengan benar sebagai kandidat.
  • Ekstensi shell klasik adalah DLL COM in-process yang dimuat ke Explorer. Crash dan penundaan merambat ke keseluruhan, 64-bit wajib, kode terkelola tidak didukung, dan implementasi pada prinsipnya C++ native.
  • Di Windows 11 menu klik kanan menjadi dua lapis. Untuk menampilkan perintah kustom di menu baru diperlukan IExplorerCommand + manifes MSIX; IContextMenu klasik dipindahkan ke sisi “Tampilkan opsi selengkapnya”.
  • Aplikasi yang tidak dapat dikemas MSIX, solusi realistisnya memperoleh identitas dengan sparse package (MSIX dengan lokasi eksternal).
  • Jika hanya “buka dengan aplikasi ini”, asosiasi dan verb statis masih cukup. Memulai dari sarana paling sederhana juga merupakan pedoman resmi.
  • Setelah pendaftaran, perubahan, atau penghapusan, beritahu dengan SHChangeNotify; saat uninstall hapus ProgID tetapi tinggalkan nilai default kunci ekstensi. Windows Sandbox nyaman untuk verifikasi.

Jika saat penggantian PC ke Windows 11 terasa “menu tersembunyi”, pertama-tama pastikan di tabel keputusan bab 6 termasuk (a), (b), atau (c). Skala penanganannya seharusnya dapat diperkirakan di tempat.

Artikel terkait

Area konsultasi terkait

Di Komura Soft LLC kami menangani desain dan implementasi asosiasi file, menu klik kanan, dan ekstensi shell untuk aplikasi bisnis; penanganan menu konteks baru Windows 11 (IExplorerCommand, pengenalan sparse package); peninjauan pendaftaran dan pembersihan penginstal yang sudah ada; serta investigasi penyebab Explorer yang berat atau crash. Mulai dari penentuan arah “bagaimana menu yang tersembunyi di Tampilkan opsi selengkapnya” pun tidak masalah.

Tautan referensi

  1. Microsoft Learn, File Types. Tentang struktur kunci ekstensi yang menunjuk ke ProgID, OpenWithProgIds, pembedaan pemakaian pendaftaran ke HKLM/HKCU\Software\Classes, keharusan memanggil SHChangeNotify(SHCNE_ASSOCCHANGED) setelah asosiasi diubah, dan bahwa saat uninstall ProgID dihapus tetapi nilai default kunci ekstensi ditinggalkan. ↩ ↩2 ↩3 ↩4 ↩5

  2. Microsoft Learn, HKEY_CLASSES_ROOT Key. Tentang HKEY_CLASSES_ROOT sebagai tampilan gabungan HKLM\Software\Classes dan HKCU\Software\Classes, definisi sisi pengguna yang diutamakan atas sisi mesin, dan aturan pengalihan saat menulis. ↩ ↩2

  3. Microsoft Learn, Windows app defaults platform. Tentang desain bahwa perubahan aplikasi default hanya dapat dilakukan lewat UI Pengaturan sistem, data pengaturan pengguna yang diobfuskasi dan dilindungi tulis oleh driver filter (UCPD.sys), perubahan berbasis registri yang tidak didukung, dan pemakaian kebijakan Grup / kebijakan MDM di lingkungan terkelola. ↩ ↩2

  4. Microsoft Learn, Working with Shell Extensions. Tentang jenis penangan ekstensi shell, bahwa ekstensi adalah DLL COM in-process yang dimuat ke Explorer (dan proses yang menjadi host shell) sehingga crash atau hang merambat ke Explorer secara keseluruhan, pendaftaran dengan ThreadingModel=Apartment, dan bahwa alternatif yang lebih sederhana dari ekstensi shell harus dipertimbangkan lebih dulu. ↩ ↩2 ↩3

  5. Microsoft Learn, Guidance for Implementing In-Process Extensions. Tentang Microsoft yang tidak merekomendasikan dan tidak mendukung implementasi ekstensi shell in-process dalam kode terkelola, alasan seperti konflik versi CLR, reentrancy, dan masa hidup objek yang tidak deterministik, serta bahwa kode terkelola diperbolehkan pada ekstensi out-of-process (penangan pratinjau atau peluncuran dari shell\verb\command). ↩ ↩2 ↩3

  6. Windows Developer Blog, Extending the Context Menu and Share Dialog in Windows 11. Tentang desain menu konteks baru Windows 11, ekstensi lewat IExplorerCommand + identitas aplikasi, penempatan “Buka” dan “Buka dengan” di bagian atas, penggabungan beberapa perintah ke flyout berlabel nama aplikasi, dan bahwa ekstensi IContextMenu klasik dimuat sebagai menu Windows 10 di “Tampilkan opsi selengkapnya” (Shift+F10). ↩ ↩2 ↩3

  7. Microsoft Learn, Add a File Explorer context menu command to a packaged desktop app. Tentang pendaftaran ke menu konteks baru Windows 11 yang dilakukan dengan implementasi IExplorerCommand plus deklarasi manifes windows.comServer dan desktop4:FileExplorerContextMenus, kemampuan menentukan *, Directory, Directory\Background pada ItemType, kecocokan arsitektur DLL, menjaga metode penyusunan menu tetap cepat, penanganan aplikasi non-paket lewat sparse package, bahwa kadang mulai ulang Explorer diperlukan agar pendaftaran berlaku, dan bahwa asosiasi file bukan ekstensi menu yang bersifat umum. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  8. Microsoft Learn, Grant package identity by packaging with external location. Tentang memperoleh identitas paket dengan mendaftarkan paket berlokasi eksternal (sparse package) tanpa mengubah penginstal yang sudah ada, ketersediaan sejak Windows 10 versi 2004, dan bahwa fitur Windows yang mensyaratkan identitas (pendaftaran menu konteks, notifikasi, dan sejenisnya) menjadi dapat dipakai. ↩ ↩2 ↩3

  9. Microsoft Learn, Choosing a Static or Dynamic Shortcut Menu Method. Tentang keharusan memilih cara verb statis paling sederhana yang memenuhi persyaratan, IContextMenu sebagai yang paling kuat tetapi paling rumit dan diklasifikasikan ke sisi tidak direkomendasikan, serta IExplorerCommand/IExplorerCommandState sebagai cara yang direkomendasikan. ↩ ↩2

  10. Microsoft Learn, SHChangeNotify function. Tentang cara menerbitkan peristiwa SHCNE_ASSOCCHANGED untuk memberitahu perubahan asosiasi file ke sistem, dan pemakaiannya agar shell mengenali perubahan. ↩ ↩2

  11. Microsoft Learn, Application Registration. Tentang rekomendasi pendaftaran file eksekusi lewat subkunci App Paths, peran subkunci Applications, pendaftaran verb lewat SystemFileAssociations, dan urutan prioritas ProgID serta informasi terkait saat aplikasi default diubah. ↩

  12. Microsoft Learn, Creating Shortcut Menu Handlers. Tentang cara mendaftarkan verb statis, urutan penentuan verb default (nilai default → verb pertama → Open → Open With), nama tampilan verb standar yang disediakan OS, verb tambahan lewat Extended, asosiasi dengan perintah DDE yang tidak direkomendasikan (Deprecated), dan catatan pengalihan WOW64 di lingkungan 64-bit. ↩ ↩2 ↩3

  13. Microsoft Learn, Verbs and File Associations. Tentang verb sebagai kata kerja yang juga dipakai di ShellExecuteEx, keharusan mengapit dengan tanda kutip elemen string perintah yang dapat mengandung spasi dan selalu menulis “%1” dengan tanda kutip, serta pendaftaran prosedur default di bawah HKCR\Applications. ↩

  14. Microsoft Learn, IExplorerCommand interface. Tentang susunan metode GetTitle, GetIcon, GetState, Invoke, EnumSubCommands, dan lainnya; bahwa metode dipanggil di thread UI sehingga tidak boleh berkomunikasi dengan sumber daya jaringan; dan ketersediaan sejak Windows Vista. ↩

  15. Microsoft Learn, Windows Sandbox. Tentang lingkungan Windows terisolasi sekali pakai yang dapat dimulai dalam beberapa detik, semua perubahan dibuang saat ditutup, kecocokan untuk pengujian perangkat lunak dan verifikasi penginstal, serta ketersediaan di Pro/Enterprise/Education. ↩

Artikel terbaru dengan tag yang sama untuk mendalami topik-topik terdekat.

Halaman-halaman ini menempatkan topik dalam konteks layanan dan keputusan yang lebih luas.

Artikel ini berkaitan langsung dengan layanan berikut.

Pertanyaan yang sering diajukan

Pertanyaan yang sering muncul dalam konsultasi tentang topik artikel ini.

Mengapa di Windows 11 menu klik kanan aplikasi kami hanya muncul di dalam "Tampilkan opsi selengkapnya"?
Karena di Windows 11 menu klik kanan Explorer terbagi dua lapisan, baru dan lama. Item yang dapat muncul di menu baru hanyalah perintah yang mengimplementasikan antarmuka IExplorerCommand dan didaftarkan di manifes paket MSIX (= memiliki identitas paket). Ekstensi shell klasik berbasis IContextMenu dipindahkan ke menu lama yang dibuka lewat "Tampilkan opsi selengkapnya" (Shift+F10). Ekstensinya sendiri tidak rusak, jadi untuk saat ini tetap berjalan. Jika ingin muncul di menu baru, perlu migrasi ke IExplorerCommand serta pengemasan sebagai MSIX atau pemberian identitas lewat sparse package.
Dapatkah penginstal menetapkan aplikasi kami sebagai aplikasi default untuk suatu file (aplikasi yang terbuka saat diklik dua kali)?
Tidak. Memilih aplikasi default dirancang sebagai pekerjaan pengguna, dan Windows tidak mendukung mengubah aplikasi default dari mana pun selain UI Pengaturan sistem. Informasi UserChoice yang menyimpan pilihan per pengguna diobfuskasi, dan driver filter (UCPD.sys) juga memblokir penulisan dari aplikasi. Yang dapat dilakukan penginstal adalah mendaftarkan ProgID dan verb, menambahkan diri ke OpenWithProgIds agar muncul sebagai kandidat di "Buka dengan", dan mengarahkan pengguna ke halaman pengaturan aplikasi default. Implementasi yang benar bukan merebut default, melainkan menyiapkan diri agar dipilih.
Bolehkah ekstensi shell ditulis dalam kode terkelola seperti C#?
Microsoft menyatakan dengan tegas bahwa menulis ekstensi shell in-process (penangan menu konteks, penangan ikon, dan sejenisnya) dalam kode terkelola tidak direkomendasikan dan tidak didukung. Ekstensi dimuat ke proses Explorer maupun ke aplikasi mana pun yang membuka dialog file umum, sehingga konflik versi CLR, reentrancy, dan masa hidup objek yang tidak deterministik membuat aplikasi host tidak stabil. Prinsipnya adalah implementasi dalam C++ native. EXE biasa yang diluncurkan dari command verb, atau ekstensi out-of-process seperti penangan pratinjau yang berjalan di proses terpisah, tidak bermasalah jika memakai kode terkelola.
Apa itu sparse package (MSIX dengan lokasi eksternal)?
Paket MSIX kecil yang tidak berisi file aplikasi, hanya manifes (informasi identitas). Untuk aplikasi yang diinstal secara biasa dengan penginstal yang sudah ada (MSI, Inno Setup, dan sejenisnya), daftarkan paket itu dengan Add-AppxPackage -ExternalLocation yang menunjuk ke folder instalasi. Aplikasi lalu memperoleh identitas paket dan dapat memakai fitur yang mensyaratkan identitas, seperti pendaftaran di menu konteks baru Windows 11 dan notifikasi toast. Tersedia sejak Windows 10 versi 2004, dan paket memerlukan tanda tangan kode yang dipercaya di mesin target. Ini pilihan realistis jika ingin mendukung menu baru tanpa memindahkan seluruh cara distribusi ke MSIX.
Apa yang harus dilakukan jika item menu klik kanan muncul dua kali, atau tidak hilang?
Pertama isolasi penyebabnya dengan memeriksa di menu mana item itu muncul: menu baru atau menu lama (Tampilkan opsi selengkapnya). Tampilan ganda yang tipikal terjadi ketika pendaftaran registri cara lama dan pendaftaran manifes MSIX hidup berdampingan, atau ketika pendaftaran ProgID maupun CLSID ekstensi tidak dibersihkan saat uninstall. Setelah mengubah asosiasi, curigai juga SHChangeNotify(SHCNE_ASSOCCHANGED) yang terlewat; tepat setelah pendaftaran paket, curigai Explorer yang belum dimulai ulang. Jika masih belum selesai, nonaktifkan sementara ekstensi non-Microsoft di ShellExView dan temukan DLL penyebab dengan pencarian biner.

Profil penulis

Halaman perkenalan penulis artikel.

Go Komura

Direktur KomuraSoft LLC

Berspesialisasi dalam pengembangan perangkat lunak Windows, konsultasi teknis, dan investigasi bug, terutama pada proyek dengan sistem yang sudah ada dan bug yang sulit direproduksi.

Kembali ke blog