/// <summary>Gets popup menu items from padding</summary> /// <param name="reader">Menu bytes</param> /// <param name="padding">Starting popup menu padding</param> /// <exception cref="T:InvalidOperationException">Can't find end of menu marker</exception> /// <returns>Readed popup menu items</returns> private MenuPopupItem[] GetPopupMenu(PinnedBufferReader reader, ref UInt32 padding) { List <MenuPopupItem> result = new List <MenuPopupItem>(); while (padding < reader.Length) { padding = NativeMethods.AlignToInt(padding); WinUser.MENUITEMEX item = reader.BytesToStructure <WinUser.MENUITEMEX>(ref padding); MenuPopupItem menu = new MenuPopupItem() { ItemEx = item, }; result.Add(menu); menu.Title = reader.BytesToStringUni(ref padding); if (item.IsPopUp) { menu.dwHelpId = reader.BytesToStructure <UInt32>(ref padding); menu.SubItems = this.GetPopupMenu(reader, ref padding); } if (item.IsFinal) { return(result.ToArray()); } } throw new InvalidOperationException(); }
/// <summary>Получить всплывающее меню</summary> /// <param name="reader">Allocated bytes in memory</param> /// <param name="padding">Отступ от начала</param> /// <exception cref="T:InvalidOperationException">Cand find end of menu marker</exception> /// <returns>Всплывающее меню</returns> private MenuPopupItem[] GetPopupMenuOld(PinnedBufferReader reader, ref UInt32 padding) { List <MenuPopupItem> result = new List <MenuPopupItem>(); while (padding < reader.Length) { WinUser.MENUITEMPOPUP item = reader.BytesToStructure <WinUser.MENUITEMPOPUP>(padding); if (item.IsPopUp) { item.mtID = 0; padding += (UInt32)Marshal.SizeOf(typeof(WinUser.MENUITEM)); } else //Если это попап, то читать надо только 1 WORD. { padding += (UInt32)Marshal.SizeOf(typeof(WinUser.MENUITEMPOPUP)); } MenuPopupItem menu = new MenuPopupItem() { Item = item, }; result.Add(menu); menu.Title = reader.BytesToStringUni(ref padding); if (item.IsPopUp) { menu.SubItems = this.GetPopupMenuOld(reader, ref padding); } if (item.IsFinal) { return(result.ToArray()); } } throw new InvalidOperationException(); }