NumberOfMenuItem := "" ; если оставить пустое значение, выдаст информацию о пунктах последнего подменю оконного меню
; если присвоить номер — выдаст информацию о пунктах подменю с этим номером
MIIM_FTYPE := 0x100, MIIM_STRING := 0x40, oType := {0: "MFT_STRING", 0x800: "MFT_SEPARATOR", 0x4: "MFT_BITMAP"}
F11::
InfoString := ""
if !hMenu := DllCall("GetMenu", Ptr, WinExist("A"), Ptr) {
MsgBox, Окно использует нестандартное меню
Return
}
count := DllCall("GetMenuItemCount", Ptr, hMenu)
if !hMenu := DllCall("GetSubMenu", Ptr, hMenu, Int, NumberOfMenuItem = "" ? count - 1 : NumberOfMenuItem - 1) {
MsgBox, Подменю не найдено
Return
}
count := DllCall("GetMenuItemCount", Ptr, hMenu)
Loop % count {
Gosub, IniMII
NumPut(MIIM_FTYPE, &MENUITEMINFO + 4)
DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, true, Ptr, &MENUITEMINFO)
type := oType[NumGet(&MENUITEMINFO + 8, "UInt")]
InfoString .= (InfoString = "" ? "" : "`n")
if (type != "MFT_STRING")
InfoString .= type
else {
Gosub, IniMII
NumPut(MIIM_STRING, &MENUITEMINFO + 4)
DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, true, Ptr, &MENUITEMINFO)
TextLength := NumGet(&MENUITEMINFO + 4*4 + A_PtrSize*6, "UInt")
VarSetCapacity(TextBuff, TextLength * (A_IsUnicode ? 2 : 1), 0)
NumPut(&TextBuff, &MENUITEMINFO + 4*4 + A_PtrSize*5)
NumPut(++TextLength, &MENUITEMINFO + 4*4 + A_PtrSize*6)
DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, true, Ptr, &MENUITEMINFO)
InfoString .= StrGet(&TextBuff)
}
}
MsgBox, % InfoString
Return
IniMII:
VarSetCapacity(MENUITEMINFO, size := 4*4 + A_PtrSize*8, 0)
NumPut(size, MENUITEMINFO)
Return
Активируйте нужное окно и нажмите F11. Какое сообщение выдаёт?