MsgBox, % StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&")
GetMenuItemCheckState(hWin, path)
{
static MIIM_STRING := 0x40, MIIM_STATE := 0x1
Loop, parse, path, |
{
hMenu := A_Index = 1 ? DllCall("GetMenu", Ptr, hWin, Ptr) : DllCall("GetSubMenu", Ptr, hMenu, Int, SubMenuPos)
SubMenuPos := ""
Loop % DllCall("GetMenuItemCount", Ptr, hMenu)
if StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") = A_LoopField && SubMenuPos := A_Index - 1
break
if (SubMenuPos = "") {
MsgBox, % "Не найден пункт меню """ A_LoopField """ по пути """ path """"
Return
}
}
SendMessage, 0x117, hMenu, SubMenuPos,, ahk_id %hWin% ; WM_INITMENUPOPUP
Return GetMenuItemInfo(hMenu, SubMenuPos, MIIM_STATE) & 0x8 ? 1 : 0
}
GetMenuItemInfo(hMenu, ItemNumber, TypeOfInfo)
{
static MIIM_STRING := 0x40, MIIM_STATE := 0x1
VarSetCapacity(MENUITEMINFO, size := 4*4 + A_PtrSize*8, 0)
NumPut(size, MENUITEMINFO)
NumPut(TypeOfInfo, MENUITEMINFO, 4)
DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, ItemNumber, UInt, 1, Ptr, &MENUITEMINFO)
if (TypeOfInfo & MIIM_STRING) {
nChars := NumGet(MENUITEMINFO, 4*4 + A_PtrSize*6, "UInt") + 1
if (nChars > 1) {
VarSetCapacity(buff, nChars * (A_IsUnicode ? 2 : 1), 0)
NumPut(&buff, MENUITEMINFO, 4*4 + A_PtrSize*5)
NumPut(nChars, MENUITEMINFO, 4*4 + A_PtrSize*6)
DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, 1, Ptr, &MENUITEMINFO)
info := StrGet(&buff)
}
}
if (TypeOfInfo & MIIM_STATE)
info := NumGet(MENUITEMINFO, 4*3, "Int")
Return info
}