Exemple #1
0
        /// <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();
        }
Exemple #2
0
        /// <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();
        }