Функция GetMenuItemInfo

Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" _
     (ByVal hMenu As Long, ByVal uItem As Long, _
      ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long

GetMenuItemInfo получает информацию о пункте меню

hMenu
Описатель меню, содержащий интересующий пункт
uItem
Идентификатор пункта меню для получения информации или его позиция в меню, в зависимости от параметра fByPosition
fByPosition
Если параметр имеет ненулевое значение, то uItem показывает пункт, используя его позицию (отсчет от 0). Если равен 0, то uItem является уникальным идентификаторм пункта меню
lpmii
Структура MENUITEMINFO, получающая информацию о пункте меню. Перед вызовом функции не забывайте инициализировать поля структуры cbSize и fMask. При получения текста пункта меню также необходимо объявить поля dwTypeData и cch

Пример

' Создайте на форме небольшое меню для примера
' При нажатии на кнопку Command1 структура меню формы
' будет выведено в окно отладки
' Пункты, помеченные галочкой будут отмечены символами (X)

' Расположите данный код в модуле
' Данная функция рекурсивно обходит все пункты меню

Public Sub IterateThroughItems(ByVal hMenu As Long, ByVal level As Long)
' hMenu - дескриптор меню
' структуру которого мы пытаемся узнать
Dim itemcount As Long   ' число пунктов в меню
Dim c As Long        ' счетчик цикла
Dim mii As MENUITEMINFO
Dim retval As Long
	
' Узнаем число пунктов в меню
itemcount = GetMenuItemCount(hMenu)
	
' Циклически обходим все пункты,
' получая необходимую информацию о каждом пункте
With mii
   .cbSize = Len(mii)
   .fMask = MIIM_STATE Or MIIM_TYPE Or MIIM_SUBMENU
       For c = 0 To itemcount - 1
         .dwTypeData = Space(256)
         .cch = 256
         retval = GetMenuItemInfo(hMenu, c, 1, mii)
         If mii.fType = MFT_SEPARATOR Then
            Debug.Print "   " & String(3 * level, ".") & "-----"
         Else
' Если пункт помечен, то выводим (X)
          Debug.Print IIf(.fState And MFS_CHECKED, "(X)", "   ");
          Debug.Print String(3 * level, ".") & Left(.dwTypeData, .cch)
' Если пункт содержит подменю, выводим его содержание
          If .hSubMenu <> 0 Then
              IterateThroughItems .hSubMenu, level + 1
          End If
        End If
    Next c
End With
End Sub

' Код для кнопки, выводящий структуру меню

Dim hMenu As Long ' описатель меню Form1
	
' Получим описатель
hMenu = GetMenu(Form1.hWnd)
' Используем функцию для получения информации
IterateThroughItems hMenu, 0

Смотри также

SetMenuItemInfo

Категория

Меню