1

Тема: AHK: Получение значения адресной строки в фаерфоксе через UIA

setbatchlines -1
IUIAutomation := ComObjCreate(CLSID_CUIAutomation := "{ff48dba4-60ef-4201-aa87-54103eef594e}", IID_IUIAutomation := "{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}")

f11::
DllCall(NumGet(NumGet(IUIAutomation+0)+6*A_PtrSize), "ptr", IUIAutomation, "ptr", WinExist("A"), "ptr*", ElementFromHandle)   ; IUIAutomation::ElementFromHandle
AddressBarName := DllCall("oleaut32\SysAllocString", "str", "Search with Google or enter address", "ptr")
VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_BSTR := 8, variant, 0, "ushort")
NumPut(AddressBarName, variant, 8, "ptr")
if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(IUIAutomation+0)+23*A_PtrSize), "ptr", IUIAutomation, "int", UIA_NamePropertyId := 30005, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", condition1)   ; IUIAutomation::CreatePropertyCondition
else
   DllCall(NumGet(NumGet(IUIAutomation+0)+23*A_PtrSize), "ptr", IUIAutomation, "int", UIA_NamePropertyId := 30005, "ptr", &variant, "ptr*", condition1)   ; IUIAutomation::CreatePropertyCondition
DllCall("oleaut32\SysFreeString", "ptr", AddressBarName)
VarSetCapacity(variant, 8+A_PtrSize*2, 0)
NumPut(VT_I4 := 3, variant, 0, "ushort")
NumPut(UIA_EditControlTypeId := 50004, variant, 8, "int")
if (A_PtrSize = 4)
   DllCall(NumGet(NumGet(IUIAutomation+0)+23*A_PtrSize), "ptr", IUIAutomation, "int", UIA_ControlTypePropertyId := 30003, "int64", NumGet(variant, 0, "int64"), "int64", NumGet(variant, 8, "int64"), "ptr*", condition2)   ; IUIAutomation::CreatePropertyCondition
else
   DllCall(NumGet(NumGet(IUIAutomation+0)+23*A_PtrSize), "ptr", IUIAutomation, "int", UIA_ControlTypePropertyId := 30003, "ptr", &variant, "ptr*", condition2)   ; IUIAutomation::CreatePropertyCondition
DllCall(NumGet(NumGet(IUIAutomation+0)+25*A_PtrSize), "ptr", IUIAutomation, "ptr", condition1, "ptr", condition2, "ptr*", conditions)   ; IUIAutomation::CreateAndCondition
DllCall(NumGet(NumGet(ElementFromHandle+0)+5*A_PtrSize), "ptr", ElementFromHandle, "int", TreeScope_Descendants := 0x4, "ptr", conditions, "ptr*", element) ; IUIAutomationElement::FindFirst
VarSetCapacity(variant, 8+A_PtrSize*2, 0)
DllCall(NumGet(NumGet(element+0)+10*A_PtrSize), "ptr", element, "int", UIA_ValueValuePropertyId := 30045, "ptr", &variant)   ; IUIAutomationElement::GetCurrentPropertyValue
ObjRelease(element)
ObjRelease(conditions)
ObjRelease(condition1)
ObjRelease(condition2)
ObjRelease(ElementFromHandle)
msgbox % StrGet(NumGet(variant, 8, "ptr"), "utf-16")
return

Тема для обсуждения