private static Shell32.IContextMenu GetContextMenuObject(params string[] PathArray) { if (PathArray.Count() > 1) { ShellItem[] Items = PathArray.Select((Path) => new ShellItem(Path)).ToArray(); ShellFolder[] ParentFolders = Items.Select((Item) => Item.Parent).ToArray(); try { if (ParentFolders.Skip(1).All((Folder) => Folder == ParentFolders[0])) { return(ParentFolders[0].GetChildrenUIObjects <Shell32.IContextMenu>(null, Items)); } else { throw new ArgumentException("All items must have the same parent"); } } finally { Array.ForEach(Items, (It) => It.Dispose()); Array.ForEach(ParentFolders, (It) => It.Dispose()); } } else { using (ShellItem Item = new ShellItem(PathArray.First())) { if (Item is ShellFolder Folder) { return(Folder.IShellFolder.CreateViewObject <Shell32.IContextMenu>(HWND.NULL)); } else { if (Item.Parent is ShellFolder ParentFolder) { try { return(ParentFolder.GetChildrenUIObjects <Shell32.IContextMenu>(null, Item)); } finally { ParentFolder?.Dispose(); } } else { return(Item.GetHandler <Shell32.IContextMenu>(Shell32.BHID.BHID_SFUIObject)); } } } } }