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 получает информацию о пункте меню
' Создайте на форме небольшое меню для примера ' При нажатии на кнопку 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