給我 C# .Net 8.0 的 Class, 可以在 Windows 檔案總管的 Context Menu(右鍵選單)中添加自定義主選項和子選項, 主選項名稱為 "ZExtension", 子選單項目名稱分別為"Word", "Excel", "PDF", "Json", "...Else", 可在 Windows 檔案總管的 ContextMenu 中回呼 Class 中的函數, 並個別回呼 C# Class 中的對應函數. 以下是使用 C# .NET 8.0 創建的範例 Class,讓您能在 Windows 檔案總管的 Context Menu(右鍵選單)中添加自定義主選項和子選項。主選項名稱為 "ZExtension",每個子選項都可以回呼 Class 中對應的函數。 這實現需要用到 Windows Registry 和 COM Interop。以下是程式碼: ```csharp using Microsoft.Win32; using System; using System.Diagnostics; 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) { uint 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) { CMINVOKECOMMANDINFO info = Marshal.PtrToStructure(pici); string command = Marshal.PtrToStringAnsi(info.lpVerb); switch (command) { case "Word": ExecuteWordFunction(); break; case "Excel": ExecuteExcelFunction(); break; case "PDF": ExecutePdfFunction(); break; case "Json": ExecuteJsonFunction(); break; case "...Else": ExecuteElseFunction(); break; } } private void ExecuteWordFunction() { Debug.WriteLine("Executing Word Function"); } private void ExecuteExcelFunction() { Debug.WriteLine("Executing Excel Function"); } private void ExecutePdfFunction() { Debug.WriteLine("Executing PDF Function"); } private void ExecuteJsonFunction() { Debug.WriteLine("Executing JSON Function"); } private void ExecuteElseFunction() { Debug.WriteLine("Executing Else Function"); } 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); } // CMINVOKECOMMANDINFO 結構 [StructLayout(LayoutKind.Sequential)] public struct CMINVOKECOMMANDINFO { public uint cbSize; public uint fMask; public IntPtr hwnd; public IntPtr lpVerb; public IntPtr lpParameters; public IntPtr lpDirectory; public uint nShow; public uint dwHotKey; public IntPtr hIcon; } ``` ### 必要步驟: 1. **註冊 COM Server**:使用工具如 `RegAsm` 註冊該類。 2. **修改 Windows Registry**:新增關聯以使上下文選單顯示您的自定義選項。 3. **測試功能**:確保所有回呼函數正確執行。 ### 注意事項: 請確保程式碼中的 `Guid` 是唯一的,並備份 Windows Registry。在實現系統級功能時務必小心。 如果需要協助進一步修改程式碼或詳細解釋,隨時問我!