private static object HandleMenuMessage(ValueSet message, Win32API.DisposableDictionary table) { switch ((string)message["Arguments"]) { case "LoadContextMenu": var contextMenuResponse = new ValueSet(); var filePath = (string)message["FilePath"]; var extendedMenu = (bool)message["ExtendedMenu"]; var showOpenMenu = (bool)message["ShowOpenMenu"]; var split = filePath.Split('|').Where(x => !string.IsNullOrWhiteSpace(x)); var cMenuLoad = Win32API.ContextMenu.GetContextMenuForFiles(split.ToArray(), (extendedMenu ? Shell32.CMF.CMF_EXTENDEDVERBS : Shell32.CMF.CMF_NORMAL) | Shell32.CMF.CMF_SYNCCASCADEMENU, FilterMenuItems(showOpenMenu)); table.SetValue("MENU", cMenuLoad); return(cMenuLoad); case "ExecAndCloseContextMenu": var cMenuExec = table.GetValue <Win32API.ContextMenu>("MENU"); if (message.TryGetValue("ItemID", out var menuId)) { switch (message.Get("CommandString", (string)null)) { case "format": var drivePath = cMenuExec.ItemsPath.First(); Win32API.OpenFormatDriveDialog(drivePath); break; default: cMenuExec?.InvokeItem((int)menuId); break; } } // The following line is needed to cleanup resources when menu is closed. // Unfortunately if you uncomment it some menu items will randomly stop working. // Resource cleanup is currently done on app closing, // if we find a solution for the issue above, we should cleanup as soon as a menu is closed. //table.RemoveValue("MENU"); return(null); default: return(null); } }