private void OpenItemContextMenu(ShellItem itemHit, int x, int y) { // TODO: we need a min and max for the menu items. // see http://www.codeproject.com/Articles/4025/Use-Shell-ContextMenu-in-your-applications for more // The shell folder we use to get the UI object is either the folder itself if the // item is a folder, or the parent folder otherwise. var shellFolder = itemHit.IsFolder ? itemHit.ShellFolderInterface : itemHit.ParentItem.ShellFolderInterface; // The item pidl is either the folder if the item is a folder, or the combined pidl otherwise. var fullIdList = itemHit.IsFolder ? PidlManager.PidlToIdlist(itemHit.PIDL) : PidlManager.Combine(PidlManager.PidlToIdlist(itemHit.ParentItem.PIDL), PidlManager.PidlToIdlist(itemHit.RelativePIDL)); // Get the UI object of the context menu. IntPtr apidl = PidlManager.PidlsToAPidl(new IntPtr[] { PidlManager.IdListToPidl(fullIdList) }); IntPtr ppv = IntPtr.Zero; shellFolder.GetUIObjectOf(Handle, 1, apidl, Shell32.IID_IContextMenu, 0, out ppv); // If we have an item, cast it. if (ppv != IntPtr.Zero) { IContextMenu contextMenu = (IContextMenu)Marshal.GetObjectForIUnknown(ppv); var popupMenu = new ContextMenu(); contextMenu.QueryContextMenu(popupMenu.Handle, 0, 0, 65525, CMF.CMF_EXPLORE); popupMenu.Show(this, new Point(x, y)); } }