Esempio n. 1
0
        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);
            }
        }