public ContextMenuItem(ContextMenuPackage DataPackage, string BelongTo) { this.DataPackage = DataPackage; this.BelongTo = BelongTo; SubMenus = DataPackage.SubMenus.Select((Menu) => new ContextMenuItem(Menu, BelongTo)).ToArray(); }
public ContextMenuItem(ContextMenuPackage DataPackage, string BelongTo) { this.DataPackage = DataPackage; this.BelongTo = BelongTo; }
private static ContextMenuPackage[] FetchContextMenuCore(Shell32.IContextMenu Context, HMENU Menu, string[] RelatedPath, bool IncludeExtensionItem) { int MenuItemNum = User32.GetMenuItemCount(Menu); List <ContextMenuPackage> MenuItems = new List <ContextMenuPackage>(MenuItemNum); for (uint i = 0; i < MenuItemNum; i++) { IntPtr DataHandle = Marshal.AllocCoTaskMem(BufferSize); try { User32.MENUITEMINFO Info = new User32.MENUITEMINFO { cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(User32.MENUITEMINFO))), fMask = User32.MenuItemInfoMask.MIIM_ID | User32.MenuItemInfoMask.MIIM_SUBMENU | User32.MenuItemInfoMask.MIIM_FTYPE | User32.MenuItemInfoMask.MIIM_STRING | User32.MenuItemInfoMask.MIIM_STATE | User32.MenuItemInfoMask.MIIM_BITMAP, dwTypeData = DataHandle, cch = CchMax }; if (User32.GetMenuItemInfo(Menu, i, true, ref Info)) { if (Info.fType.IsFlagSet(User32.MenuItemType.MFT_STRING) && !Info.fState.IsFlagSet(User32.MenuItemState.MFS_DISABLED)) { IntPtr VerbWHandle = IntPtr.Zero; IntPtr VerbAHandle = IntPtr.Zero; string Verb = null; try { VerbWHandle = Marshal.AllocCoTaskMem(BufferSize); if (Context.GetCommandString(new IntPtr(Info.wID), Shell32.GCS.GCS_VERBW, IntPtr.Zero, VerbWHandle, CchMax).Succeeded) { Verb = Marshal.PtrToStringUni(VerbWHandle); } if (string.IsNullOrEmpty(Verb)) { VerbAHandle = Marshal.AllocCoTaskMem(BufferSize); if (Context.GetCommandString(new IntPtr(Info.wID), Shell32.GCS.GCS_VERBA, IntPtr.Zero, VerbAHandle, CchMax).Succeeded) { Verb = Marshal.PtrToStringAnsi(VerbAHandle); } } } catch (AccessViolationException AVE) { Verb = null; LogTracer.Log(AVE, "Could not get verb from context menu item"); } finally { if (VerbAHandle != IntPtr.Zero) { Marshal.FreeCoTaskMem(VerbAHandle); } if (VerbWHandle != IntPtr.Zero) { Marshal.FreeCoTaskMem(VerbWHandle); } } Verb ??= string.Empty; if (!VerbFilterHashSet.Contains(Verb.ToLower())) { try { string Name = Marshal.PtrToStringUni(DataHandle); if (!string.IsNullOrEmpty(Name) && !NameFilterHashSet.Contains(Name)) { ContextMenuPackage Package = new ContextMenuPackage { Name = Regex.Replace(Name, @"\(&\S*\)|&", string.Empty), Id = Convert.ToInt32(Info.wID), Verb = Verb, IncludeExtensionItem = IncludeExtensionItem, RelatedPath = RelatedPath }; if (Info.hbmpItem != HBITMAP.NULL && ((IntPtr)Info.hbmpItem).ToInt64() != -1) { using (Bitmap OriginBitmap = Info.hbmpItem.ToBitmap()) { BitmapData OriginData = OriginBitmap.LockBits(new Rectangle(0, 0, OriginBitmap.Width, OriginBitmap.Height), ImageLockMode.ReadOnly, OriginBitmap.PixelFormat); try { using (Bitmap ArgbBitmap = new Bitmap(OriginBitmap.Width, OriginBitmap.Height, OriginData.Stride, PixelFormat.Format32bppArgb, OriginData.Scan0)) using (MemoryStream Stream = new MemoryStream()) { ArgbBitmap.Save(Stream, ImageFormat.Png); Package.IconData = Stream.ToArray(); } } finally { OriginBitmap.UnlockBits(OriginData); } } } else { Package.IconData = Array.Empty <byte>(); } if (Info.hSubMenu != HMENU.NULL) { Package.SubMenus = FetchContextMenuCore(Context, Info.hSubMenu, RelatedPath, IncludeExtensionItem); } else { Package.SubMenus = Array.Empty <ContextMenuPackage>(); } MenuItems.Add(Package); } } catch { continue; } } } } } catch (Exception ex) { LogTracer.Log(ex, "Exception was threw when fetching the context menu item"); } finally { Marshal.FreeCoTaskMem(DataHandle); } } return(MenuItems.ToArray()); }
private static ContextMenuPackage[] FetchContextMenuCore(Shell32.IContextMenu Context, HMENU Menu) { int MenuItemNum = User32.GetMenuItemCount(Menu); List <ContextMenuPackage> MenuItems = new List <ContextMenuPackage>(MenuItemNum); for (uint i = 0; i < MenuItemNum; i++) { IntPtr DataHandle = Marshal.AllocHGlobal(BufferSize); try { User32.MENUITEMINFO Info = new User32.MENUITEMINFO { cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(User32.MENUITEMINFO))), fMask = User32.MenuItemInfoMask.MIIM_ID | User32.MenuItemInfoMask.MIIM_SUBMENU | User32.MenuItemInfoMask.MIIM_FTYPE | User32.MenuItemInfoMask.MIIM_STRING | User32.MenuItemInfoMask.MIIM_STATE | User32.MenuItemInfoMask.MIIM_BITMAP, dwTypeData = DataHandle, cch = BufferSize }; if (User32.GetMenuItemInfo(Menu, i, true, ref Info)) { if (Info.fType.IsFlagSet(User32.MenuItemType.MFT_STRING) && !Info.fState.IsFlagSet(User32.MenuItemState.MFS_DISABLED)) { IntPtr VerbHandle = Marshal.AllocHGlobal(BufferSize); try { string Verb = Context.GetCommandString(new IntPtr(Info.wID), Shell32.GCS.GCS_VERBW, IntPtr.Zero, VerbHandle, Convert.ToUInt32(BufferSize)).Succeeded ? Marshal.PtrToStringUni(VerbHandle) : string.Empty; if (!VerbFilterHashSet.Contains(Verb.ToLower())) { try { string Name = Marshal.PtrToStringUni(DataHandle); if (!string.IsNullOrEmpty(Name) && !NameFilterHashSet.Contains(Name)) { ContextMenuPackage Package = new ContextMenuPackage { Name = Regex.Replace(Name, @"\(&\S*\)|&", string.Empty), Id = Convert.ToInt32(Info.wID), Verb = Verb }; if (Info.hbmpItem != HBITMAP.NULL && ((IntPtr)Info.hbmpItem).ToInt64() != -1) { using (Bitmap OriginBitmap = Info.hbmpItem.ToBitmap()) { BitmapData OriginData = OriginBitmap.LockBits(new Rectangle(0, 0, OriginBitmap.Width, OriginBitmap.Height), ImageLockMode.ReadOnly, OriginBitmap.PixelFormat); try { using (Bitmap ArgbBitmap = new Bitmap(OriginBitmap.Width, OriginBitmap.Height, OriginData.Stride, PixelFormat.Format32bppArgb, OriginData.Scan0)) using (MemoryStream Stream = new MemoryStream()) { ArgbBitmap.Save(Stream, ImageFormat.Png); Package.IconData = Stream.ToArray(); } } finally { OriginBitmap.UnlockBits(OriginData); } } } else { Package.IconData = Array.Empty <byte>(); } if (Info.hSubMenu != HMENU.NULL) { Package.SubMenus = FetchContextMenuCore(Context, Info.hSubMenu); } else { Package.SubMenus = Array.Empty <ContextMenuPackage>(); } MenuItems.Add(Package); } } catch { continue; } } } finally { Marshal.FreeHGlobal(VerbHandle); } } } } finally { Marshal.FreeHGlobal(DataHandle); } } return(MenuItems.ToArray()); }
public ContextMenuItem(ContextMenuPackage DataPackage) { this.DataPackage = DataPackage; }