給我 C# .Net 8.0 的 Class, 可在 Windows 檔案總管的 ContextMenu 中, 提供一個主選單項目名稱為 "ZExtension", 點選主選單項目後, 可再選擇子選單項目名稱分別為"Word", "Excel", "PDF", "Json", "...Else", 然後回呼對應的 Class 中的函數. 以下是一個使用 C# .NET 8.0 實現的範例程式碼,可以在 Windows 檔案總管的上下文選單中新增一個主選單項目 "ZExtension",並包含子選單項目 "Word"、"Excel"、"PDF"、"Json" 和 "...Else"。當用戶選擇某個項目時,對應的函數會被回呼。 這需要使用 Windows Registry API 和 COM Interop,以下是核心程式碼範例: ```csharp using Microsoft.Win32; using System; using System.Runtime.InteropServices; [ComVisible(true)] [Guid("Your-GUID-Here")] // 替換為唯一的 GUID [ClassInterface(ClassInterfaceType.None)] public class ZExtensionContextMenu : IShellExtInit, IContextMenu { public void Initialize(IntPtr pidlFolder, IntPtr pDataObj, IntPtr hKeyProgID) { // 初始化代碼 } public int QueryContextMenu(IntPtr hMenu, uint indexMenu, uint idCmdFirst, uint idCmdLast, uint uFlags) { var cmdId = idCmdFirst; AppendMenu(hMenu, 0, cmdId++, "ZExtension\\Word"); AppendMenu(hMenu, 0, cmdId++, "ZExtension\\Excel"); AppendMenu(hMenu, 0, cmdId++, "ZExtension\\PDF"); AppendMenu(hMenu, 0, cmdId++, "ZExtension\\Json"); AppendMenu(hMenu, 0, cmdId++, "ZExtension\\...Else"); return (int)(cmdId - idCmdFirst); } public void InvokeCommand(IntPtr pici) { // 處理選擇的子選單項目 // 根據命令執行對應的函數 } public void GetCommandString(uint idCmd, uint uFlags, IntPtr pReserved, StringBuilder pszName, uint cchMax) { // 提供命令字串(可選) } [DllImport("user32.dll", CharSet = CharSet.Unicode)] private static extern bool AppendMenu(IntPtr hMenu, uint uFlags, uint uIDNewItem, string lpNewItem); } ``` ### 備註: 1. **註冊 COM Class**: 您需要將該類別註冊為 COM server,這通常需要使用 `Regasm` 或其他工具。 2. **修改 Windows Registry**: 創建適當的 Registry 記錄,以確保上下文選單與該程式碼相關聯。 3. **實作功能回呼**: 在 `InvokeCommand` 方法中,添加邏輯來處理子選單項目對應的函數。 ### 安全提醒: 請確認此程式碼完全滿足您的需求,並測試所有功能。在修改 Windows Registry 或實作系統相關的功能時務必謹慎,並確保您有適當的備份。 如果需要更詳細的實現指引或解釋,隨時可以詢問我!