- fixed wrong initialization of MENUITEMINFO struct due to changes in recent...
5343aca5
Dimitar Tsenev
committed
3 changed files
User32.cs
/Shell/Interop/User32.cs-7+4
/Shell/Interop/User32.cs
Add comment 98 public string dwTypeData;
Add comment 99 public uint cch;
Add comment 100 public IntPtr hbmpItem;
Add comment 101 Minus   public static uint SizeOf {
Add comment 102 Minus   get {
Add comment 103 Minus   return (uint)Marshal.SizeOf(typeof(MENUITEMINFO));
Add comment 104 Minus   }
Add comment 105 Minus   }
Add comment 101 Plus   public static uint SizeOf => (uint)Marshal.SizeOf(typeof(MENUITEMINFO));
Add comment 106 102 }
Add comment 107 103
Add comment 108 104 [StructLayout(LayoutKind.Sequential)]
Add comment 143 139 MF_BYPOSITION = 0x00000400,
Add comment 144 140 }
Add comment 145 141
Add comment 142 Plus   [Flags]
Add comment 146 143 public enum MIIM : uint {
Add comment 147 144 MIIM_STATE = 0x00000001,
Add comment 148 145 MIIM_ID = 0x00000002,
Add comment 711 708 public static extern int GetMenuItemCount(IntPtr hMenu);
Add comment 712 709
Add comment 713 710 [DllImport("user32.dll", CharSet=CharSet.Auto)]
Add comment 714 Minus   public static extern bool GetMenuItemInfo(IntPtr hMenu, int uItem, bool fByPosition, ref MENUITEMINFO lpmii);
Add comment 711 Plus   public static extern bool GetMenuItemInfo(IntPtr hMenu, uint uItem, bool fByPosition, ref MENUITEMINFO lpmii);
Add comment 715 712 [DllImport("user32.dll")]
Add comment 716 713 public static extern bool ModifyMenu(IntPtr hMnu, uint uPosition, uint uFlags, IntPtr uIDNewItem, string lpNewItem);
Add comment 717 714 [DllImport("user32.dll")]
Add comment 752 749 MF_POPUP = 0x00000010,
Add comment 753 750 }
Add comment 754 751
Add comment 755 Minus   [DllImport("user32.dll")]
Add comment 752 Plus   [DllImport("user32.dll", CharSet = CharSet.Auto)]
Add comment 756 753 public static extern bool InsertMenuItem(IntPtr hMenu, uint uItem, bool fByPosition, [In] ref MENUITEMINFO lpmii);
Add comment 757 754
Add comment 758 755 [DllImport("user32.dll")]
ShellContextMenu.cs
/Shell/ShellContextMenu.cs-14+19
/Shell/ShellContextMenu.cs
Add comment 246 var count = User32.GetMenuItemCount(mnu.Handle);
Add comment 247
Add comment 248 var itemInfo = new MENUITEMINFO();
Add comment 249 Minus  
Add comment 249 Plus   itemInfo.cbSize = MENUITEMINFO.SizeOf;
Add comment 250 itemInfo.fMask = MIIM.MIIM_FTYPE | MIIM.MIIM_DATA | MIIM.MIIM_STRING | MIIM.MIIM_SUBMENU | MIIM.MIIM_ID;
Add comment 251 Minus   if (User32.GetMenuItemInfo(mnu.Handle, count - 1, true, ref itemInfo)) {
Add comment 251 Plus   if (User32.GetMenuItemInfo(mnu.Handle, (uint)count - 1, true, ref itemInfo)) {
Add comment 252 if ((itemInfo.fType & MFT.MFT_SEPARATOR) != 0) {
Add comment 253 User32.DeleteMenu(mnu.Handle, count - 1, MF.MF_BYPOSITION);
Add comment 254 }
Add comment 261 this.RemoveDefaultExplorerItems(mnu, control, ref itemInfo);
Add comment 262 }
Add comment 263
Add comment 264 Minus   User32.GetMenuItemInfo(mnu.Handle, User32.GetMenuItemCount(mnu.Handle) - 3, true, ref itemInfo);
Add comment 264 Plus   User32.GetMenuItemInfo(mnu.Handle, (uint)User32.GetMenuItemCount(mnu.Handle) - 3, true, ref itemInfo);
Add comment 265 if (itemInfo.hSubMenu == IntPtr.Zero) {
Add comment 266 Minus   User32.GetMenuItemInfo(mnu.Handle, User32.GetMenuItemCount(mnu.Handle) - 1, true, ref itemInfo);
Add comment 266 Plus   User32.GetMenuItemInfo(mnu.Handle, (uint)User32.GetMenuItemCount(mnu.Handle) - 1, true, ref itemInfo);
Add comment 267 }
Add comment 268
Add comment 269 this._NewMenuPtr = itemInfo.hSubMenu;
Add comment 424 var count = User32.GetMenuItemCount(mnu.Handle);
Add comment 425
Add comment 426 var itemInfo = new MENUITEMINFO();
Add comment 427 Minus  
Add comment 427 Plus   itemInfo.cbSize = MENUITEMINFO.SizeOf;
Add comment 428 itemInfo.fMask = MIIM.MIIM_FTYPE | MIIM.MIIM_DATA | MIIM.MIIM_STRING | MIIM.MIIM_SUBMENU | MIIM.MIIM_ID;
Add comment 429 Minus   if (User32.GetMenuItemInfo(mnu.Handle, count - 1, true, ref itemInfo)) {
Add comment 429 Plus   if (User32.GetMenuItemInfo(mnu.Handle, (uint)count - 1, true, ref itemInfo)) {
Add comment 430 if ((itemInfo.fType & MFT.MFT_SEPARATOR) != 0) {
Add comment 431 User32.DeleteMenu(mnu.Handle, count - 1, MF.MF_BYPOSITION);
Add comment 432 }
Add comment 433 }
Add comment 434
Add comment 435 Minus   User32.GetMenuItemInfo(mnu.Handle, User32.GetMenuItemCount(mnu.Handle) - 3, true, ref itemInfo);
Add comment 435 Plus   User32.GetMenuItemInfo(mnu.Handle, (uint)User32.GetMenuItemCount(mnu.Handle) - 3, true, ref itemInfo);
Add comment 436 if (itemInfo.hSubMenu == IntPtr.Zero) {
Add comment 437 Minus   User32.GetMenuItemInfo(mnu.Handle, User32.GetMenuItemCount(mnu.Handle) - 1, true, ref itemInfo);
Add comment 437 Plus   User32.GetMenuItemInfo(mnu.Handle, (uint)User32.GetMenuItemCount(mnu.Handle) - 1, true, ref itemInfo);
Add comment 438 }
Add comment 439
Add comment 440 this._NewMenuPtr = itemInfo.hSubMenu;
Add comment 685 private void RemoveDuplicatedSeparators(ContextMenu mnu) {
Add comment 686 var duplicatedSeparators = new List<int>();
Add comment 687 int newCount = User32.GetMenuItemCount(mnu.Handle);
Add comment 688 Minus   for (int i = 0; i < newCount - 1; i++) {
Add comment 688 Plus   for (uint i = 0; i < newCount - 1; i++) {
Add comment 689 var info = new MENUITEMINFO();
Add comment 690 Minus  
Add comment 690 Plus   info.cbSize = MENUITEMINFO.SizeOf;
Add comment 691 info.fMask = MIIM.MIIM_FTYPE | MIIM.MIIM_DATA | MIIM.MIIM_STRING | MIIM.MIIM_SUBMENU;
Add comment 692 if (User32.GetMenuItemInfo(mnu.Handle, i, true, ref info)) {
Add comment 693 var isSep = (info.fType & MFT.MFT_SEPARATOR) != 0;
Add comment 694 if (isSep) {
Add comment 695 var info2 = new MENUITEMINFO();
Add comment 696 Minus  
Add comment 696 Plus   info2.cbSize = MENUITEMINFO.SizeOf;
Add comment 697 info2.fMask = MIIM.MIIM_FTYPE | MIIM.MIIM_DATA | MIIM.MIIM_STRING | MIIM.MIIM_SUBMENU;
Add comment 698 if (User32.GetMenuItemInfo(mnu.Handle, i + 1, true, ref info2)) {
Add comment 699 var isSep2 = (info2.fType & MFT.MFT_SEPARATOR) != 0;
Add comment 700 if (isSep2) {
Add comment 701 Minus   duplicatedSeparators.Add(i + 1);
Add comment 701 Plus   duplicatedSeparators.Add((int)i + 1);
Add comment 702 }
Add comment 703 }
Add comment 704 }
Add comment 734 User32.DeleteMenu(mnu.Handle, 0, MF.MF_BYPOSITION);
Add comment 735 }
Add comment 736 }
Add comment 737 Plus  
Add comment 737 738 }
Add comment 738 739 private void GenerateSubmenu(ContextMenu child, ContextMenu parent, String header) {
Add comment 739 740 MENUITEMINFO miiview = new MENUITEMINFO();
Add comment 740 Minus  
Add comment 741 Plus   miiview.cbSize = MENUITEMINFO.SizeOf;
Add comment 741 742 miiview.fMask = MIIM.MIIM_STRING | MIIM.MIIM_FTYPE | MIIM.MIIM_STATE | MIIM.MIIM_SUBMENU;
Add comment 742 743 miiview.fState = 0x0;
Add comment 743 744 miiview.fType = 0;
Add comment 748 749 }
Add comment 749 750 private void GenerateMenuItem(ContextMenu view, String header, int id, bool isRadio = false, uint atPosition = 0) {
Add comment 750 751 MENUITEMINFO miidetails = new MENUITEMINFO();
Add comment 752 Plus   miidetails.cbSize = MENUITEMINFO.SizeOf;
Add comment 751 753 miidetails.fMask = MIIM.MIIM_STRING | MIIM.MIIM_ID | MIIM.MIIM_FTYPE | MIIM.MIIM_STATE;
Add comment 752 754 miidetails.fState = (MFS)(isRadio ? 0x00000008 : 0x0);
Add comment 753 755 miidetails.fType = (MFT)(0 | 0x00000200);
Add comment 758 760 }
Add comment 759 761 private void GenerateMenuItemExecutable(ContextMenu view, String header, int id) {
Add comment 760 762 MENUITEMINFO miidetails = new MENUITEMINFO();
Add comment 763 Plus   miidetails.cbSize = MENUITEMINFO.SizeOf;
Add comment 761 764 miidetails.fMask = MIIM.MIIM_STRING | MIIM.MIIM_ID | MIIM.MIIM_FTYPE | MIIM.MIIM_STATE;
Add comment 762 765 miidetails.fState = 0x0;
Add comment 763 766 miidetails.fType = 0;
Add comment 768 771 }
Add comment 769 772 private void GenerateSeparator(ContextMenu view) {
Add comment 770 773 MENUITEMINFO miidetails = new MENUITEMINFO();
Add comment 774 Plus   miidetails.cbSize = MENUITEMINFO.SizeOf;
Add comment 771 775 miidetails.fMask = MIIM.MIIM_FTYPE;
Add comment 772 776 miidetails.fType = MFT.MFT_SEPARATOR;
Add comment 773 777 User32.InsertMenuItem(view.Handle, 0, true, ref miidetails);
Add comment 868 872
Add comment 869 873 menuInfo.cbSize = Marshal.SizeOf(menuInfo);
Add comment 870 874 menuInfo.fMask = MIM.MIM_MENUDATA;
Add comment 875 Plus   itemInfo.cbSize = MENUITEMINFO.SizeOf;
Add comment 871 876 itemInfo.fMask = MIIM.MIIM_ID | MIIM.MIIM_SUBMENU;
Add comment 872 877
Add comment 873 878 // First, tag the managed menu items with an arbitary
Add comment 875 880 TagManagedMenuItems(menu, tag);
Add comment 876 881
Add comment 877 882 for (int n = 0; n < count; ++n) {
Add comment 878 Minus   User32.GetMenuItemInfo(menu.Handle, n, true, ref itemInfo);
Add comment 883 Plus   User32.GetMenuItemInfo(menu.Handle, (uint)n, true, ref itemInfo);
Add comment 879 884
Add comment 880 885 if (itemInfo.hSubMenu == IntPtr.Zero) {
Add comment 881 886 // If the item has no submenu we can't get the tag, so
ShellViewEx.cs
/Shell/ShellViewEx.cs-11+1
/Shell/ShellViewEx.cs
Add comment 3748 }
Add comment 3749 var obj = FileSystemListItem.ToFileSystemItem(this.LVHandle, args.FullPath.ToShellParsingName());
Add comment 3750 if (obj.IsInCurrentFolder(this.CurrentFolder)) {
Add comment 3751 Minus   if (this.IsRenameNeeded) {
Add comment 3752 Minus   var existingItem = this.Items.ToArray().FirstOrDefault(s => s.Equals(obj));
Add comment 3753 Minus   if (existingItem == null) {
Add comment 3754 Minus   var itemIndex = this.InsertNewItem(obj);
Add comment 3755 Minus   this.SelectItemByIndex(itemIndex, true, true);
Add comment 3756 Minus   this.RenameSelectedItem(itemIndex);
Add comment 3757 Minus   this.IsRenameNeeded = false;
Add comment 3758 Minus   } else {
Add comment 3759 Minus   this.RenameSelectedItem(existingItem.ItemIndex);
Add comment 3760 Minus   }
Add comment 3761 Minus   } else {
Add comment 3751 Plus   if (!this.IsRenameNeeded) {
Add comment 3762 3752 if (this._ItemsQueue.Enqueue(new Tuple<ItemUpdateType, IListItemEx>(ItemUpdateType.Created, obj))) {
Add comment 3763 3753 this.UnvalidateDirectory();
Add comment 3764 3754 }