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); } }
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); }