#NoEnv
SetBatchLines, -1
arr := GetAppsInfo("ALL")
for k, v in arr[1]
headers .= (headers = "" ? "" : "|") . v.name
Gui, +Resize
Gui, Margin, 0, 0
Gui, Add, ListView, Grid, % headers
listViewArr := []
for k, v in arr
for i, j in v
listViewArr[k, i] := j.value
for k, v in listViewArr
LV_Add("", v*)
Loop % arr[1].length()
LV_ModifyCol(A_Index, "AutoHdr")
Gui, Show, w1400 h900
Return
GuiSize:
GuiControl, Move, SysListView321, w%A_GuiWidth% h%A_GuiHeight%
Return
GuiClose:
ExitApp
GetAppsInfo(infoType) {
static CLSID_EnumInstalledApps := "{0B124F8F-91F0-11D1-B8B5-006008059382}"
, IID_IEnumInstalledApps := "{1BC752E1-9046-11D1-B8B3-006008059382}"
, InfoNames := [ {name: "DISPLAYNAME" , mask: 0x00000001}
, {name: "VERSION" , mask: 0x00000002}
, {name: "PUBLISHER" , mask: 0x00000004}
, {name: "PRODUCTID" , mask: 0x00000008}
, {name: "REGISTEREDOWNER" , mask: 0x00000010}
, {name: "REGISTEREDCOMPANY", mask: 0x00000020}
, {name: "LANGUAGE" , mask: 0x00000040}
, {name: "SUPPORTURL" , mask: 0x00000080}
, {name: "SUPPORTTELEPHONE" , mask: 0x00000100}
, {name: "HELPLINK" , mask: 0x00000200}
, {name: "INSTALLLOCATION" , mask: 0x00000400}
, {name: "INSTALLSOURCE" , mask: 0x00000800}
, {name: "INSTALLDATE" , mask: 0x00001000}
, {name: "CONTACT" , mask: 0x00004000}
, {name: "COMMENTS" , mask: 0x00008000}
, {name: "IMAGE" , mask: 0x00020000}
, {name: "READMEURL" , mask: 0x00040000}
, {name: "UPDATEINFOURL" , mask: 0x00080000}
, {name: "ALL" , mask: 0x000EDFFF} ]
pEIA := ComObjCreate(CLSID_EnumInstalledApps, IID_IEnumInstalledApps)
arr := []
for k, v in InfoNames
if (v.name = infoType && found := true)
break
if !found
throw Exception("Wrong info type!")
( infoType = "ALL" && InfoNames.Pop() )
while DllCall(NumGet(NumGet(pEIA+0) + A_PtrSize*3), Ptr, pEIA, PtrP, pINA) = 0 {
VarSetCapacity(APPINFODATA, size := 4*2 + A_PtrSize*18, 0)
NumPut(size , APPINFODATA)
NumPut(v.mask, APPINFODATA, 4)
DllCall(NumGet(NumGet(pINA+0) + A_PtrSize*3), Ptr, pINA, Ptr, &APPINFODATA)
ObjRelease(pINA)
if (infoType != "ALL") {
pData := NumGet(APPINFODATA, 8 + A_PtrSize*(k - 1))
arr.Push(pData ? StrGet(pData, "UTF-16") : "")
}
else {
appInfo := []
for i, j in InfoNames {
pData := NumGet(APPINFODATA, 8 + A_PtrSize*(i - 1))
appInfo.Push({name: j.name, value: pData ? StrGet(pData, "UTF-16") : ""})
}
arr.Push(appInfo)
}
}
Return arr
}