private void MenuItem(IntPtr hMenu, string root, List <UnityMenuItem> items)
    {
        var count = Win32.GetMenuItemCount(hMenu);

        var menuName = new StringBuilder(64);

        for (var i = 0u; i < count; i++)
        {
            var mii = new Win32.MENUITEMINFO()
            {
                fMask = Win32.MIIM.FTYPE,
            };

            if (Win32.GetMenuItemInfo(hMenu, i, true, ref mii))
            {
                if (mii.fType == Win32.MFT_SEPARATOR)
                {
                    continue;
                }
            }

            Win32.GetMenuString(hMenu, i, menuName, menuName.Capacity, Win32.MF_BYPOSITION);

            var hSubMenu = Win32.GetSubMenu(hMenu, (int)i);

            var wID = Win32.GetMenuItemID(hMenu, (int)i);

            if ((int)wID > 0)
            {
                items.Add(new UnityMenuItem
                {
                    Path    = root,
                    Name    = menuName.ToString().Split('\t')[0],
                    Id      = (int)wID,
                    Enabled = true,
                });
            }

            MenuItem(hSubMenu, root + menuName + "/", items);
        }
    }
Exemple #2
0
        internal static void RecalcRepeatLastCommandMenuItem()
        {
            uint   rlcId, rlcIndex;
            IntPtr menu = FindRepeatLastCommandMenuItem(out rlcId, out rlcIndex);

            if (menu == IntPtr.Zero)
            {
                return;
            }

            MenuItem lastUsedItem = GetLastUsedMenuItem();

            Win32.MENUITEMINFO info = new Win32.MENUITEMINFO();
            info.cbSize = Win32.MENUITEMINFO.Size;
            info.fMask  = Win32.MIIM_FTYPE;
            Win32.GetMenuItemInfoW(menu, rlcIndex, true, ref info);

            string caption;

            if (lastUsedItem == null)
            {
                Win32.EnableMenuItem(menu, rlcIndex, Win32.MF_BYPOSITION | Win32.MF_DISABLED | Win32.MF_GRAYED);
                caption = Main.RepeatPreviousCommandLabel;
            }
            else
            {
                Win32.EnableMenuItem(menu, rlcIndex, Win32.MF_BYPOSITION | Win32.MF_ENABLED);
                caption = string.Format("Repeat command “{0}”", lastUsedItem);
            }

            IntPtr sPtr = Marshal.StringToHGlobalUni(caption);

            info.dwTypeData = sPtr;
            info.fMask      = Win32.MIIM_STRING | Win32.MIIM_FTYPE;
            Win32.SetMenuItemInfoW(menu, rlcIndex, true, ref info);

            Marshal.FreeHGlobal(sPtr);
        }