前言:最近我一直在做一个涉及浏览器(特别是Chrome)自动化的项目,限制是不允许使用外部程序(例如Rufaydium)。这让我找到了 UIAutomation 框架,我发现该框架已经存在一些 AHK 库。 AHK1 最受欢迎的似乎是 jethro 的 UIA_Interface ( https://github.com/jethro/UIA_Interface/blob/master/UIA_Interface.ahk),不幸的是目前似乎已被放弃。尽管如此,在克服了一些最初的障碍(例如它不能在 32 位模式下工作)之后,我让它工作起来,并一点一点地添加了一些额外的方法和辅助函数。也许其他人也有兴趣使用或改进它。请不要太讨厌代码,因为我对 dll 调用、变体等非常不熟悉...
该库可在此处使用:https ://github.com/Decolada/UIAutomation
教学中了解有关 UIAutomation 的更多信息来自 Joe the Automator 的视频
它由两个(三个?)主文件组成:
1) UIA_Interface.ahk,它基于 jethro 的项目,包含 UIAutomation 框架的包装函数。此外,它还具有一些帮助函数,可以更轻松地使用 UIA。
2) UIA_Browser.ahk,其中包含 Chrome(也大多是 Edge)自动化的辅助函数(获取 URL、切换选项卡等)。
3) 可选UIA_Constants.ahk,其中包含使用 UIA 的常量。所有常量也可在 UIA_Interface.ahk 中使用,但 UIA_Constants.ahk 中常量的格式可能对某些人来说更受欢迎。请注意,此文件创建了许多全局变量,因此请确保您的脚本在运行时不会更改任何这些变量。图片来源:UIA_Constants 文件主要基于 LarsJ 的 Autoit3 项目。
UIAutomation 的简短介绍:
https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-overview
UIAutomation 是一个 Microsoft 辅助功能框架,允许与用户可访问的元素(单击按钮、发送文本等)进行交互一种程序化的方式。它是Acc/MSAA 框架的后继者。
UIAutomation 框架将整个桌面以及所有窗口和控件保存在 AutomationElement 对象树中。根元素是桌面本身,它的子元素是所有窗口(记事本、Chrome 等),然后窗口又具有子元素(工具栏、主要内容、按钮等)等等。
要与窗口和控件交互,通常我们需要首先获取该窗口/控件的 AutomationElement。这可以使用 UIA_Interface.ahk UIA_Interface 类中的函数来完成,例如使用 ElementFromHandle 从 ahk_id 句柄获取窗口元素,或使用 ElementFromPoint 从点获取窗口元素。我们还可以使用 GetRootElement 获取根元素(桌面)。
找到元素后,查找子元素的一种方法是使用 FindFirst 或 FindAll 函数,它们采用特定条件(例如控件类型需要为“edit”,或者名称必须为“something”)并且返回第一个匹配元素 (FindFirst) 或所有匹配元素 (FindAll)。可以使用 Create...Condition 方法(CreatePropertyCondition、CreateTrueCondition 等)并结合使用 CreateAndCondition、CreateOrCondition 创建条件。最常用的条件方法之一是 CreatePropertyCondition,它采用属性 id(可以在 PropertyIds 下的 UIA_Enum 类下找到,或在 UIA_PropertyIds 下的 UIA_Constants.ahk 文件中找到)和所需的属性值。例如,要创建仅查找按钮元素的条件,首先在UIA_Enum类中查找相应的PropertyId(“按钮”是一个控件类型,因此它将是UIA_ControlTypePropertyId),然后在UIA_ControlTypeIds下查找按钮的值(UIA_ButtonControlTypeId)。
或者,可以使用 TreeWalker 类来遍历树。这可以对任何元素(例如在 ElementFromHandle 或 FindFirst 方法之后)完成,并使用 TreeWalker 类方法(例如 GetFirstChildElement 或 GetNextSiblingElement)。也可以使用条件创建 TreeWalkers,以仅返回按类型、名称等过滤的某些元素。
找到元素后,可以通过属性访问一些基本信息,例如 CurrentName(返回元素的名称)、CurrentControlType(返回类型)这些可以在 UIA_Element 类的 UIA_Interface.ahk 中找到(属性以 [] 结尾)。
可以使用控制模式与元素进行交互。模式包含与元素交互的实际方法,例如 InvokePattern 来调用(单击)按钮,或 ScrollPattern 来滚动控件,ValuePattern 来获取或设置值(例如编辑框)。可以通过调用 GetCurrentPatternAs 方法,然后使用模式中可用的方法来获取模式(例如,在调用 GetCurrentPatternAs("Invoke") 获取 UIA_InvokePattern 对象后,这将是 object.Invoke())。
UIA_Interface.ahk
/* Introduction & credits This library implements Microsoft's UI Automation framework. More information is here: https://docs.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32 Credit for this file mostly goes to jethrow: https://github.com/jethrow/UIA_Interface/blob/master/UIA_Interface.ahk I have added a lot of modifications to it, including custom methods for elements (eg element.Click()), UIA_Enum class etc */ /* Usage UIA needs to be initialized with UIA_Interface() function, which returns a UIA_Interface object: UIA := UIA_Interface() After calling this function, all UIA_Interface class properties and methods can be accessed through it. In addition some extra variables are initialized: CurrentVersion contains the version number of IUIAutomation interface TrueCondition contains a UIA_TrueCondition TreeWalkerTrue contains an UIA_TreeWalker that was created with UIA_TrueCondition Note that a new UIA_Interface object can't be created with the "new" keyword. UIAutomation constants and enumerations are available from the UIA_Enum class (see a more thorough description at the class header). Microsoft documentation for constants and enumerations: UI Automation Constants: https://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-entry-constants UI Automation Enumerations: https://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-entry-enumerations For more information, see the AHK Forums post on UIAutomation: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=104999 */ /* Questions: - if method returns a SafeArray, should we return a Wrapped SafeArray, Raw SafeArray, or AHK Array. Currently we return wrapped AHK arrays for SafeArrays. Although SafeArrays are more convenient to loop over, this causes more confusion in users who are not familiar with SafeArrays (questions such as why are they 0-indexed not 1-indexed, why doesnt for k, v in SafeArray work properly etc). - on UIA Interface conversion methods, how should the data be returned? wrapped/extracted or raw? should raw data be a ByRef param? - do variants need cleared? what about SysAllocString BSTRs? As per Microsoft documentation (https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/allocating-and-releasing-memory-for-a-bstr?view=msvc-170), when we pass a BSTR into IUIAutomation, then IUIAutomation should take care of freeing it. But when we receive a UIA_Variant and use UIA_VariantData, then we should clear the BSTR. - ObjRelease: if IUIA returns an interface then it automatically increases the ref count for the object it inherits from, and when released decreases it. So do all returned objects (UIA_Element, UIA_Pattern, UIA_TextRange) need to be released? Currently we release these objects as well, but jethrow's version didn't. - do RECT structs need destroyed? - if returning wrapped data & raw is ByRef, will the wrapped data being released destroy the raw data? - returning variant data other than vt=3|8|9|13|0x2000 - Cached Members? - UIA Element existance - dependent on window being visible (non minimized), and also sometimes Elements are lazily generated (eg Microsoft Teams, when a meeting is started then the toolbar buttons (eg Mute, react) aren't visible to UIA, but hovering over them with the cursor or calling ElementFromPoint causes Teams to generate and make them visible to UIA. - better way of supporting differing versions of IUIAutomation (version 2, 3, 4) - Get methods vs property getter: currently we use properties when the item stores data, fetching the data is "cheap" and when it doesn't have side-effects, and in computationally expensive cases use Get...(). - should ElementFromHandle etc methods have activateChromiumAccessibility set to True or False? Currently is True, because Chromium apps are very common, and checking whether its on should be relatively fast. */ ; Base class for all UIA objects (UIA_Interface, UIA_Element etc), that is also used to get constants and enumerations from UIA_Enum. class UIA_Base { __New(p:="", flag:=0, version:="") { ObjRawSet(this,"__Type","IUIAutomation" SubStr(this.__Class,5)) ,ObjRawSet(this,"__Value",p) ,ObjRawSet(this,"__Flag",flag) ,ObjRawSet(this,"__Version",version) } __Get(members*) { local global UIA_Enum member := members[1] if member not in base,__UIA,TreeWalkerTrue,TrueCondition ; These should act as normal { if (!InStr(member, "Current")) { baseKey := this While (ObjGetBase(baseKey)) { if baseKey.HasKey("Current" member) return this["Current" member] baseKey := ObjGetBase(baseKey) } } if ObjHasKey(UIA_Enum, member) { return UIA_Enum[member] } else if RegexMatch(member, "i)PatternId|EventId|PropertyId|AttributeId|ControlTypeId|AnnotationType|StyleId|LandmarkTypeId|HeadingLevel|ChangeId|MetadataId", match) { return UIA_Enum["UIA_" match](member) } else if InStr(this.__Class, "UIA_Element") { if (prop := UIA_Enum.UIA_PropertyId(member)) return this.GetCurrentPropertyValue(prop) else if (RegExMatch(member, "i)=|\.|^[+-]?\d+$") || (RegexMatch(member, "^([A-Za-z]+)\d*$", match) && UIA_Enum.UIA_ControlTypeId(match1))) { for _, member in members this := InStr(member, "=") ? this.FindFirstBy(member, 2) : this.FindByPath(member) return this } else if ((SubStr(member, 1, 6) = "Cached") && (prop := UIA_Enum.UIA_PropertyId(SubStr(member, 7)))) return this.GetCachedPropertyValue(prop) else if (member ~= "i)Pattern\d?") { if UIA_Enum.UIA_PatternId(member) return this.GetCurrentPatternAs(member) else if ((SubStr(member, 1, 6) = "Cached") && UIA_Enum.UIA_PatternId(pattern := SubStr(member, 7))) return this.GetCachedPatternAs(pattern) } } throw Exception("Property not supported by the " this.__Class " Class.",-1,member) } } __Set(member, value) { if (member != "base") { if !InStr(member, "Current") try return this["Current" member] := value throw Exception("Assigning values not supported by the " this.__Class " Class.",-1,member) } } __Call(member, params*) { local global UIA_Base, UIA_Enum if member not in base,HasKey { if RegexMatch(member, "i)^(?:UIA_)?(PatternId|EventId|PropertyId|AttributeId|ControlTypeId|AnnotationType|StyleId|LandmarkTypeId|HeadingLevel|ChangeId|MetadataId)$", match) { return UIA_Enum["UIA_" match1](params*) } else if !ObjHasKey(UIA_Base,member)&&!ObjHasKey(this,member)&&!(member = "_NewEnum") { throw Exception("Method Call not supported by the " this.__Class " Class.",-1,member) } } } __Delete() { this.__Flag ? ((this.__Flag == 2) ? DllCall("GlobalFree", "Ptr", this.__Value) : ObjRelease(this.__Value)): } __Vt(n) { return NumGet(NumGet(this.__Value+0,"ptr")+n*A_PtrSize,"ptr") } } /* Exposes methods that enable to discover, access, and filter UI Automation elements. UI Automation exposes every element of the UI Automation as an object represented by the IUIAutomation interface. The members of this interface are not specific to a particular element. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomation */ class UIA_Interface extends UIA_Base { static __IID := "{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}" ; ---------- UIA_Interface properties ---------- ControlViewWalker[] { get { local out return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))?new UIA_TreeWalker(out): } } ContentViewWalker[] { get { local out return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?new UIA_TreeWalker(out): } } RawViewWalker[] { get { local out return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?new UIA_TreeWalker(out): } } RawViewCondition[] { get { local out return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "ptr*",out:=""))?new UIA_Condition(out): } } ControlViewCondition[] { get { local out return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value, "ptr*",out:=""))?new UIA_Condition(out): } } ContentViewCondition[] { get { local out return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value, "ptr*",out:=""))?new UIA_Condition(out): } } ProxyFactoryMapping[] { get { local out return UIA_Hr(DllCall(this.__Vt(48), "ptr",this.__Value, "ptr*",out:=""))?new UIA_ProxyFactoryMapping(out): } } ReservedNotSupportedValue[] { get { local return UIA_Hr(DllCall(this.__Vt(54), "ptr",this.__Value, "ptr*",out:=""))?out: } } ReservedMixedAttributeValue[] { get { local return UIA_Hr(DllCall(this.__Vt(55), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_Interface methods ---------- ; Compares two UI Automation elements to determine whether they represent the same underlying UI element. CompareElements(e1,e2) { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",e1.__Value, "ptr",e2.__Value, "int*",out:=""))? out: } ; Compares two integer arrays containing run-time identifiers (IDs) to determine whether their content is the same and they belong to the same UI element. r1 and r2 need to be RuntimeId arrays (returned by GetRuntimeId()), where array.base.__Value contains the corresponding safearray. CompareRuntimeIds(r1,r2) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",ComObjValue(r1.__Value), "ptr",ComObjValue(r2.__Value), "int*",out:=""))? out: } ; Retrieves the UI Automation element that represents the desktop. GetRootElement() { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves a UI Automation element for the specified window. Additionally activateChromiumAccessibility flag can be set to True to send the WM_GETOBJECT message to Chromium-based apps to activate accessibility if it isn't activated. ElementFromHandle(hwnd:="A", ByRef activateChromiumAccessibility:=True) { local if hwnd is not integer hwnd := WinExist(hwnd) if !hwnd return if (activateChromiumAccessibility != 0) activateChromiumAccessibility := this.ActivateChromiumAccessibility(hwnd) return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr",hwnd, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the UI Automation element at the specified point on the desktop. Additionally activateChromiumAccessibility flag can be set to True to send the WM_GETOBJECT message to Chromium-based apps to activate accessibility if it isn't activated. If Chromium needs to be activated, then activateChromiumAccessibility is set to that windows element. ElementFromPoint(x:="", y:="", ByRef activateChromiumAccessibility:=True) { local if (x==""||y=="") { VarSetCapacity(pt, 8, 0), NumPut(8, pt, "Int"), DllCall("user32.dll\GetCursorPos","UInt",&pt), x := NumGet(pt,0,"Int"), y := NumGet(pt,4,"Int") } if ((activateChromiumAccessibility!=0) && (hwnd := DllCall("GetAncestor", "UInt", DllCall("user32.dll\WindowFromPoint", "int64", y << 32 | x), "UInt", GA_ROOT := 2))) { ; hwnd from point by SKAN activateChromiumAccessibility := this.ActivateChromiumAccessibility(hwnd) } return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "UInt64",x==""||y==""?pt:x&0xFFFFFFFF|(y&0xFFFFFFFF)<<32, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the UI Automation element that has the input focus. If activateChromiumAccessibility is set to True, and Chromium needs to be activated, then activateChromiumAccessibility is set to that windows element. GetFocusedElement(ByRef activateChromiumAccessibility:=True) { local if (activateChromiumAccessibility!=0) activateChromiumAccessibility := this.ActivateChromiumAccessibility() return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the UI Automation element that represents the desktop, prefetches the requested properties and control patterns, and stores the prefetched items in the cache. GetRootElementBuildCache(cacheRequest) { ; UNTESTED. local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr", cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves a UI Automation element for the specified window, prefetches the requested properties and control patterns, and stores the prefetched items in the cache. ElementFromHandleBuildCache(hwnd:="A", cacheRequest:=0, ByRef activateChromiumAccessibility:=True) { local if hwnd is not integer hwnd := WinExist(hwnd) if !hwnd return if (activateChromiumAccessibility != 0) activateChromiumAccessibility := this.ActivateChromiumAccessibility(hwnd, cacheRequest) return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr",hwnd, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the UI Automation element at the specified point on the desktop, prefetches the requested properties and control patterns, and stores the prefetched items in the cache. ElementFromPointBuildCache(x:="", y="", cacheRequest:=0, ByRef activateChromiumAccessibility:=True) { local if (x==""||y=="") VarSetCapacity(pt, 8, 0), NumPut(8, pt, "Int"), DllCall("user32.dll\GetCursorPos","UInt",&pt), x := NumGet(pt,0,"Int"), y := NumGet(pt,4,"Int") if (activateChromiumAccessibility!=0) activateChromiumAccessibility := this.ActivateChromiumAccessibility(hwnd, cacheRequest) return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "UInt64",x==""||y==""?pt:x&0xFFFFFFFF|(y&0xFFFFFFFF)<<32, "ptr", cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the UI Automation element that has the input focus, prefetches the requested properties and control patterns, and stores the prefetched items in the cache. GetFocusedElementBuildCache(cacheRequest, ByRef activateChromiumAccessibility:=True) { ; UNTESTED. local if (activateChromiumAccessibility!=0) activateChromiumAccessibility := this.ActivateChromiumAccessibility(,cacheRequest) return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr", cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves a UIA_TreeWalker object that can be used to traverse the Microsoft UI Automation tree. CreateTreeWalker(condition) { local out return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr",(IsObject(condition)?condition:this.CreateCondition(condition)).__Value, "ptr*",out:=""))? new UIA_TreeWalker(out): } CreateCacheRequest() { local out return UIA_Hr(DllCall(this.__Vt(20), "ptr",this.__Value, "ptr*",out:=""))? new UIA_CacheRequest(out): } ; Creates a condition that is always true. CreateTrueCondition() { local out return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value, "ptr*",out:=""))? new UIA_BoolCondition(out): } ; Creates a condition that is always false. CreateFalseCondition() { local out return UIA_Hr(DllCall(this.__Vt(22), "ptr",this.__Value, "ptr*",out:=""))? new UIA_BoolCondition(out): } ; Creates a condition that selects elements that have a property with the specified value. ; If type is specified then a new variant is created with the specified variant type, otherwise the type is fetched from UIA_PropertyVariantType enums (so usually this can be left unchanged). CreatePropertyCondition(propertyId, value, type:=0xC) { local global UIA_Enum, UIA_PropertyCondition if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) if ((maybeVar := UIA_Enum.UIA_PropertyVariantType(propertyId)) && (type = 0xC)) type := maybeVar var := UIA_ComVar(type, value) return UIA_Hr((A_PtrSize == 4) ? DllCall(this.__Vt(23), "ptr",this.__Value, "int",propertyId, "int64", NumGet(var.ptr+0, 0, "int64"), "int64", NumGet(var.ptr+0, 8, "int64"), "ptr*",out:="") : DllCall(this.__Vt(23), "ptr",this.__Value, "int",propertyId, "ptr",var.ptr, "ptr*",out:=""))? new UIA_PropertyCondition(out, 1): } ; Creates a condition that selects elements that have a property with the specified value (value), using optional flags. If type is specified then a new variant is created with the specified variant type, otherwise the type is fetched from UIA_PropertyVariantType enums (so usually this can be left unchanged). flags can be one of PropertyConditionFlags, default is PropertyConditionFlags_IgnoreCase = 0x1. CreatePropertyConditionEx(propertyId, value, type:=0xC, flags:=0x1) { local global UIA_Enum, UIA_PropertyCondition if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) if ((maybeVar := UIA_Enum.UIA_PropertyVariantType(propertyId)) && (type = 0xC)) type := maybeVar var := UIA_ComVar(type, value) if (type != 8) flags := 0 return UIA_Hr((A_PtrSize == 4) ? DllCall(this.__Vt(24), "ptr",this.__Value, "int",propertyId, "int64", NumGet(var.ptr+0, 0, "int64"), "int64", NumGet(var.ptr+0, 8, "int64"), "uint",flags, "ptr*",out:="") : DllCall(this.__Vt(24), "ptr",this.__Value, "int",propertyId, "ptr", var.ptr, "uint",flags, "ptr*",out:=""))? new UIA_PropertyCondition(out, 1): } ; Creates a condition that selects elements that match both of two conditions. CreateAndCondition(c1,c2) { local out return UIA_Hr(DllCall(this.__Vt(25), "ptr",this.__Value, "ptr",c1.__Value, "ptr",c2.__Value, "ptr*",out:=""))? new UIA_AndCondition(out, 1): } ; Creates a condition that selects elements based on multiple conditions, all of which must be true. CreateAndConditionFromArray(array) { local global UIA_AndCondition ;->in: AHK Array or Wrapped SafeArray if ComObjValue(array)&0x2000 SafeArray:=array else { SafeArray:=ComObj(0x2003,DllCall("oleaut32\SafeArrayCreateVector", "uint",13, "uint",0, "uint",array.MaxIndex()),1) for i,c in array SafeArray[A_Index-1]:=c.__Value, ObjAddRef(c.__Value) ; AddRef - SafeArrayDestroy will release UIA_Conditions - they also release themselves } return UIA_Hr(DllCall(this.__Vt(26), "ptr",this.__Value, "ptr",ComObjValue(SafeArray), "ptr*",out:=""))? new UIA_AndCondition(out, 1): } ; Creates a condition that selects elements from a native array, based on multiple conditions that must all be true CreateAndConditionFromNativeArray(conditions, conditionCount) { ; UNTESTED. /* [in] IUIAutomationCondition **conditions, [in] int conditionCount, [out, retval] IUIAutomationCondition **newCondition */ local out return UIA_Hr(DllCall(this.__Vt(27), "ptr",this.__Value, "ptr", conditions, "int", conditionCount, "ptr*",out:=""))? new UIA_AndCondition(out, 1): } ; Creates a combination of two conditions where a match exists if either of the conditions is true. CreateOrCondition(c1,c2) { local out return UIA_Hr(DllCall(this.__Vt(28), "ptr",this.__Value, "ptr",c1.__Value, "ptr",c2.__Value, "ptr*",out:=""))? new UIA_OrCondition(out, 1): } ; Creates a combination of two or more conditions where a match exists if any of the conditions is true. CreateOrConditionFromArray(array) { local SafeArray, i, c, out ;->in: AHK Array or Wrapped SafeArray if ComObjValue(array)&0x2000 SafeArray:=array else { SafeArray:=ComObj(0x2003,DllCall("oleaut32\SafeArrayCreateVector", "uint",13, "uint",0, "uint",array.MaxIndex()),1) for i,c in array SafeArray[A_Index-1]:=c.__Value, ObjAddRef(c.__Value) ; AddRef - SafeArrayDestroy will release UIA_Conditions - they also release themselves } return UIA_Hr(DllCall(this.__Vt(29), "ptr",this.__Value, "ptr",ComObjValue(SafeArray), "ptr*",out:=""))? new UIA_OrCondition(out, 1): } CreateOrConditionFromNativeArray(p*) { ; Not Implemented local out return UIA_Hr(DllCall(this.__Vt(30), "ptr",this.__Value, "ptr",conditions, "int", conditionCount, "ptr*",out:=""))? new UIA_OrCondition(out, 1): /* [in] IUIAutomationCondition **conditions, [in] int conditionCount, [out, retval] IUIAutomationCondition **newCondition */ } ; Creates a condition that is the negative of a specified condition. CreateNotCondition(c) { local out return UIA_Hr(DllCall(this.__Vt(31), "ptr",this.__Value, "ptr",c.__Value, "ptr*",out:=""))? new UIA_NotCondition(out, 1): } ; Registers a method that handles Microsoft UI Automation events. eventId must be an EventId enum. scope must be a TreeScope enum. cacheRequest can be specified is caching is used. handler is an event handler object, which can be created with UIA_CreateEventHandler function. AddAutomationEventHandler(eventId, element, scope=0x4, cacheRequest=0, handler="") { return UIA_Hr(DllCall(this.__Vt(32), "ptr",this.__Value, "int", eventId, "ptr", element.__Value, "uint", scope, "ptr",cacheRequest.__Value,"ptr",handler.__Value)) } ; Removes the specified UI Automation event handler. RemoveAutomationEventHandler(eventId, element, handler) { return UIA_Hr(DllCall(this.__Vt(33), "ptr",this.__Value, "int", eventId, "ptr", element.__Value, "ptr",handler.__Value)) } ;~ AddPropertyChangedEventHandlerNativeArray 34 ; Registers a method that handles an array of property-changed events AddPropertyChangedEventHandler(element,scope:=0x1,cacheRequest:=0,handler:="",propertyArray:="") { local if !IsObject(propertyArray) propertyArray := [propertyArray] SafeArray:=ComObjArray(0x3,propertyArray.MaxIndex()) for i,propertyId in propertyArray SafeArray[i-1]:=propertyId return UIA_Hr(DllCall(this.__Vt(35), "ptr",this.__Value, "ptr",element.__Value, "int",scope, "ptr",cacheRequest.__Value,"ptr",handler.__Value,"ptr",ComObjValue(SafeArray))) } RemovePropertyChangedEventHandler(element, handler) { return UIA_Hr(DllCall(this.__Vt(36), "ptr",this.__Value, "ptr",element.__Value, "ptr", handler.__Value)) } AddStructureChangedEventHandler(element, scope:=0x4, cacheRequest:=0, handler:=0) { return UIA_Hr(DllCall(this.__Vt(37), "ptr",this.__Value, "ptr",element.__Value, "int", scope, "ptr", cacheRequest.__Value, "ptr",handler.__Value)) } RemoveStructureChangedEventHandler(element, handler) { ; UNTESTED return UIA_Hr(DllCall(this.__Vt(38), "ptr",this.__Value, "ptr", element.__Value, "ptr",handler.__Value)) } ; Registers a method that handles ChangedEvent events. handler is required, cacheRequest can be left to 0 AddFocusChangedEventHandler(handler, cacheRequest:=0) { return UIA_Hr(DllCall(this.__Vt(39), "ptr",this.__Value, "ptr",cacheRequest.__Value, "ptr",handler.__Value)) } RemoveFocusChangedEventHandler(handler) { return UIA_Hr(DllCall(this.__Vt(40), "ptr",this.__Value, "ptr",handler.__Value)) } RemoveAllEventHandlers() { return UIA_Hr(DllCall(this.__Vt(41), "ptr",this.__Value)) } IntNativeArrayToSafeArray(ByRef nArr, n:="") { local out return UIA_Hr(DllCall(this.__Vt(42), "ptr",this.__Value, "ptr",&nArr, "int",n?n:VarSetCapacity(nArr)/4, "ptr*",out:=""))? ComObj(0x2003,out,1): } IntSafeArrayToNativeArray(sArr, Byref nArr, Byref arrayCount) { ; NOT WORKING local VarSetCapacity(nArr,(sArr.MaxIndex()+1)*A_PtrSize) return UIA_Hr(DllCall(this.__Vt(43), "ptr",this.__Value, "ptr",ComObjValue(sArr), "ptr*",nArr:="", "int*",arrayCount:=""))? nArr: } RectToVariant(ByRef rect, ByRef out="") { ; in:{left,top,right,bottom} ; out:(left,top,width,height) ; in: RECT Struct ; out: AHK Wrapped SafeArray & ByRef Variant return UIA_Hr(DllCall(this.__Vt(44), "ptr",this.__Value, "ptr",&rect, "ptr",UIA_Variant(out)))? UIA_VariantData(out):UIA_VariantClear(out) } VariantToRect(ByRef var, ByRef rect="") { ; NOT WORKING ; in: VT_VARIANT (SafeArray) ; out: AHK Wrapped RECT Struct & ByRef Struct VarSetCapacity(rect,16) return UIA_Hr(DllCall(this.__Vt(45), "ptr",this.__Value, "ptr",var, "ptr*",rect:=""))? UIA_RectToObject(rect): } ;~ SafeArrayToRectNativeArray 46 ;~ CreateProxyFactoryEntry 47 ; Retrieves the registered programmatic name of a property. Intended for debugging and diagnostic purposes only. The string is not localized. GetPropertyProgrammaticName(Id) { local return UIA_Hr(DllCall(this.__Vt(49), "ptr",this.__Value, "int",Id, "ptr*",out:=""))? UIA_GetBSTRValue(out): } ; Retrieves the registered programmatic name of a control pattern. Intended for debugging and diagnostic purposes only. The string is not localized. GetPatternProgrammaticName(Id) { local return UIA_Hr(DllCall(this.__Vt(50), "ptr",this.__Value, "int",Id, "ptr*",out:=""))? UIA_GetBSTRValue(out): } ; Returns an object where keys are the names and values are the Ids PollForPotentialSupportedPatterns(e, Byref Ids:="", Byref Names:="") { return UIA_Hr(DllCall(this.__Vt(51), "ptr",this.__Value, "ptr",e.__Value, "ptr*",Ids:="", "ptr*",Names:=""))? UIA_SafeArraysToObject(Names:=ComObj(0x2008,Names,1),Ids:=ComObj(0x2003,Ids,1)): ; These SafeArrays are wrapped by ComObj, so they will automatically be released } PollForPotentialSupportedProperties(e, Byref Ids:="", Byref Names:="") { return UIA_Hr(DllCall(this.__Vt(52), "ptr",this.__Value, "ptr",e.__Value, "ptr*",Ids:="", "ptr*",Names:=""))? UIA_SafeArraysToObject(Names:=ComObj(0x2008,Names,1),Ids:=ComObj(0x2003,Ids,1)): } CheckNotSupported(value) { ; Useless in this Framework??? /* Checks a provided VARIANT to see if it contains the Not Supported identifier. After retrieving a property for a UI Automation element, call this method to determine whether the element supports the retrieved property. CheckNotSupported is typically called after calling a property retrieving method such as GetCurrentPropertyValue. */ local return UIA_Hr(DllCall(this.__Vt(53), "ptr",this.__Value, "ptr",value, "int*",out:=""))? out: } ;~ ReservedNotSupportedValue 54 ;~ ReservedMixedAttributeValue 55 /* This only works if the program implements IAccessible (Acc/MSAA) natively (option 1 in the following explanation). There are two types of Acc objects: 1) Where the program implements Acc natively. In this case, Acc will be the actual IAccessible object for the implementation. 2) The program doesn't implement Acc, but Acc instead creates a proxy object which sends messages to the window and maps Win32 controls to a specific IAccessible method. This would be for most Win32 programs, where for example accName would actually do something similar to ControlGetText and return that value. If ElementFromIAccessible is used with this kind of proxy object, E_INVALIDARG - "One or more arguments are not valid" error is returned. */ ElementFromIAccessible(IAcc, childId:=0) { /* The method returns E_INVALIDARG - "One or more arguments are not valid" - if the underlying implementation of the Microsoft UI Automation element is not a native Microsoft Active Accessibility server; that is, if a client attempts to retrieve the IAccessible interface for an element originally supported by a proxy object from Oleacc.dll, or by the UIA-to-MSAA Bridge. */ local return UIA_Hr(DllCall(this.__Vt(56), "ptr",this.__Value, "ptr",IsObject(IAcc) ? ComObjValue(IAcc) : IAcc, "int",childId, "ptr*",out:=""))? UIA_Element(out): } ElementFromIAccessibleBuildCache(IAcc, childId:=0, cacheRequest:=0) { local return UIA_Hr(DllCall(this.__Vt(57), "ptr",this.__Value, "ptr",IsObject(IAcc) ? ComObjValue(IAcc) : IAcc, "int",childId, "ptr", cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; ------- ONLY CUSTOM FUNCTIONS FROM HERE ON ---------------- /* CreateCondition can create a condition from an expression, or a PropertyId and property value pair. 1) If creating a single condition from a PropertyId and value pair: propertyOrExpr: Property can be the PropertyId, or (partial) name (eg 30000 == "ControlType" == "ControlTypePropertyId"). valueOrFlags: the value corresponding to the PropertyId flags: 0=no flags; 1=ignore case (case insensitive matching); 2=match substring; 3=ignore case and match substring Example: CreateCondition("Name", "Username", 1) would create a condition with NameProperty and value of "Username", with case sensitivity turned off. 2) If creating a condition from an expression, propertyOrExpr takes the expression and valueOrFlags the default flags, and flags argument is ignored. Similarly to FindFirstBy, the expression takes a value in the form of "PropertyId=propertyValue" to create a property condition for PropertyId with the value propertyValue. PropertyId can be most properties from UIA_Enum.UIA_PropertyId method (for example Name, ControlType, AutomationId etc). If propertyValue contains any parentheses, then the value needs to be surrounded by single quotes. Escape ' with \, escape \ with \. "Name=Username:" would create a property condition with UIA_Enum.UIA_NamePropertyId and the value "Username:" "Name='MyTest\''" creates a NameProperty condition for value "MyTest'" Criteria can be combined with AND, OR, &&, || (not case sensitive): "Name=Username: AND ControlType=Button" would create a condition with the name property of "Username:" and control type of button. Parentheses are supported. Negation can be specified with NOT or !: "NOT ControlType=Edit" would create a condition that selects everything but ControlType Edit Different flags can be specified for each condition by specifying "FLAGS=n" after the condition value. "Name=Username: FLAGS=1" would create a case-insensitive condition only for that condition. By default the flags argument is used. Flags: 0=no flags; 1=ignore case (case insensitive); 2=match substring; 3=ignore case and match substring */ CreateCondition(propertyOrExpr, valueOrFlags:="", flags:=0) { local global UIA_Enum if InStr(propertyOrExpr, "=") { ; Expression match := "", match3 := "", match5 := "", currentCondition := "", fullCondition := "", operator := "", valueOrFlags := ((!valueOrFlags) ? 0 : valueOrFlags), counter := 1, conditions := [], currentExpr := "(" propertyOrExpr ")" ; First create all single conditions (not applying AND, OR, NOT) while RegexMatch(currentExpr, "i) *(NOT|!)? *(\w+?(?<!UIA_CONDITION)) *=(?: *(\d+|'.*?(?<=[^\\]|[^\\]\\\\)')|([^()]*?)) *(?: FLAGS=(\d))? *?( AND | OR |&&|\|\||[()]|$) *", match) { /* matchRegex: group1 : NOT group2 : propertyId group3 : propertyValue group4 : propertyValueOld group5 : "FLAGS" value group6 : next and/or operator Escape ' with \ : 'Test\'' -> Test' Escape \ with \ : 'Test\\\'' -> Test\' */ if !match break match3 := (match3 == "") ? match4 : match3 currentFlags := (match5 == "") ? valueOrFlags : match5 if ((SubStr(match3,1,1) == "'") && (SubStr(match3,0,1) == "'")) match3 := StrReplace(RegexReplace(SubStr(match3,2,StrLen(match3)-2), "(?<=[^\\]|[^\\]\\\\)\\'", "'"), "\\", "\") conditions[counter] := this.CreateCondition(match2, match3, currentFlags) if (match1 == "NOT") match1 := "!" currentExpr := StrReplace(currentExpr, match, " " match1 "UIA_CONDITION=" counter (match6 ? ((match6 == ")") ? ") " : match6) : "")) counter++ } currentExpr := StrReplace(StrReplace(StrReplace(currentExpr, " OR ", "||"), " AND ", "&&"), "NOT", "!") ; Create NNF: Move NOT conditions to inside parenthesis, remove double NOTs While RegexMatch(currentExpr, "! *(\((?:[^)(]+|(?1))*+\))", match) { match1 := SubStr(match1, 2, StrLen(match1)-2) currentExpr := StrReplace(currentExpr, match, "(" RegexReplace(match1, "([^)(]+?|\((?:[^)(]+|(?1))*+\)) *(\|\||&&|\)|$) *", "!$1$2$3") ")") currentExpr := StrReplace(currentExpr, "!!", "") } ; Create all NOT conditions pos:=1, match:="" While (pos := RegexMatch(currentExpr, "! *UIA_CONDITION=(\d+)", match, pos+StrLen(match))) { conditions[match1] := this.CreateNotCondition(conditions[match1]) currentExpr := StrReplace(currentExpr, match, "UIA_CONDITION=" match1) pos -= 1 } ; Create AND/OR conditions currentExpr := StrReplace(currentExpr, " ", ""), parenthesisMatch:="" While RegexMatch(currentExpr, "\(([^()]+)\)", parenthesisMatch) { ; Match parenthesis that doesn't have parentheses inside pos := 1, match:="", match1:="", fullCondition:="", operator:="" while (pos := RegexMatch(parenthesisMatch1, "UIA_CONDITION=(\d+)(&&|\|\||$)", match, pos+StrLen(match))) { fullCondition := (operator == "&&") ? this.CreateAndCondition(fullCondition, conditions[match1]) : (operator == "||") ? this.CreateOrCondition(fullCondition, conditions[match1]) : conditions[match1] operator := match2 } conditions[counter] := fullCondition currentExpr := StrReplace(currentExpr, parenthesisMatch, "UIA_CONDITION=" counter) counter++ } return conditions[counter-1] } else { if RegexMatch(propertyOrExpr, "^\d+$") propCond := propertyOrExpr else { if (propertyOrExpr = "Type") propertyOrExpr := "ControlType" RegexMatch(propertyOrExpr, "i)(?:UIA_)?\K.+?(?=(Id)?PropertyId|$)", propertyOrExpr), propCond := UIA_Enum.UIA_PropertyId(propertyOrExpr), propertyOrExpr := StrReplace(StrReplace(propertyOrExpr, "AnnotationAnnotation", "Annotation"), "StylesStyle", "Style") } if valueOrFlags is not integer { valueOrFlags := IsFunc("UIA_Enum.UIA_" propertyOrExpr "Id") ? UIA_Enum["UIA_" propertyOrExpr "Id"](valueOrFlags) : IsFunc("UIA_Enum.UIA_" propertyOrExpr) ? UIA_Enum["UIA_" propertyOrExpr](valueOrFlags) : valueOrFlags } if propCond return this.CreatePropertyConditionEx(propCond, valueOrFlags,, flags) } } ; Gets ElementFromPoint and filters out the smallest subelement that is under the specified point. If windowEl (window under the point) is provided, then a deep search is performed for the smallest element (this might be very slow in large trees). SmallestElementFromPoint(x:="", y:="", ByRef activateChromiumAccessibility:=True, windowEl:="") { local if (x==""||y=="") { VarSetCapacity(pt, 8, 0), NumPut(8, pt, "Int"), DllCall("user32.dll\GetCursorPos","UInt",&pt), x := NumGet(pt,0,"Int"), y := NumGet(pt,4,"Int") } if IsObject(windowEl) { element := this.ElementFromPoint(x, y, activateChromiumAccessibility) bound := element.CurrentBoundingRectangle, elementSize := (bound.r-bound.l)*(bound.b-bound.t), prevElementSize := 0, stack := [windowEl, element], x := x==""?0:x, y := y==""?0:y Loop { bound := stack[1].CurrentBoundingRectangle if ((x >= bound.l) && (x <= bound.r) && (y >= bound.t) && (y <= bound.b)) { ; If parent is not in bounds, then children arent either if ((newSize := (bound.r-bound.l)*(bound.b-bound.t)) < elementSize) element := stack[1], elementSize := newSize for _, childEl in stack[1].GetChildren() { bound := childEl.CurrentBoundingRectangle if ((x >= bound.l) && (x <= bound.r) && (y >= bound.t) && (y <= bound.b)) { ; Select only children that are under the mouse stack.Push(childEl) if ((newSize := (bound.r-bound.l)*(bound.b-bound.t)) < elementSize) elementSize := newSize, element := childEl } } } stack.RemoveAt(1) } Until !stack.MaxIndex() return element } else { element := this.ElementFromPoint(x, y, activateChromiumAccessibility) bound := element.CurrentBoundingRectangle, elementSize := (bound.r-bound.l)*(bound.b-bound.t), prevElementSize := 0 for k, v in element.FindAll(this.__UIA.TrueCondition) { bound := v.CurrentBoundingRectangle if ((x >= bound.l) && (x <= bound.r) && (y >= bound.t) && (y <= bound.b) && ((newSize := (bound.r-bound.l)*(bound.b-bound.t)) < elementSize)) element := v, elementSize := newSize } return element } } ; This can be used when a Chromium apps content isn't accessible by normal methods (ElementFromHandle, GetRootElement etc). fromFocused=True uses the focused element as a reference point, fromFocused=False uses ElementFromPoint GetChromiumContentElement(winTitle:="A", ByRef fromFocused:=True) { local WinActivate, %winTitle% WinWaitActive, %winTitle%,,1 WinGetPos, X, Y, W, H, %winTitle% if fromFocused fromFocused := this.GetFocusedElement() else fromFocused := this.ElementFromPoint(x+w//2, y+h//2) ; Use ElementFromPoint on the center of the window (the actual coordinate doesn't really matter, it just needs to be inside the window) chromiumTW := this.CreateTreeWalker(this.CreateCondition("ControlType","Document")) ; Create a TreeWalker to find the Document element (the content) try focusedEl := chromiumTW.NormalizeElement(fromFocused) ; Get the first parent that is a Window element return focusedEl } ; Tries to get the Chromium content from Chrome_RenderWidgetHostHWND1 control ElementFromChromium(winTitle:="A", activateChromiumAccessibility:=True, timeOut:=500) { local try ControlGet, cHwnd, Hwnd,, Chrome_RenderWidgetHostHWND1, %winTitle% if !cHwnd return cEl := this.ElementFromHandle(cHwnd,False) if (activateChromiumAccessibility != 0) { SendMessage, WM_GETOBJECT := 0x003D, 0, 1, , ahk_id %cHwnd% if cEl { cEl.CurrentName ; it doesn't work without calling CurrentName (at least in Skype) if (cEl.CurrentControlType == 50030) { startTime := A_TickCount while (!cEl.CurrentValue && (A_TickCount-startTime < timeOut)) Sleep, 20 } } } return cEl } ; In some setups Chromium-based renderers don't react to UIA calls by enabling accessibility, so we need to send the WM_GETOBJECT message to the renderer control to enable accessibility. Thanks to users malcev and rommmcek for this tip. Explanation why this works: https://www.chromium.org/developers/design-documents/accessibility/#TOC-How-Chrome-detects-the-presence-of-Assistive-Technology ActivateChromiumAccessibility(hwnd:="A", cacheRequest:=0, timeOut:=500) { static activatedHwnds := {} if hwnd is not integer hwnd := WinExist(hwnd) if activatedHwnds[hwnd] return activatedHwnds[hwnd] := 1 ; Shouldn't store the element here, otherwise it can't be released until the program exits return this.ElementFromChromium("ahk_id " hwnd,, timeOut) } } class UIA_Interface2 extends UIA_Interface { static __IID := "{34723aff-0c9d-49d0-9896-7ab52df8cd8a}" ; ---------- UIA_Interface2 properties ---------- ; Specifies whether calls to UI Automation control pattern methods automatically set focus to the target element. Default is True. AutoSetFocus[] { get { local return UIA_Hr(DllCall(this.__Vt(58), "ptr",this.__Value, "ptr*", out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(59), "ptr",this.__Value, "int", value)) } } ; Specifies the length of time that UI Automation will wait for a provider to respond to a client request for an automation element. Default is 20000ms (20 seconds), minimum seems to be 50ms. ConnectionTimeout[] { get { local return UIA_Hr(DllCall(this.__Vt(60), "ptr",this.__Value, "ptr*", out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(61), "ptr",this.__Value, "int", value)) ; Minimum seems to be 50 (ms?) } } ; Specifies the length of time that UI Automation will wait for a provider to respond to a client request for information about an automation element. Default is 2000ms (2 seconds), minimum seems to be 50ms. TransactionTimeout[] { get { local return UIA_Hr(DllCall(this.__Vt(62), "ptr",this.__Value, "ptr*", out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(63), "ptr",this.__Value, "int", value)) } } } class UIA_Interface3 extends UIA_Interface2 { ; UNTESTED static __IID := "{73d768da-9b51-4b89-936e-c209290973e7}" AddTextEditTextChangedEventHandler(element, scope, textEditChangeType, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(64), "ptr",this.__Value, "ptr", element.__Value, "int", scope, "int", textEditChangeType, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } RemoveTextEditTextChangedEventHandler(element, handler) { return UIA_Hr(DllCall(this.__Vt(65), "ptr",this.__Value, "ptr", element.__Value, "ptr", handler.__Value)) } } class UIA_Interface4 extends UIA_Interface3 { ; UNTESTED static __IID := "{1189c02a-05f8-4319-8e21-e817e3db2860}" AddChangesEventHandler(element, scope, changeTypes, changesCount, cacheRequest:=0, handler:="") { ; NOT WORKING. changeTypes should be an array? return UIA_Hr(DllCall(this.__Vt(66), "ptr",this.__Value, "ptr", element.__Value, "int", scope, "int", changeTypes, "int", changesCount, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } RemoveChangesEventHandler(element, handler) { return UIA_Hr(DllCall(this.__Vt(67), "ptr",this.__Value, "ptr", element.__Value, "ptr", handler.__Value)) } } class UIA_Interface5 extends UIA_Interface4 { ; UNTESTED static __IID := "{25f700c8-d816-4057-a9dc-3cbdee77e256}" AddNotificationEventHandler(element, scope:=0x4, cacheRequest:=0, handler:=0) { return UIA_Hr(DllCall(this.__Vt(68), "ptr",this.__Value, "ptr", element.__Value, "uint", scope, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } RemoveNotificationEventHandler(element, handler) { return UIA_Hr(DllCall(this.__Vt(69), "ptr",this.__Value, "ptr", element.__Value, "ptr", handler.__Value)) } } class UIA_Interface6 extends UIA_Interface5 { ; UNTESTED static __IID := "{aae072da-29e3-413d-87a7-192dbf81ed10}" ; ---------- UIA_Interface6 properties ---------- ; Indicates whether an accessible technology client adjusts provider request timeouts when the provider is non-responsive. ConnectionRecoveryBehavior[] { get { local return UIA_Hr(DllCall(this.__Vt(73), "ptr",this.__Value, "ptr*", out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(74), "ptr",this.__Value, "int", value)) } } ; Gets or sets whether an accessible technology client receives all events, or a subset where duplicate events are detected and filtered. CoalesceEvents[] { get { local return UIA_Hr(DllCall(this.__Vt(75), "ptr",this.__Value, "ptr*", out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(76), "ptr",this.__Value, "int", value)) } } ; ---------- UIA_Interface6 methods ---------- ; Registers one or more event listeners in a single method call. CreateEventHandlerGroup() { local out return UIA_Hr(DllCall(this.__Vt(70), "ptr",this.__Value, "ptr*", out:="")) ? new UIA_AutomationEventHandlerGroup(out): } ; Registers a collection of event handler methods specified with the UIA_Interface6 CreateEventHandlerGroup. AddEventHandlerGroup(element, handlerGroup) { return UIA_Hr(DllCall(this.__Vt(71), "ptr",this.__Value, "ptr", element.__Value, "ptr", handlerGroup.__Value)) } RemoveEventHandlerGroup(element, handlerGroup) { return UIA_Hr(DllCall(this.__Vt(72), "ptr",this.__Value, "ptr", element.__Value, "ptr", handlerGroup.__Value)) } ; Registers a method that handles when the active text position changes. AddActiveTextPositionChangedEventHandler(element,scope:=0x4,cacheRequest:=0,handler:="") { return UIA_Hr(DllCall(this.__Vt(77), "ptr",this.__Value, "ptr", element.__Value, "int", scope, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } RemoveActiveTextPositionChangedEventHandler(element,handler) { return UIA_Hr(DllCall(this.__Vt(78), "ptr",this.__Value, "ptr", element.__Value, "ptr", handler.__Value)) } } class UIA_Interface7 extends UIA_Interface6 { static __IID := "{29de312e-83c6-4309-8808-e8dfcb46c3c2}" } /* Exposes methods and properties for a UI Automation element, which represents a UI item. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationelement */ class UIA_Element extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671425(v=vs.85).aspx static __IID := "{d22108aa-8ac5-49a5-837b-37bbb3d7591e}" ; ---------- UIA_Element properties ---------- CurrentProcessId[] { get { local return UIA_Hr(DllCall(this.__Vt(20), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentControlType[] { get { local return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentLocalizedControlType[] { get { local return UIA_Hr(DllCall(this.__Vt(22), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentName[] { get { local return UIA_Hr(DllCall(this.__Vt(23), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentAcceleratorKey[] { get { local return UIA_Hr(DllCall(this.__Vt(24), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentAccessKey[] { get { local return UIA_Hr(DllCall(this.__Vt(25), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentHasKeyboardFocus[] { get { local return UIA_Hr(DllCall(this.__Vt(26), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsKeyboardFocusable[] { get { local return UIA_Hr(DllCall(this.__Vt(27), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsEnabled[] { get { local return UIA_Hr(DllCall(this.__Vt(28), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentAutomationId[] { get { local return UIA_Hr(DllCall(this.__Vt(29), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentClassName[] { get { local return UIA_Hr(DllCall(this.__Vt(30), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentHelpText[] { get { local return UIA_Hr(DllCall(this.__Vt(31), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentCulture[] { get { local return UIA_Hr(DllCall(this.__Vt(32), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsControlElement[] { get { local return UIA_Hr(DllCall(this.__Vt(33), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsContentElement[] { get { local return UIA_Hr(DllCall(this.__Vt(34), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsPassword[] { get { local return UIA_Hr(DllCall(this.__Vt(35), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentNativeWindowHandle[] { get { local return UIA_Hr(DllCall(this.__Vt(36), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentItemType[] { get { local return UIA_Hr(DllCall(this.__Vt(37), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentIsOffscreen[] { get { local return UIA_Hr(DllCall(this.__Vt(38), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentOrientation[] { get { local return UIA_Hr(DllCall(this.__Vt(39), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentFrameworkId[] { get { local return UIA_Hr(DllCall(this.__Vt(40), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentIsRequiredForForm[] { get { local return UIA_Hr(DllCall(this.__Vt(41), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentItemStatus[] { get { local return UIA_Hr(DllCall(this.__Vt(42), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentBoundingRectangle[] { get { local return UIA_Hr(DllCall(this.__Vt(43), "ptr",this.__Value, "ptr",&(rect,VarSetCapacity(rect,16))))?UIA_RectToObject(rect): } } CurrentLabeledBy[] { get { local return UIA_Hr(DllCall(this.__Vt(44), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CurrentAriaRole[] { get { local return UIA_Hr(DllCall(this.__Vt(45), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentAriaProperties[] { get { local return UIA_Hr(DllCall(this.__Vt(46), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentIsDataValidForForm[] { get { local return UIA_Hr(DllCall(this.__Vt(47), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentControllerFor[] { get { local return UIA_Hr(DllCall(this.__Vt(48), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CurrentDescribedBy[] { get { local return UIA_Hr(DllCall(this.__Vt(49), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CurrentFlowsTo[] { get { local return UIA_Hr(DllCall(this.__Vt(50), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CurrentProviderDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(51), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedProcessId[] { get { local return UIA_Hr(DllCall(this.__Vt(52), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedControlType[] { get { local return UIA_Hr(DllCall(this.__Vt(53), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedLocalizedControlType[] { get { local return UIA_Hr(DllCall(this.__Vt(54), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedName[] { get { local return UIA_Hr(DllCall(this.__Vt(55), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedAcceleratorKey[] { get { local return UIA_Hr(DllCall(this.__Vt(56), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedAccessKey[] { get { local return UIA_Hr(DllCall(this.__Vt(57), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedHasKeyboardFocus[] { get { local return UIA_Hr(DllCall(this.__Vt(58), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsKeyboardFocusable[] { get { local return UIA_Hr(DllCall(this.__Vt(59), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsEnabled[] { get { local return UIA_Hr(DllCall(this.__Vt(60), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedAutomationId[] { get { local return UIA_Hr(DllCall(this.__Vt(61), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedClassName[] { get { local return UIA_Hr(DllCall(this.__Vt(62), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedHelpText[] { get { local return UIA_Hr(DllCall(this.__Vt(63), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedCulture[] { get { local return UIA_Hr(DllCall(this.__Vt(64), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsControlElement[] { get { local return UIA_Hr(DllCall(this.__Vt(65), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsContentElement[] { get { local return UIA_Hr(DllCall(this.__Vt(66), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsPassword[] { get { local return UIA_Hr(DllCall(this.__Vt(67), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedNativeWindowHandle[] { get { local return UIA_Hr(DllCall(this.__Vt(68), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedItemType[] { get { local return UIA_Hr(DllCall(this.__Vt(69), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedIsOffscreen[] { get { local return UIA_Hr(DllCall(this.__Vt(70), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedOrientation[] { get { local return UIA_Hr(DllCall(this.__Vt(71), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedFrameworkId[] { get { local return UIA_Hr(DllCall(this.__Vt(72), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedIsRequiredForForm[] { get { local return UIA_Hr(DllCall(this.__Vt(73), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedItemStatus[] { get { local return UIA_Hr(DllCall(this.__Vt(74), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedBoundingRectangle[] { get { local return UIA_Hr(DllCall(this.__Vt(75), "ptr",this.__Value, "ptr",&(rect,VarSetCapacity(rect,16))))?UIA_RectToObject(rect): } } CachedLabeledBy[] { get { local return UIA_Hr(DllCall(this.__Vt(76), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedAriaRole[] { get { local return UIA_Hr(DllCall(this.__Vt(77), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedAriaProperties[] { get { local return UIA_Hr(DllCall(this.__Vt(78), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedIsDataValidForForm[] { get { local return UIA_Hr(DllCall(this.__Vt(79), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedControllerFor[] { get { local return UIA_Hr(DllCall(this.__Vt(80), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CachedDescribedBy[] { get { local return UIA_Hr(DllCall(this.__Vt(81), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CachedFlowsTo[] { get { local return UIA_Hr(DllCall(this.__Vt(82), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CachedProviderDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(83), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } ; ---------- Custom UIA_Element properties ---------- ; Gets or sets the current value of the element. Getter is a wrapper for GetCurrentPropertyValue("Value"), setter a wrapper for SetValue CurrentValue[] { get { return this.GetCurrentPropertyValue("Value") } set { return this.SetValue(value) } } CachedValue[] { get { return this.GetCachedPropertyValue("Value") } } CurrentExists[] { get { try { if ((this.CurrentName this.CurrentValue (this.CurrentBoundingRectangle.t ? 1 : "")) == "") return 0 } return 1 } } ; ---------- UIA_Element methods ---------- SetFocus() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } ; Retrieves the unique identifier assigned to the UI element. The identifier is only guaranteed to be unique to the UI of the desktop on which it was generated. Identifiers can be reused over time. GetRuntimeId() { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",sa:=""))? UIA_SafeArrayToAHKArray(ComObj(0x2003,sa,1)): } ; Retrieves the first child or descendant element that matches the specified condition. scope must be one of TreeScope enums (default is TreeScope_Descendants := 0x4). If cacheRequest is specified, then FindFirstBuildCache is used instead. FindFirst(c:="", scope:=0x4, cacheRequest:="") { local if !cacheRequest return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "uint",scope, "ptr", (c:=(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c)))).__Value, "ptr*",out:=""))? UIA_Element(out): return this.FindFirstBuildCache(c, scope, cacheRequest) } ; Returns all UI Automation elements that satisfy the specified condition. scope must be one of TreeScope enums (default is TreeScope_Descendants := 0x4). If cacheRequest is specified, then FindAllBuildCache is used instead. FindAll(c:="", scope:=0x4, cacheRequest:="") { local if !cacheRequest return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "uint",scope, "ptr", (c:=(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c)))).__Value, "ptr*",out:=""))? UIA_ElementArray(out): return this.FindAllBuildCache(c, scope, cacheRequest) } ; Retrieves the first child or descendant element that matches the specified condition, prefetches the requested properties and control patterns, and stores the prefetched items in the cache FindFirstBuildCache(c:="", scope:=0x4, cacheRequest:="") { ; UNTESTED. local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "uint",scope, "ptr",(c:=(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c)))).__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Returns all UI Automation elements that satisfy the specified condition, prefetches the requested properties and control patterns, and stores the prefetched items in the cache. FindAllBuildCache(c:="", scope:=0x4, cacheRequest:="") { ; UNTESTED. local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "uint",scope, "ptr",(c:=(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c)))).__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_ElementArray(out): } ; Retrieves a new UI Automation element with an updated cache. BuildUpdatedCache(cacheRequest) { ; UNTESTED. local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr", cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the current value of a property for this element. "out" will be set to the raw variant (generally not used). GetCurrentPropertyValue(propertyId, ByRef out:="") { if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "uint", propertyId, "ptr",UIA_Variant(out)))? UIA_VariantData(out):UIA_VariantClear(out) } ; Retrieves a property value for this element, optionally ignoring any default value. Passing FALSE in the ignoreDefaultValue parameter is equivalent to calling GetCurrentPropertyValue GetCurrentPropertyValueEx(propertyId, ignoreDefaultValue:=1, ByRef out:="") { if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "uint",propertyId, "uint",ignoreDefaultValue, "ptr",UIA_Variant(out)))? UIA_VariantData(out):UIA_VariantClear(out) } ; Retrieves a property value from the cache for this element. GetCachedPropertyValue(propertyId, ByRef out:="") { ; UNTESTED. if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "uint",propertyId, "ptr",UIA_Variant(out)))? UIA_VariantData(out):UIA_VariantClear(out) } ; Retrieves a property value from the cache for this element, optionally ignoring any default value. Passing FALSE in the ignoreDefaultValue parameter is equivalent to calling GetCachedPropertyValue GetCachedPropertyValueEx(propertyId, ignoreDefaultValue:=1, ByRef out:="") { if propertyId is not integer propertyId := UIA_Enum.UIA_PropertyId(propertyId) return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "uint",propertyId, "uint",ignoreDefaultValue, "ptr",UIA_Variant(out)))? UIA_VariantData(out):UIA_VariantClear(out) } ; Retrieves a UIA_Pattern object of the specified control pattern on this element. If a full pattern name is specified then that exact version will be used (eg "TextPattern" will return a UIA_TextPattern object), otherwise the highest version will be used (eg "Text" might return UIA_TextPattern2 if it is available). usedPattern will be set to the actual string used to look for the pattern (used mostly for debugging purposes) GetCurrentPatternAs(pattern, ByRef usedPattern:="") { local riid, out if (usedPattern := InStr(pattern, "Pattern") ? pattern : UIA_Pattern(pattern, this)) return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "int",UIA_%usedPattern%.__PatternId, "ptr",UIA_GUID(riid,UIA_%usedPattern%.__iid), "ptr*",out:="")) ? new UIA_%usedPattern%(out,1): throw Exception("Pattern not implemented.",-1, "UIA_" pattern "Pattern") } ; Retrieves a UIA_Pattern object of the specified control pattern on this element from the cache of this element. GetCachedPatternAs(pattern, ByRef usedPattern:="") { local riid, out if (usedPattern := InStr(pattern, "Pattern") ? pattern : UIA_Pattern(pattern, this)) return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "int",UIA_%usedPattern%.__PatternId, "ptr",UIA_GUID(riid,UIA_%usedPattern%.__iid), "ptr*",out:="")) ? new UIA_%usedPattern%(out,1): throw Exception("Pattern not implemented.",-1, "UIA_" pattern "Pattern") } GetCurrentPattern(pattern, ByRef usedPattern:="") { local out ; I don't know the difference between this and GetCurrentPatternAs if (usedPattern := InStr(pattern, "Pattern") ? pattern : UIA_Pattern(pattern, this)) return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "int",UIA_%usedPattern%.__PatternId, "ptr*",out:="")) ? new UIA_%usedPattern%(out,1): else throw Exception("Pattern not implemented.",-1, "UIA_" pattern "Pattern") } GetCachedPattern(pattern, ByRef usedPattern:="") { local out ; I don't know the difference between this and GetCachedPatternAs if (usedPattern := InStr(pattern, "Pattern") ? pattern : UIA_Pattern(pattern, this)) return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "int", UIA_%usedPattern%.__PatternId, "ptr*",out:="")) ? new UIA_%usedPattern%(out,1): else throw Exception("Pattern not implemented.",-1, "UIA_" pattern "Pattern") } ; Retrieves from the cache the parent of this UI Automation element GetCachedParent() { local return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value, "ptr*",out:=""))? UIA_Element(out): } ; Retrieves the cached child elements of this UI Automation element GetCachedChildren() { ; UNTESTED. local return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value, "ptr*",out:=""))? UIA_ElementArray(out): } ; Retrieves the physical screen coordinates of a point on the element that can be clicked GetClickablePoint() { local return UIA_Hr(DllCall(this.__Vt(84), "ptr",this.__Value, "ptr", &(point,VarSetCapacity(point,8)), "ptr*",out:=""))&&out? {x:NumGet(point,0,"int"), y:NumGet(point,4,"int")}: } ; ---------- Custom UIA_Element methods ---------- ; Wait until the element doesn't exist, with a default timeOut of 10000ms (10 seconds). Returns 1 if the element doesn't exist, otherwise 0. WaitNotExist(timeOut:=10000) { local startTime := A_TickCount while ((exists := this.CurrentExists) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) Sleep, 100 return !exists } ; Wrapper for GetClickablePoint(), where additionally the coordinates are converted to relative coordinates. relativeTo can be window, screen or client, default is A_CoordModeMouse GetClickablePointRelativeTo(relativeTo:="") { local res := this.GetClickablePoint() relativeTo := (relativeTo == "") ? A_CoordModeMouse : relativeTo StringLower, relativeTo, relativeTo if (relativeTo == "screen") return res else { hwnd := this.GetParentHwnd() if ((relativeTo == "window") || (relativeTo == "relative")) { VarSetCapacity(RECT, 16) DllCall("user32\GetWindowRect", "Ptr", hwnd, "Ptr", &RECT) return {x:(res.x-NumGet(&RECT, 0, "Int")), y:(res.y-NumGet(&RECT, 4, "Int"))} } else if (relativeTo == "client") { VarSetCapacity(pt,8,0), NumPut(res.x,&pt,0,"int"), NumPut(res.y,&pt,4,"int") DllCall("ScreenToClient", "Ptr",hwnd, "Ptr",&pt) return {x:NumGet(pt,"int"), y:NumGet(pt,4,"int")} } } } ; Get all available patterns for the element. Use of this should be avoided, since it calls GetCurrentPatternAs for every possible pattern. A better option is PollForPotentialSupportedPatterns. GetSupportedPatterns() { local result := [], patterns := "Invoke,Selection,Value,RangeValue,Scroll,ExpandCollapse,Grid,GridItem,MultipleView,Window,SelectionItem,Dock,Table,TableItem,Text,Toggle,Transform,ScrollItem,ItemContainer,VirtualizedItem,SyncronizedInput,LegacyIAccessible" Loop, Parse, patterns, `, { try { if this.GetCurrentPropertyValue(UIA_Enum.UIA_PropertyId("Is" A_LoopField "PatternAvailable")) { result.Push(A_LoopField) } } } return result } ; Get the parent window hwnd from the element GetParentHwnd() { local TW, hwndNotZeroCond, hwndRoot, hwnd hwndNotZeroCond := this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_PropertyId("NativeWindowHandle"), 0)) ; create a condition to find NativeWindowHandlePropertyId of not 0 TW := this.__UIA.CreateTreeWalker(hwndNotZeroCond) try { hwnd := TW.NormalizeElement(this).GetCurrentPropertyValue(UIA_Enum.UIA_PropertyId("NativeWindowHandle")) return hwndRoot := DllCall("user32\GetAncestor", Ptr,hwnd, UInt,2, Ptr) } catch { return 0 } } ; Set element value using Value pattern, or as a fall-back using LegacyIAccessible pattern. If a pattern is specified then that is used instead. Alternatively CurrentValue property can be used to set the value. SetValue(val, pattern:="") { if !pattern { try { this.GetCurrentPatternAs("Value").SetValue(val) } catch { this.GetCurrentPatternAs("LegacyIAccessible").SetValue(val) } } else { this.GetCurrentPatternAs(pattern).SetValue(val) } } ; Click using one of the available click-like methods (InvokePattern Invoke(), TogglePattern Toggle(), ExpandCollapsePattern Expand() or Collapse() (depending on the state of the element), SelectionItemPattern Select(), or LegacyIAccessible DoDefaultAction()), in which case ClickCount is ignored. If WhichButton is specified (for example "left", "right") then the native mouse Click function will be used to click the center of the element. ; If WhichButton is a number, then Sleep will be called with that number. Eg Click(200) will sleep 200ms after clicking ; If ClickCountAndSleepTime is a number >=10, then Sleep will be called with that number. To click 10+ times and sleep after, specify "ClickCount SleepTime". Ex: Click("left", 200) will sleep 200ms after clicking. Ex: Click("left", "20 200") will left-click 20 times and then sleep 200ms. ; If Relative is "Rel" or "Relative" then X and Y coordinates are treated as offsets from the current mouse position. Otherwise it expects offset values for both X and Y (eg "-5 10" would offset X by -5 and Y by +10). Click(WhichButtonOrSleepTime:="", ClickCountAndSleepTime:=1, DownOrUp:="", Relative:="") { local global UIA_Enum if ((WhichButtonOrSleepTime == "") or RegexMatch(WhichButtonOrSleepTime, "^\d+$")) { SleepTime := WhichButtonOrSleepTime ? WhichButtonOrSleepTime : -1 if (this.GetCurrentPropertyValue(UIA_Enum.UIA_IsInvokePatternAvailablePropertyId)) { this.GetCurrentPatternAs("Invoke").Invoke() Sleep, %SleepTime% return 1 } if (this.GetCurrentPropertyValue(UIA_Enum.UIA_IsTogglePatternAvailablePropertyId)) { togglePattern := this.GetCurrentPatternAs("Toggle"), toggleState := togglePattern.CurrentToggleState togglePattern.Toggle() if (togglePattern.CurrentToggleState != toggleState) { Sleep, %SleepTime% return 1 } } if (this.GetCurrentPropertyValue(UIA_Enum.UIA_IsExpandCollapsePatternAvailablePropertyId)) { if ((expandState := (pattern := this.GetCurrentPatternAs("ExpandCollapse")).CurrentExpandCollapseState) == 0) pattern.Expand() Else pattern.Collapse() if (pattern.CurrentExpandCollapseState != expandState) { Sleep, %SleepTime% return 1 } } if (this.GetCurrentPropertyValue(UIA_Enum.UIA_IsSelectionItemPatternAvailablePropertyId)) { selectionPattern := this.GetCurrentPatternAs("SelectionItem"), selectionState := selectionPattern.CurrentIsSelected selectionPattern.Select() if (selectionPattern.CurrentIsSelected != selectionState) { Sleep, %sleepTime% return 1 } } if (this.GetCurrentPropertyValue(UIA_Enum.UIA_IsLegacyIAccessiblePatternAvailablePropertyId)) { this.GetCurrentPatternAs("LegacyIAccessible").DoDefaultAction() Sleep, %sleepTime% return 1 } return 0 } else { rel := [0,0] if (Relative && !InStr(Relative, "rel")) rel := StrSplit(Relative, " "), Relative := "" ClickCount := 1, SleepTime := -1 if (ClickCountAndSleepTime := StrSplit(ClickCountAndSleepTime, " "))[2] { ClickCount := ClickCountAndSleepTime[1], SleepTime := ClickCountAndSleepTime[2] } else if ClickCountAndSleepTime[1] { if (ClickCountAndSleepTime[1] > 9) { SleepTime := ClickCountAndSleepTime[1] } else { ClickCount := ClickCountAndSleepTime[1] } } try pos := this.GetClickablePointRelativeTo() if !(pos.x || pos.y) { pos := this.GetCurrentPos() ; or should only GetClickablePoint be used instead? Click, % (pos.x+pos.w//2+rel[1]) " " (pos.y+pos.h//2+rel[2]) " " WhichButtonOrSleepTime (ClickCount ? " " ClickCount : "") (DownOrUp ? " " DownOrUp : "") (Relative ? " " Relative : "") } else { Click, % (pos.x+rel[1]) " " (pos.y+rel[2]) " " WhichButtonOrSleepTime (ClickCount ? " " ClickCount : "") (DownOrUp ? " " DownOrUp : "") (Relative ? " " Relative : "") } Sleep, %SleepTime% } } ; ControlClicks the element after getting relative coordinates with GetClickablePointRelativeTo("window"). Specifying WinTitle makes the function faster, since it bypasses getting the Hwnd from the element. ; If WinTitle or WinText is a number, then Sleep will be called with that number of milliseconds. Ex: ControlClick(200) will sleep 200ms after clicking. Same for ControlClick("ahk_id 12345", 200) ControlClick(WinTitleOrSleepTime:="", WinTextOrSleepTime:="", WhichButton:="", ClickCount:="", Options:="", ExcludeTitle:="", ExcludeText:="") { local try this.SetFocus() if (WinTitleOrSleepTime == "") WinTitleOrSleepTime := "ahk_id " this.GetParentHwnd() try pos := this.GetClickablePointRelativeTo("window") if !(pos.x || pos.y) { pos := this.GetCurrentPos("window") ; or should GetClickablePoint be used instead? ControlClick, % "X" pos.x+pos.w//2 " Y" pos.y+pos.h//2, % WinTitleOrSleepTime, % WinTextOrSleepTime, % WhichButton, % ClickCount, % Options, % ExcludeTitle, % ExcludeText } else { ControlClick, % "X" pos.x " Y" pos.y, % WinTitleOrSleepTime, % WinTextOrSleepTime, % WhichButton, % ClickCount, % Options, % ExcludeTitle, % ExcludeText } if WinTitleOrSleepTime is integer Sleep, %WinTitleOrSleepTime% else if WinTextOrSleepTime is integer Sleep, %WinTextOrSleepTime% } ; Returns an object containing the x, y coordinates and width and height: {x:x coordinate, y:y coordinate, w:width, h:height}. relativeTo can be client, window or screen, default is A_CoordModeMouse. GetCurrentPos(relativeTo:="") { local relativeTo := (relativeTo == "") ? A_CoordModeMouse : relativeTo StringLower, relativeTo, relativeTo br := this.CurrentBoundingRectangle if (relativeTo == "screen") return {x:br.l, y:br.t, w:(br.r-br.l), h:(br.b-br.t)} else { hwnd := this.GetParentHwnd() if ((relativeTo == "window") || (relativeTo == "relative")) { VarSetCapacity(RECT, 16) DllCall("user32\GetWindowRect", "Ptr", hwnd, "Ptr", &RECT) return {x:(br.l-NumGet(&RECT, 0, "Int")), y:(br.t-NumGet(&RECT, 4, "Int")), w:(br.r-br.l), h:(br.b-br.t)} } else if (relativeTo == "client") { VarSetCapacity(pt,8,0), NumPut(br.l,&pt,0,"int"), NumPut(br.t,&pt,4,"int") DllCall("ScreenToClient", "Ptr",hwnd, "Ptr",&pt) return {x:NumGet(pt,"int"), y:NumGet(pt,4,"int"), w:(br.r-br.l), h:(br.b-br.t)} } } } ; By default get only direct children (UIA_TreeScope_Children := 0x2) GetChildren(scope:=0x2, c:="") { return this.FindAll(c=="" ? this.TrueCondition : c, scope) } ; Get all child elements using TreeViewer TWGetChildren() { local arr := [] if !IsObject(nextChild := this.TreeWalkerTrue.GetFirstChildElement(this)) return 0 arr.Push(nextChild) while IsObject(nextChild := this.TreeWalkerTrue.GetNextSiblingElement(nextChild)) arr.Push(nextChild) return arr } DumpRecursive(maxDepth:=20, layer:="", useTreeWalker := False, cached := False) { ; This function might hang if the element has thousands of empty custom elements (e.g. complex webpage) local StrReplace(layer, ".",, dotcount) if (dotcount >= maxDepth) return "" if !(children := (cached ? this.GetCachedChildren() : (useTreeWalker ? this.TWGetChildren() : this.GetChildren()))) return "" returnStr := "" for k, v in children { returnStr .= layer . (layer == "" ? "" : ".") . k " " (cached ? v.CachedDump() : v.Dump()) . "`n" . v.DumpRecursive(maxDepth, layer (layer == "" ? "" : ".") k, useTreeWalker, cached) } return returnStr } ; Returns info about the element: ControlType, Name, Value, LocalizedControlType, AutomationId, AcceleratorKey. Dump() { local global UIA_Enum return "Type: " (ctrlType := this.CurrentControlType) " (" UIA_Enum.UIA_ControlTypeId(ctrlType) ")" ((name := this.CurrentName) == "" ? "" : " Name: """ name """") ((val := this.CurrentValue) == "" ? "" : " Value: """ val """") ((lct := this.CurrentLocalizedControlType) == "" ? "" : " LocalizedControlType: """ lct """") ((aid := this.CurrentAutomationId) == "" ? "" : " AutomationId: """ aid """") ((cm := this.CurrentClassName) == "" ? "" : " ClassName: """ cm """") ((ak := this.CurrentAcceleratorKey) == "" ? "" : " AcceleratorKey: """ ak """") } CachedDump() { local global UIA_Enum return "Type: " (ctrlType := this.CachedControlType) " (" UIA_Enum.UIA_ControlTypeId(ctrlType) ")" ((name := this.CachedName) == "" ? "" : " Name: """ name """") ((val := this.CachedValue) == "" ? "" : " Value: """ val """") ((lct := this.CachedLocalizedControlType) == "" ? "" : " LocalizedControlType: """ lct """") ((aid := this.CachedAutomationId) == "" ? "" : " AutomationId: """ aid """") ((cm := this.CachedClassName) == "" ? "" : " ClassName: """ cm """") ((ak := this.CachedAcceleratorKey) == "" ? "" : " AcceleratorKey: """ ak """") } ; Returns info (ControlType, Name etc) for all descendants of the element. maxDepth is the allowed depth of recursion, by default 20 layers. DO NOT call this on the root element! DumpAll(maxDepth:=20) { return (this.Dump() . "`n" . this.DumpRecursive(maxDepth)) } ; Requires caching for properties ControlType, LocalizedControlType, Name, Value, AutomationId, AcceleratorKey CachedDumpAll(maxDepth:=20) { return (this.CachedDump() . "`n" . this.DumpRecursive(maxDepth,,,True)) } /* FindFirst using search criteria. expr: Takes a value in the form of "PropertyId=matchvalue" to match a specific property with the value matchValue. PropertyId can be most properties from UIA_Enum.UIA_PropertyId method (for example Name, ControlType, AutomationId etc). Example1: "Name=Username:" would use FindFirst with UIA_Enum.UIA_NamePropertyId matching the name "Username:" Example2: "ControlType=Button would FindFirst using UIA_Enum.UIA_ControlTypePropertyId and matching for UIA_Enum.UIA_ButtonControlTypeId. Alternatively "ControlType=50000" can be used (direct value for UIA_ButtonControlTypeId which is 50000) Criteria can be combined with AND, OR, &&, ||: Example3: "Name=Username: AND ControlType=Button" would FindFirst an element with the name property of "Username:" and control type of button. Flags can be modified for each individual condition by specifying FLAGS=n after the condition (and before and/or operator). 0=no flags; 1=ignore case (case insensitive matching); 2=match substring; 3=ignore case and match substring If matchMode==3 or matching substrings is supported (Windows 10 17763 and above) and matchMode==2, then parentheses are supported. Otherwise parenthesis are not supported, and criteria are evaluated left to right, so "a AND b OR c" would be evaluated as "(a and b) or c". Negation can be specified with NOT: Example4: "NOT ControlType=Edit" would return the first element that is not an edit element scope: Scope by default is UIA_TreeScope_Descendants. matchMode: If using Name PropertyId as a criteria, this follows the SetTitleMatchMode scheme: 1=name must must start with the specified name 2=can contain anywhere 3=exact match RegEx=using regular expression. In this case the Name can't be empty. caseSensitive: If matching for a string, this will specify case-sensitivity. */ FindFirstBy(expr, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if ((matchMode == 3) || (matchMode==2 && MatchSubstringSupported)) { return this.FindFirst(this.__UIA.CreateCondition(expr, ((matchMode==2)?2:0)|!caseSensitive), scope, cacheRequest) } pos := 1, match := "", createCondition := "", operator := "", bufName := [] while (pos := RegexMatch(expr, "i) *(NOT|!)? *(\w+?) *=(?: *(\d+|'.*?(?<=[^\\]|[^\\]\\\\)')|(.*?))(?: FLAGS=(\d))?( AND | OR | && | \|\| |$)", match, pos+StrLen(match))) { if !match break if ((StrLen(match3) > 1) && (SubStr(match3,1,1) == "'") && (SubStr(match3,0,1) == "'")) match3 := StrReplace(RegexReplace(SubStr(match3,2,StrLen(match3)-2), "(?<=[^\\]|[^\\]\\\\)\\'", "'"), "\\", "\") ; Remove single quotes and escape characters else if match4 match3 := match4 if ((isNamedProperty := RegexMatch(match2, "i)Name|AutomationId|Value|ClassName|FrameworkId")) && !bufName[1] && ((matchMode != 2) || ((matchMode == 2) && !MatchSubstringSupported)) && (matchMode != 3)) { ; Check if we have a condition that needs FindAll to be searched, and save it. Apply only for the first one encountered. bufName[1] := (match1 ? "NOT " : "") match2, bufName[2] := match3, bufName[3] := match5 Continue } newCondition := this.__UIA.CreateCondition(match2, match3, match5 ? match5 : ((((matchMode==2) && isNamedProperty)?2:0)|!caseSensitive)) if match1 newCondition := this.__UIA.CreateNotCondition(newCondition) fullCondition := (operator == " AND " || operator == " && ") ? this.__UIA.CreateAndCondition(fullCondition, newCondition) : (operator == " OR " || operator == " || ") ? this.__UIA.CreateOrCondition(fullCondition, newCondition) : newCondition operator := match6 ; Save the operator to be used in the next loop } if (bufName[1]) { ; If a special case was encountered requiring FindAll notProp := InStr(bufName[1], "NOT "), property := StrReplace(StrReplace(bufName[1], "NOT "), "Current"), value := bufName[2], caseSensitive := bufName[3] ? !(bufName[3]&1) : caseSensitive if (property = "value") property := "ValueValue" if (MatchSubstringSupported && (matchMode==1)) { ; Check if we can speed up the search by limiting to substrings when matchMode==1 propertyCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum["UIA_" property "PropertyId"], value,, 2|!caseSensitive) if notProp propertyCondition := this.__UIA.CreateNotCondition(propertyCondition) } else propertyCondition := this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum["UIA_" property "PropertyId"], "")) fullCondition := IsObject(fullCondition) ? this.__UIA.CreateAndCondition(propertyCondition, fullCondition) : propertyCondition for _, element in this.FindAll(fullCondition, scope, cacheRequest) { curValue := element["Current" property] if notProp { if (((matchMode == 1) && !InStr(SubStr(curValue, 1, StrLen(value)), value, caseSensitive)) || ((matchMode == 2) && !InStr(curValue, value, caseSensitive)) || (InStr(matchMode, "RegEx") && !RegExMatch(curValue, value))) return element } else { if (((matchMode == 1) && InStr(SubStr(curValue, 1, StrLen(value)), value, caseSensitive)) || ((matchMode == 2) && InStr(curValue, value, caseSensitive)) || (InStr(matchMode, "RegEx") && RegExMatch(curValue, value))) return element } } } else { return this.FindFirst(fullCondition, scope, cacheRequest) } } ; FindFirst using UIA_NamePropertyId. "scope" is search scope, which can be any of UIA_Enum TreeScope values. "MatchMode" has same convention as window TitleMatchMode: 1=needs to start with the specified name, 2=can contain anywhere, 3=exact match, RegEx=regex match. FindFirstByName(name, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if (matchMode == 3 || (MatchSubstringSupported && (matchMode == 2))) { nameCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, ((matchMode==3)?0:2)|!caseSensitive) return this.FindFirst(nameCondition, scope, cacheRequest) } nameCondition := ((matchMode==1)&&MatchSubstringSupported)?this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, 2|!caseSensitive):this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_NamePropertyId, "")) for k, v in this.FindAll(nameCondition, scope, cacheRequest) { curName := v.CurrentName if (((matchMode == 1) && InStr(SubStr(curName, 1, StrLen(name)), name, caseSensitive))|| ((matchMode == 2) && InStr(curName, name, caseSensitive)) || ((matchMode = "RegEx") && RegExMatch(curName, name))) return v } } ; FindFirst using UIA_ControlTypeId. controlType can be the ControlTypeId numeric value, or in string form (eg "Button") FindFirstByType(controlType, scope:=0x4, cacheRequest:="") { local global UIA_Enum if controlType is not integer controlType := UIA_Enum.UIA_ControlTypeId(controlType) if !controlType throw Exception("Invalid control type specified", -1) controlCondition := this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_ControlTypePropertyId, controlType) return this.FindFirst(controlCondition, scope, cacheRequest) } ; FindFirst using UIA_NamePropertyId and UIA_ControlTypeId. controlType can be the ControlTypeId numeric value, or in string form (eg "Button"). scope is search scope, which can be any of UIA_Enum TreeScope values. matchMode has same convention as window TitleMatchMode: 1=needs to start with the specified name, 2=can contain anywhere, 3=exact match, RegEx=regex match FindFirstByNameAndType(name, controlType, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if controlType is not integer controlType := UIA_Enum.UIA_ControlTypeId(controlType) if !controlType throw Exception("Invalid control type specified", -1) controlCondition := this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_ControlTypePropertyId, controlType, 3) if (matchMode == 3 || (MatchSubstringSupported && (matchMode == 2))) { nameCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, ((matchMode==3)?0:2)|!caseSensitive) AndCondition := this.__UIA.CreateAndCondition(nameCondition, controlCondition) return this.FindFirst(AndCondition, scope, cacheRequest) } nameCondition := ((matchMode==1) && MatchSubstringSupported)?this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, 2|(!caseSensitive)):this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_NamePropertyId, "")) AndCondition := this.__UIA.CreateAndCondition(nameCondition, controlCondition) for k, v in this.FindAll(AndCondition, scope, cacheRequest) { curName := v.CurrentName if (((matchMode == 1) && InStr(SubStr(curName, 1, StrLen(name)), name, caseSensitive)) || ((matchMode == 2) && InStr(curName, name, caseSensitive)) || ((matchMode = "RegEx") && RegExMatch(curName, name))) return v } } ; FindAll using an expression containing the desired conditions. For more information about expr, see FindFirstBy explanation FindAllBy(expr, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if ((matchMode == 3) || (matchMode==2 && MatchSubstringSupported)) return this.FindAll(this.__UIA.CreateCondition(expr, ((matchMode==2)?2:0)|!caseSensitive), scope, cacheRequest) pos := 1, match := "", createCondition := "", operator := "", bufName := [] while (pos := RegexMatch(expr, "i) *(NOT|!)? *(\w+?) *=(?: *(\d+|'.*?(?<=[^\\]|[^\\]\\\\)')|(.*?))(?: FLAGS=(\d))?( AND | OR | && | \|\| |$)", match, pos+StrLen(match))) { if !match break if ((StrLen(match3) > 1) && (SubStr(match3,1,1) == "'") && (SubStr(match3,0,1) == "'")) match3 := StrReplace(RegexReplace(SubStr(match3,2,StrLen(match3)-2), "(?<=[^\\]|[^\\]\\\\)\\'", "'"), "\\", "\") ; Remove single quotes and escape characters else if match4 match3 := match4 if ((isNamedProperty := RegexMatch(match2, "i)Name|AutomationId|Value|ClassName|FrameworkId")) && !bufName[1] && ((matchMode != 2) || ((matchMode == 2) && !MatchSubstringSupported)) && (matchMode != 3)) { ; Check if we have a condition that needs FindAll to be searched, and save it. Apply only for the first one encountered. bufName[1] := (match1 ? "NOT " : "") match2, bufName[2] := match3, bufName[3] := match5 Continue } newCondition := this.__UIA.CreateCondition(match2, match3, match5 ? match5 : ((((matchMode==2) && isNamedProperty)?2:0)|!caseSensitive)) if match1 newCondition := this.__UIA.CreateNotCondition(newCondition) fullCondition := (operator == " AND " || operator == " && ") ? this.__UIA.CreateAndCondition(fullCondition, newCondition) : (operator == " OR " || operator == " || ") ? this.__UIA.CreateOrCondition(fullCondition, newCondition) : newCondition operator := match6 ; Save the operator to be used in the next loop } if (bufName[1]) { ; If a special case was encountered requiring FindAll notProp := InStr(bufName[1], "NOT "), property := StrReplace(StrReplace(bufName[1], "NOT "), "Current"), value := bufName[2], returnArr := [], caseSensitive := bufName[3] ? !(bufName[3]&1) : caseSensitive if (property = "value") property := "ValueValue" if (MatchSubstringSupported && (matchMode==1)) { ; Check if we can speed up the search by limiting to substrings when matchMode==1 propertyCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum["UIA_" property "PropertyId"], value,, 2|!caseSensitive) if notProp propertyCondition := this.__UIA.CreateNotCondition(propertyCondition) } else propertyCondition := this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum["UIA_" property "PropertyId"], "")) fullCondition := IsObject(fullCondition) ? this.__UIA.CreateAndCondition(propertyCondition, fullCondition) : propertyCondition for _, element in this.FindAll(fullCondition, scope, cacheRequest) { curValue := element["Current" property] if notProp { if (((matchMode == 1) && !InStr(SubStr(curValue, 1, StrLen(value)), value, caseSensitive)) || ((matchMode == 2) && !InStr(curValue, value, caseSensitive)) || (InStr(matchMode, "RegEx") && !RegExMatch(curValue, value))) returnArr.Push(element) } else { if (((matchMode == 1) && InStr(SubStr(curValue, 1, StrLen(value)), value, caseSensitive)) || ((matchMode == 2) && InStr(curValue, value, caseSensitive)) || (InStr(matchMode, "RegEx") && RegExMatch(curValue, value))) returnArr.Push(element) } } return returnArr[1] ? returnArr : "" } else { return this.FindAll(fullCondition, scope, cacheRequest) } } ; FindAll using UIA_NamePropertyId. scope is search scope, which can be any of UIA_Enum TreeScope values. matchMode has same convention as window TitleMatchMode: 1=needs to start with the specified name, 2=can contain anywhere, 3=exact match, RegEx=regex match FindAllByName(name, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if (matchMode == 3 || ((matchMode == 2) && MatchSubstringSupported)) { nameCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, ((matchMode==3)?0:2)|!caseSensitive) return this.FindAll(nameCondition, scope, cacheRequest) } nameCondition := ((matchMode==1) && MatchSubstringSupported)?this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, 2|!caseSensitive):this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_NamePropertyId, "")) retList := [] for k, v in this.FindAll(nameCondition, scope, cacheRequest) { curName := v.CurrentName if (((matchMode == 1) && InStr(SubStr(curName, 1, StrLen(name)), name, caseSensitive)) || ((matchMode == 2) && InStr(curName, name, caseSensitive)) || ((matchMode = "RegEx") && RegExMatch(curName, name))) retList.Push(v) } return retList } ; FindAll using UIA_ControlTypeId. controlType can be the ControlTypeId numeric value, or in string form (eg "Button"). scope is search scope, which can be any of UIA_Enum TreeScope values. FindAllByType(controlType, scope:=0x4, cacheRequest:="") { local global UIA_Enum if controlType is not integer controlType := UIA_Enum.UIA_ControlTypeId(controlType) if !controlType throw Exception("Invalid control type specified", -1) controlCondition := this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_ControlTypePropertyId, controlType) return this.FindAll(controlCondition, scope, cacheRequest) } ; FindAll using UIA_NamePropertyId and UIA_ControlTypeId. controlType can be the ControlTypeId numeric value, or in string form (eg "Button"). scope is search scope, which can be any of UIA_Enum TreeScope values. matchMode has same convention as window TitleMatchMode: 1=needs to start with the specified name, 2=can contain anywhere, 3=exact match, RegEx=regex match FindAllByNameAndType(name, controlType, scope:=0x4, matchMode:=3, caseSensitive:=True, cacheRequest:="") { local global UIA_Enum static MatchSubstringSupported := !InStr(A_OSVersion, "WIN") && (StrSplit(A_OSVersion, ".")[3] >= 17763) if controlType is not integer controlType := UIA_Enum.UIA_ControlTypeId(controlType) if !controlType throw Exception("Invalid control type specified", -1) controlCondition := this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_ControlTypePropertyId, controlType) if (matchMode == 3 || (MatchSubstringSupported && (matchMode == 2))) { nameCondition := this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, ((matchMode==3)?0:2)|!caseSensitive) AndCondition := this.__UIA.CreateAndCondition(nameCondition, controlCondition) return this.FindAll(AndCondition, scope, cacheRequest) } nameCondition := ((matchMode==1) && MatchSubstringSupported)?this.__UIA.CreatePropertyConditionEx(UIA_Enum.UIA_NamePropertyId, name,, 2|!caseSensitive):this.__UIA.CreateNotCondition(this.__UIA.CreatePropertyCondition(UIA_Enum.UIA_NamePropertyId, "")) AndCondition := this.__UIA.CreateAndCondition(nameCondition, controlCondition) returnArr := [] for k, v in this.FindAll(AndCondition, scope, cacheRequest) { curName := v.CurrentName if (((matchMode == 1) && InStr(SubStr(curName, 1, StrLen(name)), name, caseSensitive)) || ((matchMode == 2) && InStr(curName, name, caseSensitive)) || ((matchMode = "RegEx") && RegExMatch(curName, name))) returnArr.Push(v) } return returnArr } /* FindByPath gets an element by a relative "path" from a starting element. 1) To get the nth child of the starting element, set searchPath to "n". To get a deeper node, separate the numbers with a ".": "2.1" will get the second childs first child. This kind of path can easily be got from the UIA_Element.DumpAll() method, which returns a path in the same style (this is like the Acc path but for UIA, they are not compatible!). 2) To get the nth parent of the starting element, use "Pn": "P2" will get the parent of the parent. 3) To get sibling elements, put a "+" or "-" in front of "n": +2 will get the next sibling from the next sibling (calling GetNextSiblingElement twice). Using this after "Pn" doesn't require a "." separator ("P2.-1" == "P2-1"). These conditions can also be combined: searchPath="P1-1.1.1.2" -> gets the parent element, then the previous sibling element of the parent, and then "1.1.2" gets the second child of the first childs first child. c or condition argument can be used to only filter elements specified by the condition: UIA_Element.FindByPath("+2", "Type=Button") will only consider "Button" controls and gets the second sibling button. */ FindByPath(searchPath:="", c:="") { local el := this, ErrorLevel := 0, PathTW := (c=="" ? this.TreeWalkerTrue : this.__UIA.CreateTreeWalker(c)) searchPath := StrReplace(StrReplace(searchPath, " "), ",", ".") Loop, Parse, searchPath, . { if RegexMatch(A_LoopField, "^\d+$") { children := el.GetChildren(0x2,c) if !IsObject(el := children[A_LoopField]) return ErrorLevel := "Step " A_index " was out of bounds" } else if RegexMatch(A_LoopField, "i)^(?!p\d*[+-]?\d*$)([A-Za-z]+)([+-]?\d*)$", m) { el := (m2 && m2 != 1) ? (els := el.FindAllByType(m1, 2))[m2 > 1 ? m2 : els.MaxIndex()+m2+1] : el.FindFirstByType(m1, 2) } else { if RegexMatch(A_LoopField, "i)p(\d+)?", m) { if !m1 m1 := 1 Loop, %m1% { if !(el := PathTW.GetParentElement(el)) return ErrorLevel := "Step " A_index " with P" m1 " was out of bounds (GetParentElement failed)" } } if RegexMatch(A_LoopField, "([+-])(\d+)?", m) { if !m2 m2 := 1 if (m1 == "+") { Loop, %m2% { if !(el := PathTW.GetNextSiblingElement(el)) return ErrorLevel := "Step " A_index " with """ m1 m2 """ was out of bounds (GetNextSiblingElement failed)" } } else if (m1 == "-") { Loop, %m2% { if !(el := PathTW.GetPreviousSiblingElement(el)) return ErrorLevel := "Step " A_index " with """ m1 m2 """ was out of bounds (GetPreviousSiblingElement failed)" } } } } } return el } ; Calls UIA_Element.FindByPath until the element is found and then returns it. By default waits indefinitely, timeOut can be specified in milliseconds. WaitElementExistByPath(searchPath, c:="", timeOut:=-1) { local startTime := A_TickCount while (!IsObject(el := this.FindByPath(searchPath, c)) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) Sleep, 40 return el } ; Calls UIA_Element.FindFirstBy until the element is found and then returns it. By default waits indefinitely, timeOut can be specified in milliseconds. For explanations of the other arguments, see FindFirstBy WaitElementExist(expr, scope:=0x4, matchMode:=3, caseSensitive:=True, timeOut:=-1, cacheRequest:="") { local startTime := A_TickCount while (!IsObject(el := this.FindFirstBy(expr, scope, matchMode, caseSensitive, cacheRequest)) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) Sleep, 40 return el } ; Tries to FindFirstBy the element and if it is found then waits until the element doesn't exist (using WaitNotExist()), with a timeOut of 10000ms (10 seconds). For explanations of the other arguments, see FindFirstBy WaitElementNotExist(expr, scope:=0x4, matchMode:=3, caseSensitive:=True, timeOut:=-1) { local return !IsObject(el := this.FindFirstBy(expr, scope, matchMode, caseSensitive)) || el.WaitNotExist(timeOut) } ; Calls UIA_Element.FindFirstByName until the element is found and then returns it. By default waits indefinitely, timeOut can be specified in milliseconds. WaitElementExistByName(name, scope:=0x4, matchMode:=3, caseSensitive:=True, timeOut:=-1, cacheRequest:="") { local startTime := A_TickCount while (!IsObject(el := this.FindFirstByName(name, scope, matchMode, caseSensitive, cacheRequest)) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) Sleep, 40 return el } ; Calls UIA_Element.FindFirstByType until the element is found and then returns it. By default waits indefinitely, timeOut can be specified in milliseconds. WaitElementExistByType(controlType, scope:=0x4, timeOut:=-1, cacheRequest:="") { local startTime := A_TickCount while (!IsObject(el := this.FindFirstByType(controlType, scope, cacheRequest)) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) Sleep, 100 return el } ; Calls UIA_Element.FindFirstByNameAndType until the element is found and then returns it. By default waits indefinitely, timeOut can be specified in milliseconds. WaitElementExistByNameAndType(name, controlType, scope:=0x4, matchMode:=3, caseSensitive:=True, timeOut:=-1, cacheRequest:="") { local startTime := A_TickCount while (!IsObject(el := (this.FindFirstByNameAndType(name, controlType, scope, matchMode, caseSensitive, cacheRequest))) && ((timeOut < 1) ? 1 : (A_tickCount - startTime < timeOut))) { Sleep, 100 } return el } Highlight(displayTime:=2000, color:="Red", d:=4) { ; Based on FindText().RangeTip from the FindText library, credit goes to feiyue local br := this.CurrentBoundingRectangle, x := br.l, y := br.t, w := br.r-br.l, h := br.b-br.t, d:=Floor(d) Loop 4 { Gui, Range_%A_Index%: +Hwndid +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000 i:=A_Index , x1:=(i=2 ? x+w : x-d) , y1:=(i=3 ? y+h : y-d) , w1:=(i=1 or i=3 ? w+2*d : d) , h1:=(i=2 or i=4 ? h+2*d : d) Gui, Range_%i%: Color, %color% Gui, Range_%i%: Show, NA x%x1% y%y1% w%w1% h%h1% } Sleep, %displayTime% Loop 4 Gui, Range_%A_Index%: Destroy return this } } class UIA_Element2 extends UIA_Element { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671425(v=vs.85).aspx static __IID := "{6749C683-F70D-4487-A698-5F79D55290D6}" ; ---------- UIA_Element2 properties ---------- CurrentOptimizeForVisualContent[] { get { local return UIA_Hr(DllCall(this.__Vt(85), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedOptimizeForVisualContent[] { get { local return UIA_Hr(DllCall(this.__Vt(86), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentLiveSetting[] { get { local return UIA_Hr(DllCall(this.__Vt(87), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedLiveSetting[] { get { local return UIA_Hr(DllCall(this.__Vt(88), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentFlowsFrom[] { get { local return UIA_Hr(DllCall(this.__Vt(89), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CachedFlowsFrom[] { get { local return UIA_Hr(DllCall(this.__Vt(90), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } } class UIA_Element3 extends UIA_Element2 { static __IID := "{8471DF34-AEE0-4A01-A7DE-7DB9AF12C296}" ; ---------- UIA_Element3 properties ---------- CurrentIsPeripheral[] { get { local return UIA_Hr(DllCall(this.__Vt(92), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsPeripheral[] { get { local return UIA_Hr(DllCall(this.__Vt(93), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA methods ---------- ShowContextMenu() { return UIA_Hr(DllCall(this.__Vt(91), "ptr",this.__Value)) } } class UIA_Element4 extends UIA_Element3 { static __IID := "{3B6E233C-52FB-4063-A4C9-77C075C2A06B}" ; ---------- UIA_Element4 properties ---------- CurrentPositionInSet[] { get { local return UIA_Hr(DllCall(this.__Vt(94), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentSizeOfSet[] { get { local return UIA_Hr(DllCall(this.__Vt(95), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentLevel[] { get { local return UIA_Hr(DllCall(this.__Vt(96), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentAnnotationTypes[] { get { local return UIA_Hr(DllCall(this.__Vt(97), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } CurrentAnnotationObjects[] { get { local return UIA_Hr(DllCall(this.__Vt(98), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } CachedPositionInSet[] { get { local return UIA_Hr(DllCall(this.__Vt(99), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedSizeOfSet[] { get { local return UIA_Hr(DllCall(this.__Vt(100), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedLevel[] { get { local return UIA_Hr(DllCall(this.__Vt(101), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedAnnotationTypes[] { get { local return UIA_Hr(DllCall(this.__Vt(102), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } CachedAnnotationObjects[] { get { local return UIA_Hr(DllCall(this.__Vt(103), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } } class UIA_Element5 extends UIA_Element4 { static __IID := "{98141C1D-0D0E-4175-BBE2-6BFF455842A7}" ; ---------- UIA_Element5 properties ---------- CurrentLandmarkType[] { get { local return UIA_Hr(DllCall(this.__Vt(104), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentLocalizedLandmarkType[] { get { local return UIA_Hr(DllCall(this.__Vt(105), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedLandmarkType[] { get { local return UIA_Hr(DllCall(this.__Vt(106), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedLocalizedLandmarkType[] { get { local return UIA_Hr(DllCall(this.__Vt(107), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } } class UIA_Element6 extends UIA_Element5 { static __IID := "{4780D450-8BCA-4977-AFA5-A4A517F555E3}" ; ---------- UIA_Element6 properties ---------- CurrentFullDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(108), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedFullDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(109), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } } class UIA_Element7 extends UIA_Element6 { static __IID := "{204E8572-CFC3-4C11-B0C8-7DA7420750B7}" ; Finds the first matching element in the specified order. traversalOptions must be one of TreeTraversalOptions enums. [optional] root is pointer to the element with which to begin the search. FindFirstWithOptions(scope:=0x4, c:="", traversalOptions:=0, root:=0) { local return UIA_Hr(DllCall(this.__Vt(110), "ptr",this.__Value, "uint", scope, "ptr",(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c))).__Value, "uint", traversalOptions, "ptr", root ? root.__Value : this.__Value, "ptr*",out:=""))? UIA_Element(out): } FindAllWithOptions(scope:=0x4, c:="", traversalOptions:=0, root:=0) { local return UIA_Hr(DllCall(this.__Vt(111), "ptr",this.__Value, "uint",scope, "ptr",(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c))).__Value, "int", traversalOptions, "ptr", root ? root.__Value : this.__Value, "ptr*",out:=""))? UIA_ElementArray(out): } FindFirstWithOptionsBuildCache(scope:=0x4, c:="", cacheRequest:=0, traversalOptions:=0, root:=0) { local return UIA_Hr(DllCall(this.__Vt(112), "ptr",this.__Value, "uint",scope, "ptr",(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c))).__Value, "ptr", cacheRequest.__Value, "int", traversalOptions, "ptr", root ? root.__Value : this.__Value, "ptr*",out:=""))? UIA_Element(out): } FindAllWithOptionsBuildCache(scope:=0x4, c:="", cacheRequest:=0, traversalOptions:=0, root:=0) { local return UIA_Hr(DllCall(this.__Vt(113), "ptr",this.__Value, "uint",scope, "ptr",(c=""?this.TrueCondition:(IsObject(c)?c:this.__UIA.CreateCondition(c))).__Value, "ptr", cacheRequest.__Value, "int", traversalOptions, "ptr", root ? root.__Value : this.__Value, "ptr*",out:=""))? UIA_ElementArray(out): } GetCurrentMetadataValue(targetId, metadataId) { local return UIA_Hr(DllCall(this.__Vt(114), "ptr",this.__Value, "int",targetId, "int", metadataId, "ptr*", UIA_Variant(out:="")))? UIA_VariantData(out):UIA_VariantClear(out) } } class UIA_ElementArray extends UIA_Base { static __IID := "{14314595-b4bc-4055-95f2-58f2e42c9855}" ; ---------- UIA_ElementArray properties ---------- Length[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_ElementArray methods ---------- GetElement(i) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",i, "ptr*",out:=""))? UIA_Element(out): } } /* Exposes properties and methods that UI Automation client applications use to view and navigate the UI Automation elements on the desktop. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtreewalker */ class UIA_TreeWalker extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671470(v=vs.85).aspx static __IID := "{4042c624-389c-4afc-a630-9df854a541fc}" ; ---------- UIA_TreeWalker properties ---------- Condition[] { get { local out return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?new UIA_Condition(out): } } ; ---------- UIA_TreeWalker methods ---------- GetParentElement(e) { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } GetFirstChildElement(e) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } GetLastChildElement(e) { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } GetNextSiblingElement(e) { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } GetPreviousSiblingElement(e) { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } NormalizeElement(e) { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr",e.__Value, "ptr*",out:=""))? UIA_Element(out): } GetParentElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } GetFirstChildElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } GetLastChildElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } GetNextSiblingElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } GetPreviousSiblingElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } NormalizeElementBuildCache(e, cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr",e.__Value, "ptr",cacheRequest.__Value, "ptr*",out:=""))? UIA_Element(out): } } /* This is the primary interface for conditions used in filtering when searching for elements in the UI Automation tree. This interface has no members. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationcondition */ class UIA_Condition extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671420(v=vs.85).aspx static __IID := "{352ffba8-0973-437c-a61f-f64cafd81df9}" } /* Represents a condition based on a property value that is used to find UI Automation elements. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationpropertycondition */ class UIA_PropertyCondition extends UIA_Condition { static __IID := "{99ebf2cb-5578-4267-9ad4-afd6ea77e94b}" ; ---------- UIA_PropertyCondition properties ---------- PropertyId[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } PropertyValue[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } PropertyConditionFlags[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } } /* Exposes properties and methods that Microsoft UI Automation client applications can use to retrieve information about an AND-based property condition. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationandcondition */ class UIA_AndCondition extends UIA_Condition { static __IID := "{a7d0af36-b912-45fe-9855-091ddc174aec}" ; ---------- UIA_AndCondition properties ---------- ChildCount[] { get { local out return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } ;~ GetChildrenAsNativeArray 4 IUIAutomationCondition ***childArray GetChildren() { ; Returns a native AHK array containing all the conditions (already subtyped to AndCondition, OrCondition etc) local global UIA_AndCondition, UIA_OrCondition, UIA_BoolCondition, UIA_NotCondition, UIA_PropertyCondition ret := UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:="")), arr := [] if (out && (safeArray := ComObj(0x2003,out,1))) { for k in safeArray { obj := ComObject(9, k, 1), ObjAddRef(k) for _, n in ["Property", "Bool", "And", "Or", "Not"] { if ComObjQuery(obj, UIA_%n%Condition.__IID) { arr.Push(new UIA_%n%Condition(k)) break } } ObjRelease(k) } return arr } return } } /* Represents a condition made up of multiple conditions, at least one of which must be true. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationorcondition */ class UIA_OrCondition extends UIA_Condition { static __IID := "{8753f032-3db1-47b5-a1fc-6e34a266c712}" ; ---------- UIA_OrCondition properties ---------- ChildCount[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_OrCondition methods ---------- ;~ GetChildrenAsNativeArray 4 IUIAutomationCondition ***childArray GetChildren() { local global UIA_AndCondition, UIA_OrCondition, UIA_BoolCondition, UIA_NotCondition, UIA_PropertyCondition ret := UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:="")), arr := [] if (out && (safeArray := ComObject(0x2003,out,1))) { for k in safeArray { obj := ComObject(9, k, 1) ; ObjAddRef and ObjRelease probably aren't needed here, since ref count won't fall to 0 for _, n in ["Property", "Bool", "And", "Or", "Not"] { if ComObjQuery(obj, UIA_%n%Condition.__IID) { arr.Push(new UIA_%n%Condition(k,1)) break } } } return arr } return } } /* Represents a condition that can be either TRUE=1 (selects all elements) or FALSE=0(selects no elements). Microsoft documentation: */ class UIA_BoolCondition extends UIA_Condition { static __IID := "{1B4E1F2E-75EB-4D0B-8952-5A69988E2307}" ; ---------- UIA_BoolCondition properties ---------- BooleanValue[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } } /* Represents a condition that is the negative of another condition. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationnotcondition */ class UIA_NotCondition extends UIA_Condition { static __IID := "{f528b657-847b-498c-8896-d52b565407a1}" GetChild() { ; Type of the received condition can be determined with out.__Class local global UIA_AndCondition, UIA_OrCondition, UIA_BoolCondition, UIA_NotCondition, UIA_PropertyCondition ret := UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:="")), obj := ComObject(9, out, 1) for k, v in ["Bool", "Property", "And", "Or", "Not"] { if ComObjQuery(obj, UIA_%v%Condition.__IID) return ret?new UIA_%v%Condition(out): } return UIA_Hr(0x80004005) } } class UIA_IUnknown extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ms680509(v=vs.85).aspx static __IID := "{00000000-0000-0000-C000-000000000046}" } /* Exposes properties and methods of a cache request. Client applications use this interface to specify the properties and control patterns to be cached when a Microsoft UI Automation element is obtained. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationcacherequest */ class UIA_CacheRequest extends UIA_Base { static __IID := "{b32a92b5-bc25-4078-9c08-d7ee95c48e03}" ; ---------- UIA_CacheRequest properties ---------- TreeScope[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } set { UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr", value)) } } TreeFilter[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } set { UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr",value.__Value)) } } AutomationElementMode[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } set { UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr",value)) } } ; ---------- UIA_CacheRequest methods ---------- Clone() { local out return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:="")) ? new UIA_CacheRequest(out): } AddProperty(property) { if property is not integer property := UIA_Enum.UIA_PropertyId(property) return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",property)) } AddPattern(pattern) { if pattern is not integer pattern := UIA_Enum.UIA_PatternId(pattern) return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value,"ptr",pattern)) } } /* Exposes a method to handle Microsoft UI Automation events Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationeventhandler */ class _UIA_EventHandler extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696044(v=vs.85).aspx static __IID := "{146c3c17-f12e-4e22-8c27-f894b9b79c69}" HandleAutomationEvent(sender, eventId) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender), eventId) return 0 } } /* Exposes a method to handle events that are raised when the keyboard focus moves to another UI Automation element. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationfocuschangedeventhandler */ class _UIA_FocusChangedEventHandler extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696051(v=vs.85).aspx static __IID := "{c270f6b5-5c69-4290-9745-7a7f97169468}" HandleFocusChangedEvent(sender) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender)) return 0 } } /* Exposes a method to handle Microsoft UI Automation events that occur when a property is changed. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationpropertychangedeventhandler */ class _UIA_PropertyChangedEventHandler extends UIA_Base { ; UNTESTED ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696119(v=vs.85).aspx static __IID := "{40cd37d4-c756-4b0c-8c6f-bddfeeb13b50}" HandlePropertyChangedEvent(sender, propertyId, newValue) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender), propertyId, UIA_VariantData(newValue,0)) return 0 } } /* Exposes a method to handle events that occur when the Microsoft UI Automation tree structure is changed. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationstructurechangedeventhandler */ class _UIA_StructureChangedEventHandler extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696197(v=vs.85).aspx static __IID := "{e81d1b4e-11c5-42f8-9754-e7036c79f054}" HandleStructureChangedEvent(sender, changeType, runtimeId) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender), changeType, UIA_SafeArrayToAHKArray(ComObj(0x2003,runtimeId))) ; ComObj(0x2003,runtimeId,1) crashes the script. Should the SAFEARRAY be released manually? return 0 } } /* Exposes a method to handle events that occur when Microsoft UI Automation reports a text-changed event from text edit controls Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtextedittextchangedeventhandler */ class _UIA_TextEditTextChangedEventHandler extends UIA_Base { ; UNTESTED ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/dn302202(v=vs.85).aspx static __IID := "{92FAA680-E704-4156-931A-E32D5BB38F3F}" HandleTextEditTextChangedEvent(sender, changeType, eventStrings) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender), changeType, UIA_SafeArrayToAHKArray(ComObj(0x2008,eventStrings))) return 0 } } /* Exposes a method to handle one or more Microsoft UI Automation change events Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationchangeseventhandler */ class _UIA_ChangesEventHandler extends UIA_Base { ; UNTESTED static __IID := "{58EDCA55-2C3E-4980-B1B9-56C17F27A2A0}" HandleChangesEvent(sender, uiaChanges, changesCount) { local param1, funcName, changes param1 := this, this := Object(A_EventInfo), funcName := this.__Version, changes := {} changes.uiaId := NumGet(uiaChanges,, 0), changes.payload := UIA_VariantData(uiaChanges,, 8), changes.extraInfo := UIA_VariantData(uiaChanges,,16+2*A_PtrSize) %funcName%(UIA_Element(sender), changes, changesCount) return 0 } } /* Exposes a method to handle Microsoft UI Automation notification events Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationnotificationeventhandler */ class _UIA_NotificationEventHandler extends UIA_Base { static __IID := "{C7CB2637-E6C2-4D0C-85DE-4948C02175C7}" HandleNotificationEvent(sender, notificationKind, notificationProcessing, displayString, activityId) { local param1, funcName param1 := this, this := Object(A_EventInfo), funcName := this.__Version %funcName%(UIA_Element(sender), notificationKind, notificationProcessing, StrGet(displayString), StrGet(activityId)) DllCall("oleaut32\SysFreeString", "ptr", displayString), DllCall("oleaut32\SysFreeString", "ptr", activityId) return 0 } } class UIA_AutomationEventHandlerGroup extends UIA_Base { static __IID := "{C9EE12F2-C13B-4408-997C-639914377F4E}" AddActiveTextPositionChangedEventHandler(scope:=0x4, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int", scope, "int", cacheRequest.__Value, "ptr", handler.__Value)) } AddAutomationEventHandler(eventId, scope:=0x4, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "uint", eventId, "uint", scope, "ptr",cacheRequest.__Value,"ptr", handler.__Value)) } AddChangesEventHandler(scope, changeTypes, changesCount, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "int", scope, "int", changeTypes, "int", changesCount, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } AddNotificationEventHandler(scope:=0x4, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "int", scope, "int", cacheRequest.__Value, "ptr", handler.__Value)) } AddPropertyChangedEventHandler(scope:=0x1,cacheRequest:=0,handler:="",propertyArray:="") { local SafeArray:=ComObjArray(0x3,propertyArray.MaxIndex()) for i,propertyId in propertyArray SafeArray[i-1]:=propertyId return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "int",scope, "ptr",cacheRequest.__Value,"ptr",handler.__Value,"ptr",ComObjValue(SafeArray))) } AddStructureChangedEventHandler(scope:=0x4, cacheRequest:=0, handler:="") { ; UNTESTED. return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "int", scope, "ptr",cacheRequest.__Value, "ptr", handler.__Value)) } AddTextEditTextChangedEventHandler(scope, textEditChangeType, cacheRequest:=0, handler:="") { return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "int", scope, "int", textEditChangeType, "ptr", cacheRequest.__Value, "ptr", handler.__Value)) } } /* Provides access to a control that enables child elements to be arranged horizontally and vertically, relative to each other. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationdockpattern */ class UIA_DockPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee671421 static __IID := "{fde5ef97-1464-48f6-90bf-43d0948e86ec}" , __PatternID := 10011 ; ---------- UIA_DockPattern properties ---------- CurrentDockPosition[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedDockPosition[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_DockPattern methods ---------- SetDockPosition(Pos) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",pos)) } /* DockPosition_Top = 0, DockPosition_Left = 1, DockPosition_Bottom = 2, DockPosition_Right = 3, DockPosition_Fill = 4, DockPosition_None = 5 */ } /* Provides access to a control that can visually expand to display content, and collapse to hide content. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationexpandcollapsepattern */ class UIA_ExpandCollapsePattern extends UIA_Base { static __IID := "{619be086-1f4e-4ee4-bafa-210128738730}" , __PatternID := 10005 ; ---------- UIA_ExpandCollapsePattern properties ---------- CachedExpandCollapseState[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentExpandCollapseState[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_ExpandCollapsePattern methods ---------- Expand() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } Collapse() { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value)) } /* ExpandCollapseState_Collapsed = 0, ExpandCollapseState_Expanded = 1, ExpandCollapseState_PartiallyExpanded = 2, ExpandCollapseState_LeafNode = 3 */ } /* Provides access to a child control in a grid-style container that supports the IUIAutomationGridPattern interface. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationgriditempattern */ class UIA_GridItemPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696053 static __IID := "{78f8ef57-66c3-4e09-bd7c-e79b2004894d}" , __PatternID := 10007 ; ---------- UIA_GridItemPattern properties ---------- CurrentContainingGrid[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CurrentRow[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentColumn[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentRowSpan[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentColumnSpan[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedContainingGrid[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedRow[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedColumn[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedRowSpan[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedColumnSpan[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?out: } } } /* Provides access to a control that acts as a container for a collection of child controls that are organized in a two-dimensional logical coordinate system that can be traversed by row and column. The children of this element support the GridItemPattern interface. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationgridpattern */ class UIA_GridPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696064 static __IID := "{414c3cdc-856b-4f5b-8538-3131c6302550}" , __PatternID := 10006 ; ---------- UIA_GridPattern properties ---------- CurrentRowCount[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentColumnCount[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedRowCount[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedColumnCount[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_GridPattern methods ---------- GetItem(row,column) { ; Hr!=0 if no result, or blank output? local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",row, "uint",column, "ptr*",out:=""))? UIA_Element(out): } } /* Exposes a method that enables a client application to invoke the action of a control (typically a button). A control should support this interface if it initiates or performs a single, unambiguous action and does not maintain state when activated. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationinvokepattern */ class UIA_InvokePattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696070 static __IID := "{fb377fbe-8ea6-46d5-9c73-6499642d3059}" , __PatternID := 10000 Invoke() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } } /* Exposes a method that retrieves an item from a container, such as a virtual list. This interface is not limited to use by virtualized containers. Any container that can implement efficient name lookup can support this control pattern, enabling clients to look up names more quickly than by using methods such as FindFirst, which must traverse the Microsoft UI Automation tree. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationitemcontainerpattern */ class UIA_ItemContainerPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696072 static __IID := "{c690fdb2-27a8-423c-812d-429773c9084e}" , __PatternID := 10019 FindItemByProperty(startAfter, propertyId, ByRef value, type:=8) { ; Hr!=0 if no result, or blank output? local var := UIA_ComVar(type,value) return UIA_Hr((A_PtrSize == 4) ? DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",startAfter.__Value, "int",propertyId, "int64",NumGet(var.ptr+0, 0, "int64"),"int64",NumGet(var.ptr+0, 8, "int64"), "ptr*",out:="") : DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",startAfter.__Value, "int",propertyId, "ptr",var.ptr+0, "ptr*",out:=""))? UIA_Element(out): } } /* Exposes methods and properties that enable Microsoft UI Automation clients to retrieve UI information from Microsoft Active Accessibility (MSAA) servers. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationlegacyiaccessiblepattern */ class UIA_LegacyIAccessiblePattern extends UIA_Base { static __IID := "{828055ad-355b-4435-86d5-3b51c14a9b1b}" , __PatternID := 10018 ; ---------- UIA_LegacyIAccessiblePattern properties ---------- CurrentChildId[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentName[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentValue[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } set { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",&value)) } } CurrentDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentRole[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentState[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentHelp[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentKeyboardShortcut[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentDefaultAction[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedChildId[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedName[] { get { local return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedValue[] { get { local return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedDescription[] { get { local return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedRole[] { get { local return UIA_Hr(DllCall(this.__Vt(20), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedState[] { get { local return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedHelp[] { get { local return UIA_Hr(DllCall(this.__Vt(22), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedKeyboardShortcut[] { get { local return UIA_Hr(DllCall(this.__Vt(23), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedDefaultAction[] { get { local return UIA_Hr(DllCall(this.__Vt(25), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } ; ---------- UIA_LegacyIAccessiblePattern methods ---------- Select(flags:=3) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int",flags)) } DoDefaultAction() { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value)) } SetValue(value) { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",&value)) } GetCurrentSelection() { ; UNTESTED local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))? UIA_ElementArray(out): } ;~ GetCachedSelection 24 IUIAutomationElementArray GetIAccessible() { /* This method returns NULL if the underlying implementation of the UI Automation element is not a native Microsoft Active Accessibility server; that is, if a client attempts to retrieve the IAccessible interface for an element originally supported by a proxy object from OLEACC.dll, or by the UIA-to-MSAA Bridge. */ local return UIA_Hr(DllCall(this.__Vt(26), "ptr",this.__Value, "ptr*",pacc:=""))&&pacc? ComObj(9,pacc,1): } } /* Provides access to a control that can switch between multiple representations of the same information or set of child controls. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationmultipleviewpattern */ class UIA_MultipleViewPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696099 static __IID := "{8d253c91-1dc5-4bb5-b18f-ade16fa495e8}" , __PatternID := 10008 ; ---------- UIA_MultipleViewPattern properties ---------- CurrentCurrentView[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCurrentView[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_MultipleViewPattern methods ---------- GetViewName(view) { ; need to release BSTR? local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int",view, "ptr*",out:=""))? StrGet(out) (DllCall("oleaut32\SysFreeString", "ptr", out)?"":""): } SetCurrentView(view) { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",view)) } GetCurrentSupportedViews() { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))? UIA_SafeArrayToAHKArray(ComObj(0x2003,out,1)): } GetCachedSupportedViews() { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))? UIA_SafeArrayToAHKArray(ComObj(0x2003,out,1)): } } /* Provides access to a control that presents a range of values. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationrangevaluepattern */ class UIA_RangeValuePattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696147 static __IID := "{59213f4f-7346-49e5-b120-80555987a148}" , __PatternID := 10003 ; ---------- UIA_RangeValuePattern properties ---------- CurrentValue[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "Double*",out:=""))?out: } set { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "double",value)) } } CurrentIsReadOnly[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentMaximum[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "Double*",out:=""))?out: } } CurrentMinimum[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentLargeChange[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentSmallChange[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "double*",out:=""))?out: } } CachedValue[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "double*",out:=""))?out: } } CachedIsReadOnly[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedMaximum[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "double*",out:=""))?out: } } CachedMinimum[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "double*",out:=""))?out: } } CachedLargeChange[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "double*",out:=""))?out: } } CachedSmallChange[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "double*",out:=""))?out: } } ; ---------- UIA_RangeValuePattern methods ---------- SetValue(val) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "double",val)) } } /* Exposes a method that enables an item in a scrollable view to be placed in a visible portion of the view. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationscrollitempattern */ class UIA_ScrollItemPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696165 static __IID := "{b488300f-d015-4f19-9c29-bb595e3645ef}" , __PatternID := 10017 ScrollIntoView() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } } /* Provides access to a control that acts as a scrollable container for a collection of child elements. The children of this element support IUIAutomationScrollItemPattern. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationscrollpattern */ class UIA_ScrollPattern extends UIA_Base { ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/ee696167 static __IID := "{88f4d42a-e881-459d-a77c-73bbbb7e02dc}" , __PatternID := 10004 ; ---------- UIA_ScrollPattern properties ---------- CurrentHorizontalScrollPercent[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentVerticalScrollPercent[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentHorizontalViewSize[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentVerticalViewSize[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentHorizontallyScrollable[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentVerticallyScrollable[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedHorizontalScrollPercent[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "double*",out:=""))?out: } } CachedVerticalScrollPercent[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "double*",out:=""))?out: } } CachedHorizontalViewSize[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "double*",out:=""))?out: } } CachedVerticalViewSize[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "double*",out:=""))?out: } } CachedHorizontallyScrollable[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedVerticallyScrollable[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_ScrollPattern methods ---------- Scroll(horizontal:=-1, vertical:=-1) { ; Default is ScrollAmount_NoAmount return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "uint",horizontal, "uint",vertical)) } SetScrollPercent(horizontal:=-1, vertical:=-1) { ; Default is ScrollAmount_NoAmount return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "double",horizontal, "double",vertical)) } /* UIA_ScrollPatternNoScroll = -1 ScrollAmount_LargeDecrement = 0, ScrollAmount_SmallDecrement = 1, ScrollAmount_NoAmount = 2, ScrollAmount_LargeIncrement = 3, ScrollAmount_SmallIncrement = 4 */ } /* Provides access to the selectable child items of a container control that supports SelectionPattern Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationselectionitempattern */ class UIA_SelectionItemPattern extends UIA_Base { ; UNTESTED static __IID := "{A8EFA66A-0FDA-421A-9194-38021F3578EA}" , __PatternID := 10010 ; ---------- UIA_SelectionItemPattern properties ---------- CurrentIsSelected[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentSelectionContainer[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedIsSelected[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedSelectionContainer[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } ; ---------- UIA_SelectionItemPattern methods ---------- Select() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } AddToSelection() { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value)) } RemoveFromSelection() { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value)) } } /* Provides access to a control that contains selectable child items. The children of this element support SelectionItemPattern. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationselectionpattern */ class UIA_SelectionPattern extends UIA_Base { static __IID := "{5ED5202E-B2AC-47A6-B638-4B0BF140D78E}" , __PatternID := 10001 ; ---------- UIA_SelectionPattern properties ---------- CurrentCanSelectMultiple[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsSelectionRequired[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanSelectMultiple[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsSelectionRequired[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_SelectionPattern methods ---------- GetCurrentSelection() { ; Returns an array of selected elements local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedSelection() { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } class UIA_SelectionPattern2 extends UIA_SelectionPattern { ; UNTESTED static __IID := "{0532bfae-c011-4e32-a343-6d642d798555}" , __PatternID := 10034 ; ---------- UIA_SelectionPattern2 properties ---------- CurrentFirstSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CurrentLastSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CurrentCurrentSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CurrentItemCount[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedFirstSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedLastSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedCurrentSelectedItem[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedItemCount[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?out: } } } /* Enables a client application to retrieve information about an item (cell) in a spreadsheet. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationspreadsheetitempattern */ class UIA_SpreadsheetItemPattern extends UIA_Base { ; UNTESTED static __IID := "{7D4FB86C-8D34-40E1-8E83-62C15204E335}" , __PatternID := 10027 ; ---------- UIA_SpreadsheetItemPattern properties ---------- CurrentFormula[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedFormula[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } ; ---------- UIA_SpreadsheetItemPattern methods ---------- GetCurrentAnnotationObjects() { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCurrentAnnotationTypes() { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr", UIA_Variant(out:="")))?UIA_VariantData(out):UIA_VariantClear(out) } GetCachedAnnotationObjects() { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedAnnotationTypes() { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr", UIA_Variant(out:="")))?UIA_VariantData(out):UIA_VariantClear(out) } } /* Enables a client application to access the items (cells) in a spreadsheet Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationspreadsheetpattern */ class UIA_SpreadsheetPattern extends UIA_Base { ; UNTESTED static __IID := "{7517A7C8-FAAE-4DE9-9F08-29B91E8595C1}" , __PatternID := 10026 GetItemByName(name) { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr", &name, "ptr*",out:=""))? UIA_Element(out): } } /* Enables Microsoft UI Automation clients to retrieve the visual styles associated with an element in a document. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationstylespattern */ class UIA_StylesPattern extends UIA_Base { ; UNTESTED static __IID := "{85B5F0A2-BD79-484A-AD2B-388C9838D5FB}" , __PatternID := 10025 ; ---------- UIA_StylesPattern properties ---------- CurrentStyleId[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentStyleName[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentFillColor[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentFillPatternStyle[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentShape[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentFillPatternColor[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentExtendedProperties[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedStyleId[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedStyleName[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedFillColor[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedFillPatternStyle[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedShape[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedFillPatternColor[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedExtendedProperties[] { get { local return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_StylesPattern methods ---------- GetCurrentExtendedPropertiesAsArray(byref propertyCount) { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*", propertyArray:="", "int*", propertyCount:=""))?UIA_SafeArrayToAHKArray(ComObj(0x2003,propertyArray,1)): } GetCachedExtendedPropertiesAsArray(byref propertyCount) { local return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value, "ptr*", propertyArray:="", "int*", propertyCount:=""))?UIA_SafeArrayToAHKArray(ComObj(0x2003,propertyArray,1)): } } /* Provides access to the keyboard or mouse input of a control. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationsynchronizedinputpattern */ class UIA_SynchronizedInputPattern extends UIA_Base { ; UNTESTED static __IID := "{2233BE0B-AFB7-448B-9FDA-3B378AA5EAE1}" , __PatternID := 10021 StartListening(inputType) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int",inputType)) } Cancel() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } } /* Provides access to a child element in a container that supports TablePattern Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtableitempattern */ class UIA_TableItemPattern extends UIA_Base { static __IID := "{0B964EB3-EF2E-4464-9C79-61D61737A27E}" , __PatternID := 10013 GetCurrentRowHeaderItems() { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCurrentColumnHeaderItems() { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedRowHeaderItems() { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedColumnHeaderItems() { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } /* Provides access to a control that acts as a container for a collection of child elements. The children of this element support TableItemPattern and are organized in a two-dimensional logical coordinate system that can be traversed by row and column. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtablepattern */ class UIA_TablePattern extends UIA_Base { static __IID := "{620E691C-EA96-4710-A850-754B24CE2417}" , __PatternID := 10012 ; ---------- UIA_TablePattern properties ---------- CurrentRowOrColumnMajor[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedRowOrColumnMajor[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_TablePattern methods ---------- GetCurrentRowHeaders() { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCurrentColumnHeaders() { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedRowHeaders() { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedColumnHeaders() { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } /* Provides access to a control that contains text. Note that TextPattern nor TextRange can't be used to change the text itself, only to get information about the text or select text. To change the text, UIA_Element.SetValue(val) can be used. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtextpattern */ class UIA_TextPattern extends UIA_Base { static __IID := "{32EBA289-3583-42C9-9C59-3B6D9A1E9B6A}" , __PatternID := 10014 ; ---------- UIA_TextPattern properties ---------- ; DocumentRange returns a TextRange that encloses the main text of a document. DocumentRange[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRange(out): } } SupportedTextSelection[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_TextPattern methods ---------- ; Retrieves an empty TextRange nearest to the specified screen coordinates RangeFromPoint(x, y) { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "int64",x&0xFFFFFFFF|y<<32, "ptr*",out:=""))?UIA_TextRange(out): } ; Retrieves a text range enclosing a child element such as an image, hyperlink, Microsoft Excel spreadsheet, or other embedded object. RangeFromChild(child) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr",child.__Value, "ptr*",out:=""))?UIA_TextRange(out): } ; Returns the currently selected text GetSelection() { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRangeArray(out): } ; Retrieves an array of disjoint text ranges from a text-based control where each text range represents a contiguous span of visible text GetVisibleRanges() { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRangeArray(out): } } class UIA_TextPattern2 extends UIA_TextPattern { static __IID := "{506A921A-FCC9-409F-B23B-37EB74106872}" , __PatternID := 10024 RangeFromAnnotation(annotation) { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr", annotation.__Value, "ptr*",out:=""))?UIA_TextRange(out): } GetCaretRange(ByRef isActive:="") { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*", isActive, "ptr*",out:=""))?UIA_TextRange(out): } } /* Provides access to a control that modifies text, for example a control that performs auto-correction or enables input composition through an Input Method Editor (IME). Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtexteditpattern */ class UIA_TextEditPattern extends UIA_TextPattern { ; UNTESTED static __IID := "{17E21576-996C-4870-99D9-BFF323380C06}" , __PatternID := 10032 GetActiveComposition() { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRange(out): } GetConversionTarget() { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRange(out): } } /* Provides access a text-based control (or an object embedded in text) that is a child or descendant of another text-based control. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtextchildpattern */ class UIA_TextChildPattern extends UIA_Base { ; UNTESTED static __IID := "{6552B038-AE05-40C8-ABFD-AA08352AAB86}" , __PatternID := 10029 ; ---------- UIA_TextChildPattern properties ---------- TextContainer[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } TextRange[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRange(out): } } } /* Provides access to a control that can cycle through a set of states, and maintain a state after it is set. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtogglepattern */ class UIA_TogglePattern extends UIA_Base { ; https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtogglepattern static __IID := "{94cf8058-9b8d-4ab9-8bfd-4cd0a33c8c70}" , __PatternID := 10015 ; ---------- UIA_TogglePattern properties ---------- CurrentToggleState[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } set { ; Custom if (this.CurrentToggleState != value) this.Toggle() } } CachedToggleState[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_TogglePattern methods ---------- Toggle() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } } /* Provides access to a control that can be moved, resized, or rotated. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtransformpattern */ class UIA_TransformPattern extends UIA_Base { static __IID := "{A9B55844-A55D-4EF0-926D-569C16FF89BB}" , __PatternID := 10016 ; ---------- UIA_TransformPattern properties ---------- CurrentCanMove[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentCanResize[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentCanRotate[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanMove[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanResize[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanRotate[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_TransformPattern methods ---------- Move(x, y) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "double",x, "double",y)) } Resize(w, h) { return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "double",w, "double",h)) } Rotate(degrees) { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "double",degrees)) } } class UIA_TransformPattern2 extends UIA_TransformPattern { ; UNTESTED static __IID := "{6D74D017-6ECB-4381-B38B-3C17A48FF1C2}" , __PatternID := 10028 ; ---------- UIA_TransformPattern2 properties ---------- CurrentCanZoom[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanZoom[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentZoomLevel[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "double*",out:=""))?out: } } CachedZoomLevel[] { get { local return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentZoomMinimum[] { get { local return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value, "double*",out:=""))?out: } } CachedZoomMinimum[] { get { local return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value, "double*",out:=""))?out: } } CurrentZoomMaximum[] { get { local return UIA_Hr(DllCall(this.__Vt(20), "ptr",this.__Value, "double*",out:=""))?out: } } CachedZoomMaximum[] { get { local return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value, "double*",out:=""))?out: } } ; ---------- UIA_TransformPattern2 methods ---------- Zoom(zoomValue) { return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "double",zoomValue)) } ZoomByUnit(ZoomUnit) { return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "uint",ZoomUnit)) } } /* Provides access to a control that presents a range of values. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationvaluepattern */ class UIA_ValuePattern extends UIA_Base { static __IID := "{A94CD8B1-0844-4CD6-9D2D-640537AB39E9}" , __PatternID := 10002 ; ---------- UIA_ValuePattern properties ---------- CurrentValue[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } set { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",&value)) } } CurrentIsReadOnly[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedValue[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedIsReadOnly[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_ValuePattern methods ---------- SetValue(val) { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr",&val)) } } /* Represents a virtualized item, which is an item that is represented by a placeholder automation element in the Microsoft UI Automation tree. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationvirtualizeditempattern */ class UIA_VirtualizedItemPattern extends UIA_Base { static __IID := "{6BA3D7A6-04CF-4F11-8793-A8D1CDE9969F}" , __PatternID := 10020 Realize() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } } /* Provides access to the fundamental functionality of a window. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationwindowpattern */ class UIA_WindowPattern extends UIA_Base { static __IID := "{0FAEF453-9208-43EF-BBB2-3B485177864F}" , __PatternID := 10009 ; ---------- UIA_WindowPattern properties ---------- CurrentCanMaximize[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentCanMinimize[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsModal[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentIsTopmost[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentWindowVisualState[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentWindowInteractionState[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanMaximize[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedCanMinimize[] { get { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsModal[] { get { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsTopmost[] { get { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedWindowVisualState[] { get { local return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedWindowInteractionState[] { get { local return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_WindowPattern methods ---------- Close() { return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value)) } WaitForInputIdle(milliseconds) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",milliseconds, "Int*", out:=""))?out: } SetWindowVisualState(state) { return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "int",state)) } } /* Provides access to the properties of an annotation in a document. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationannotationpattern */ class UIA_AnnotationPattern extends UIA_Base { static __IID := "{9A175B21-339E-41B1-8E8B-623F6B681098}" , __PatternID := 10023 ; ---------- UIA_AnnotationPattern properties ---------- CurrentAnnotationTypeId[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentAnnotationTypeName[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentAuthor[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentDateTime[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentTarget[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } CachedAnnotationTypeId[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedAnnotationTypeName[] { get { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedAuthor[] { get { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedDateTime[] { get { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedTarget[] { get { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value, "ptr*",out:=""))?UIA_Element(out): } } } /* Provides access to information exposed by a UI Automation provider for an element that can be dragged as part of a drag-and-drop operation. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationdragpattern */ class UIA_DragPattern extends UIA_Base { ; UNTESTED, couldn't find a window that supported this static __IID := "{1DC7B570-1F54-4BAD-BCDA-D36A722FB7BD}" , __PatternID := 10030 ; ---------- UIA_DragPattern properties ---------- CurrentIsGrabbed[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } CachedIsGrabbed[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?out: } } CurrentDropEffect[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedDropEffect[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentDropEffects[] { get { local return UIA_Hr(DllCall(this.__Vt(7), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } CachedDropEffects[] { get { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } ; ---------- UIA_DragPattern methods ---------- GetCurrentGrabbedItems() { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetCachedGrabbedItems() { local return UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } } /* Provides access to drag-and-drop information exposed by a Microsoft UI Automation provider for an element that can be the drop target of a drag-and-drop operation. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationdroptargetpattern */ class UIA_DropTargetPattern extends UIA_Base { ; UNTESTED static __IID := "{69A095F7-EEE4-430E-A46B-FB73B1AE39A5}" , __PatternID := 10031 ; ---------- UIA_DropTargetPattern properties ---------- CurrentDropTargetEffect[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CachedDropTargetEffect[] { get { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "ptr*",out:=""))?UIA_GetBSTRValue(out): } } CurrentDropTargetEffects[] { get { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } CachedDropTargetEffects[] { get { local return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value, "ptr",UIA_Variant(out:="")))&&out?UIA_VariantData(out):UIA_VariantClear(out) } } } /* Provides access to the underlying object model implemented by a control or application. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationobjectmodelpattern */ class UIA_ObjectModelPattern extends UIA_Base { ; Windows 8 [desktop apps only] ;~ http://msdn.microsoft.com/en-us/library/windows/desktop/hh437262(v=vs.85).aspx static __IID := "{71c284b3-c14d-4d14-981e-19751b0d756d}" , __PatternID := 10022 GetUnderlyingObjectModel() { ; UNTESTED. Returns IUnknown interface used to access the underlying object model of the provider. local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } ;~ class UIA_PatternHandler extends UIA_Base { ;~ class UIA_PatternInstance extends UIA_Base { /* Provides access to a span of continuous text in a container that supports the TextPattern interface. TextRange can be used to select, compare, and retrieve embedded objects from the text span. The interface uses two endpoints to delimit where the text span starts and ends. Disjoint spans of text are represented by a TextRangeArray, which is an array of TextRange interfaces. Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtextrange */ class UIA_TextRange extends UIA_Base { static __IID := "{A543CC6A-F4AE-494B-8239-C814481187A8}" ; Returns a copy of the TextRange (retrieves a new IUIAutomationTextRange identical to the original and inheriting all properties of the original). Clone() { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?UIA_TextRange(out): } ; Compares whether this TextRange has the same endpoints as comparisonTextRange Compare(comparisonTextRange) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value,"ptr",comparisonTextRange.__Value, "ptr*",out:=""))?out: } ; Retrieves a value that specifies whether the start or end endpoint of this text range is the same as the start or end endpoint of comparisonTextRange. Returns a negative value if the caller's endpoint occurs earlier in the text than the target endpoint; 0 if the caller's endpoint is at the same location as the target endpoint; or a positive value if the caller's endpoint occurs later in the text than the target endpoint. srcEndPoint and targetEndPoint need to be TextPatternRangeEndpoint enums. CompareEndPoints(srcEndPoint, comparisonTextRange, targetEndPoint) { local return UIA_Hr(DllCall(this.__Vt(5), "ptr",this.__Value,"int", srcEndPoint,"ptr",comparisonTextRange.__Value, "int", targetEndPoint,"ptr*",out:=""))?out: } ; Normalizes the text range by the specified text unit. The range is expanded if it is smaller than the specified unit, or shortened if it is longer than the specified unit. unit needs to be a TextUnit enum (default is TextUnit_Document == 6) ExpandToEnclosingUnit(unit:=6) { return UIA_Hr(DllCall(this.__Vt(6), "ptr",this.__Value,"int",unit)) } ; Retrieves a text range subset that has the specified text attribute value. attr needs to be a UIA_TextAttributeId enum, and val the desired value (some can be strings, others text attribute enums such as BulletStyle enum) FindAttribute(attr, val, backward:=False) { local var, out if attr is not integer attr := UIA_Enum.UIA_AttributeId(attr) var := UIA_ComVar(UIA_Enum.UIA_AttributeVariantType(attr), val) return UIA_Hr((A_PtrSize == 4) ? DllCall(this.__Vt(7), "ptr",this.__Value,"int",attr,"int64",NumGet(var.ptr+0, 0, "int64"),"int64",NumGet(var.ptr+0, 8, "int64"),"int",backward, "ptr*",out:="") : DllCall(this.__Vt(7), "ptr",this.__Value,"int",attr,"ptr",var.ptr,"int",backward,"ptr*",out:=""))?UIA_TextRange(out): } ; Retrieves a text range subset that contains the specified text. FindText(text, backward:=False, ignoreCase:=False) { local return UIA_Hr(DllCall(this.__Vt(8), "ptr",this.__Value,"ptr", &text,"int",backward, "int", ignoreCase,"ptr*",out:=""))?UIA_TextRange(out): } ; Retrieves the value of the specified text attribute across the entire text range. attr needs to be a UIA_TextAttributeId enum. GetAttributeValue(attr) { local return UIA_Hr(DllCall(this.__Vt(9), "ptr",this.__Value,"int", attr,"ptr",UIA_Variant(out:="")))?UIA_VariantData(out):UIA_VariantClear(out) } ; Returns an array of bounding rectangle objects {x:top left X-coord,y:top left Y-coord,w:width,h:height} for each fully or partially visible line of text in a text range. GetBoundingRectangles() { local static b:={__Class:"object",__Type:"RECT",Struct:Func("UIA_RectStructure")} if UIA_Hr(DllCall(this.__Vt(10), "ptr",this.__Value,"ptr*",out:="")) { DllCall("oleaut32\SafeArrayGetVartype", "ptr", out, "ushort*", baseType:="") sa := UIA_GetSafeArrayValue(out, baseType), retArr := [] Loop, % sa.MaxIndex() / 4 retArr.Push({x:Floor(sa[4*(A_Index-1)+1]),y:Floor(sa[4*(A_Index-1)+2]),w:Floor(sa[4*(A_Index-1)+3]),h:Floor(sa[4*(A_Index-1)+4]),base:b}) return retArr } } ; Returns the innermost UI Automation element that encloses the text range. GetEnclosingElement() { local return UIA_Hr(DllCall(this.__Vt(11), "ptr",this.__Value,"ptr*",out:=""))?UIA_Element(out): } ; Returns the plain text of the text range. maxLength is the maximum length of the string to return, or -1 if no limit is required. GetText(maxLength:=-1) { local return UIA_Hr(DllCall(this.__Vt(12), "ptr",this.__Value,"int", maxLength,"ptr*",out:=""))?StrGet(out) (DllCall("oleaut32\SysFreeString", "ptr", out)?"":""): } ; Moves the text range forward or backward by the specified number of text units. unit needs to be a TextUnit enum. Move(unit, count) { local return UIA_Hr(DllCall(this.__Vt(13), "ptr",this.__Value,"int", unit,"int",count, "ptr*",out:=""))?out: } ; Moves one endpoint of the text range the specified number of text units within the document range. endpoint needs to be TextPatternRangeEndpoint enum. unit needs to be a TextUnit enum. MoveEndpointByUnit(endpoint, unit, count) { local return UIA_Hr(DllCall(this.__Vt(14), "ptr",this.__Value,"int", endpoint,"int", unit, "int", count, "ptr*",out:=""))?out: } ; Moves one endpoint of the current text range to the specified endpoint of a second text range. srcEndPoint and targetEndPoint need to be TextPatternRangeEndpoint enums. MoveEndpointByRange(srcEndPoint, range, targetEndPoint) { local return UIA_Hr(DllCall(this.__Vt(15), "ptr",this.__Value,"int", srcEndPoint,"ptr",range.__Value, "int", targetEndPoint,"ptr*",out:="")) } ; Selects the span of text that corresponds to this text range, and removes any previous selection. Select() { return UIA_Hr(DllCall(this.__Vt(16), "ptr",this.__Value)) } ; Adds the text range to the collection of selected text ranges in a control that supports multiple, disjoint spans of selected text. AddToSelection() { return UIA_Hr(DllCall(this.__Vt(17), "ptr",this.__Value)) } ; Removes the text range from an existing collection of selected text in a text container that supports multiple, disjoint selections. RemoveFromSelection() { return UIA_Hr(DllCall(this.__Vt(18), "ptr",this.__Value)) } ; Causes the text control to scroll until the text range is visible in the viewport. alignToTop is a boolean value. ScrollIntoView(alignToTop) { local return UIA_Hr(DllCall(this.__Vt(19), "ptr",this.__Value,"int", alignToTop)) } ; Retrieves a collection of all embedded objects that fall within the text range. GetChildren() { local return UIA_Hr(DllCall(this.__Vt(20), "ptr",this.__Value,"ptr*",out:=""))?UIA_ElementArray(out): } } class UIA_TextRange2 extends UIA_TextRange { static __IID := "{BB9B40E0-5E04-46BD-9BE0-4B601B9AFAD4}" ShowContextMenu() { local return UIA_Hr(DllCall(this.__Vt(21), "ptr",this.__Value,"ptr*",out:="")) } } class UIA_TextRange3 extends UIA_TextRange2 { ; UNTESTED static __IID := "{6A315D69-5512-4C2E-85F0-53FCE6DD4BC2}" GetEnclosingElementBuildCache(cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(22), "Ptr", this.__Value, "Ptr", cacheRequest.__Value, "ptr*",out:=""))?UIA_Element(out): } GetChildrenBuildCache(cacheRequest) { local return UIA_Hr(DllCall(this.__Vt(23), "Ptr", this.__Value, "Ptr", cacheRequest.__Value, "ptr*",out:=""))?UIA_ElementArray(out): } GetAttributeValues(attributeIds, attributeIdCount) { ; currently returns a AHK array local if ComObjValue(attributeIds)&0x2000 SafeArray:=attributeIds else { SafeArray:=ComObj(0x2003,DllCall("oleaut32\SafeArrayCreateVector", "uint",13, "uint",0, "uint",attributeIds.MaxIndex()),1) for i,c in attributeIds SafeArray[A_Index-1]:=c.__Value, ObjAddRef(c.__Value) ; AddRef - SafeArrayDestroy will release UIA_Conditions - they also release themselves } return UIA_Hr(DllCall(this.__Vt(24), "ptr",this.__Value, "ptr", ComObjValue(SafeArray), "int", attributeIdCount, "ptr*",out:=""))? UIA_SafeArrayToAHKArray(ComObj(0x2003,out,1)): } } /* Represents a collection (array) of TextRange objects Microsoft documentation: https://docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomationtextrangearray */ class UIA_TextRangeArray extends UIA_Base { static __IID := "{CE4AE76A-E717-4C98-81EA-47371D028EB6}" ; ---------- UIA_TextRangeArray properties ---------- Length[] { get { local return UIA_Hr(DllCall(this.__Vt(3), "ptr",this.__Value, "ptr*",out:=""))?out: } } ; ---------- UIA_TextRangeArray methods ---------- GetElement(i) { local return UIA_Hr(DllCall(this.__Vt(4), "ptr",this.__Value, "int",i, "ptr*",out:=""))?UIA_TextRange(out): } } ;~ UIA Functions /* UIAInterface function initializes the UIAutomation interface and returns a UIA_Interface object. After calling this function, all UIA_Interface class properties and methods can be accessed through the returned object. maxVersion can be used to limit the UIA_Interface version being created. By default the highest version available is used (usually IUIAutomation7 interface). Specifiying maxVersion:=2 would try to initialize IUIAutomation2 interface, and if that fails then IUIAutomation interface. In addition some extra variables are initialized: CurrentVersion contains the version number of IUIAutomation interface TrueCondition contains a UIA_TrueCondition TreeWalkerTrue contains an UIA_TreeWalker that was created with UIA_TrueCondition On subsequent calls of UIA_Interface(), the previously created UIA interface object is returned to avoid multiple connections being made. To bypass this, specify a maxVersion Note that a new UIA_Interface object can't be created with the "new" keyword. */ UIA_Interface(maxVersion:="", activateScreenReader:=1) { local max, uiaBase, e static uia := "", cleanup := "" if (IsObject(uia) && (maxVersion == "")) return uia if (!IsObject(cleanup)) cleanup := new UIA_Cleanup(activateScreenReader) ; enable screenreader flag if disabled max := (maxVersion?maxVersion:UIA_Enum.UIA_MaxVersion_Interface)+1 while (--max) { if (!IsObject(UIA_Interface%max%) || (max == 1)) continue try { if uia:=ComObjCreate("{e22ad333-b25f-460c-83d0-0581107395c9}",UIA_Interface%max%.__IID) { uia:=new UIA_Interface%max%(uia, 1, max), uiaBase := uia.base Loop, %max% uiaBase := uiaBase.base uiaBase.__UIA:=uia, uiaBase.TrueCondition:=uia.CreateTrueCondition(), uiaBase.TreeWalkerTrue := uia.CreateTreeWalker(uiaBase.TrueCondition) return uia } } } ; If all else fails, try the first IUIAutomation version try { if uia:=ComObjCreate("{ff48dba4-60ef-4201-aa87-54103eef594e}","{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}") return uia:=new UIA_Interface(uia, 1, 1), uia.base.base.__UIA:=uia, uia.base.base.CurrentVersion:=1, uia.base.base.TrueCondition:=uia.CreateTrueCondition(), uia.base.base.TreeWalkerTrue := uia.CreateTreeWalker(uia.base.base.TrueCondition) throw "UIAutomation Interface failed to initialize." } catch e MsgBox, 262160, UIA Startup Error, % IsObject(e)?"IUIAutomation Interface is not registered.":e.Message return } class UIA_Cleanup { __New(screenreader) { this.ScreenReaderActivate := screenreader, this.ScreenReaderStartingState := UIA_GetScreenReader() if (this.ScreenReaderActivate && !this.ScreenReaderStartingState) UIA_SetScreenReader(1) } __Delete() { if (this.ScreenReaderActivate) UIA_SetScreenReader(this.ScreenReaderStartingState) } } UIA_GetScreenReader() { local screenreader := 0 if (A_PtrSize = 4) DllCall("user32.dll\SystemParametersInfo", "uint", 0x0046, "uint", 0, "ptr*", screenreader, "uint", 0) else DllCall("user32.dll\SystemParametersInfo", "uint", 0x0046, "uint", 0, "ptr*", screenreader) ; SPI_GETSCREENREADER return screenreader } UIA_SetScreenReader(state, fWinIni:=2) { DllCall("user32.dll\SystemParametersInfo", "uint", 0x0047, "uint", state, "ptr", 0, "uint", fWinIni) ; SPI_SETSCREENREADER } ; Converts an error code to the corresponding error message UIA_Hr(hr) { local ;~ http://blogs.msdn.com/b/eldar/archive/2007/04/03/a-lot-of-hresult-codes.aspx static err:={0x8000FFFF:"Catastrophic failure.",0x80004001:"Not implemented.",0x8007000E:"Out of memory.",0x80070057:"One or more arguments are not valid.",0x80004002:"Interface not supported.",0x80004003:"Pointer not valid.",0x80070006:"Handle not valid.",0x80004004:"Operation aborted.",0x80004005:"Unspecified error.",0x80070005:"General access denied.",0x800401E5:"The object identified by this moniker could not be found.",0x80040201:"UIA_E_ELEMENTNOTAVAILABLE",0x80040200:"UIA_E_ELEMENTNOTENABLED",0x80131509:"UIA_E_INVALIDOPERATION",0x80040202:"UIA_E_NOCLICKABLEPOINT",0x80040204:"UIA_E_NOTSUPPORTED",0x80040203:"UIA_E_PROXYASSEMBLYNOTLOADED",0x80131505:"COR_E_TIMEOUT"} ; //not completed if hr&&(hr&=0xFFFFFFFF) { RegExMatch(Exception("",-2).what,"(\w+).(\w+)",i) throw Exception(UIA_Hex(hr) " - " err[hr], -2, i2 " (" i1 ")") } return !hr } UIA_NotImplemented() { local RegExMatch(Exception("",-2).What,"(\D+)\.(\D+)",m) MsgBox, 262192, UIA Message, Class:`t%m1%`nMember:`t%m2%`n`nMethod has not been implemented yet. } ; Used by UIA methods to create new UIA_Element objects of the highest available version. The highest version to try can be changed by modifying UIA_Enum.UIA_CurrentVersion_Element value. UIA_Element(e,flag:=1) { local max, riid static v := "", previousVersion := "" if !e return if (previousVersion != UIA_Enum.UIA_CurrentVersion_Element) ; Check if the user wants an element with a different version v := "" else if v return (v==1)?new UIA_Element(e,flag,1):new UIA_Element%v%(e,flag,v) max := UIA_Enum.UIA_CurrentVersion_Element+1 While (--max) { if UIA_GUID(riid, UIA_Element%max%.__IID) return new UIA_Element%max%(e,flag,v:=max) } return new UIA_Element(e,flag,v:=1) } ; Used by UIA methods to create new UIA_TextRange objects of the highest available version. The highest version to try can be changed by modifying UIA_Enum.UIA_CurrentVersion_TextRange value. UIA_TextRange(e,flag:=1) { local max, riid static v := "", previousVersion := "" if (previousVersion != UIA_Enum.UIA_CurrentVersion_TextRange) ; Check if the user wants an element with a different version v := "" else if v return (v==1)?new UIA_TextRange(e,flag,1):new UIA_TextRange%v%(e,flag,v) max := UIA_Enum.UIA_MaxVersion_TextRange+1 While (--max) { if UIA_GUID(riid, UIA_TextRange%max%.__IID) return new UIA_TextRange%max%(e,flag,v:=max) } return new UIA_TextRange(e,flag,v:=1) } ; Used by UIA methods to create new Pattern objects of the highest available version for a given pattern. UIA_Pattern(p, el) { local i, patternName, patternAvailableId static maxPatternVersions := {Selection:2, Text:2, TextRange:3, Transform:2} if p is integer return patternName := UIA_Enum.UIA_Pattern(p) else patternName := InStr(p, "Pattern") ? p : p "Pattern", i:=2 Loop { i++ if !(UIA_Enum.UIA_PatternId(patternName i) && IsObject(UIA_%patternName%%i%) && UIA_%patternName%%i%.__iid && UIA_%patternName%%i%.__PatternID) break } While (--i > 1) { if ((patternAvailableId := UIA_Enum["UIA_Is" patternName i "AvailablePropertyId"]) && el.GetCurrentPropertyValue(patternAvailableId)) return patternName i } return patternName } ; Used to fetch constants and enumerations from the UIA_Enum class. The "UIA_" part of a variable name can be left out (eg UIA_Enum("ButtonControlTypeId") will return 50000). UIA_Enum(e) { if ObjHasKey(UIA_Enum, e) return UIA_Enum[e] else if ObjHasKey(UIA_Enum, "UIA_" e) return UIA_Enum["UIA_" e] } UIA_ElementArray(p, uia:="",flag:=1) { ; Should AHK Object be 0 or 1 based? Currently 1 based. local global UIA_ElementArray if !p return a:=new UIA_ElementArray(p,flag),out:=[] Loop % a.Length out[A_Index]:=a.GetElement(A_Index-1) return out, out.base:={UIA_ElementArray:a} } UIA_TextRangeArray(p, uia:="",flag:=1) { ; Should AHK Object be 0 or 1 based? Currently 1 based. local global UIA_TextRangeArray a:=new UIA_TextRangeArray(p,flag),out:=[] Loop % a.Length out[A_Index]:=a.GetElement(A_Index-1) return out, out.base:={UIA_TextRangeArray:a} } UIA_RectToObject(ByRef r) { ; rect.__Value work with DllCalls? static b:={__Class:"object",__Type:"RECT",Struct:Func("UIA_RectStructure")} return {l:NumGet(r,0,"Int"),t:NumGet(r,4,"Int"),r:NumGet(r,8,"Int"),b:NumGet(r,12,"Int"),base:b} } UIA_RectStructure(this, ByRef r) { static sides:="ltrb" VarSetCapacity(r,16) Loop Parse, sides NumPut(this[A_LoopField],r,(A_Index-1)*4,"Int") } UIA_SafeArrayToAHKArray(safearray) { local b:={__Class:"object",__Type:"SafeArray",__Value:safearray} out := [] for k in safearray out.Push(k) return out, out.base:=b } UIA_SafeArraysToObject(keys,values) { ;~ 1 dim safearrays w/ same # of elements local out:={} for key in keys out[key]:=values[A_Index-1] return out } UIA_Hex(p) { local setting:=A_FormatInteger SetFormat,IntegerFast,H out:=p+0 "" SetFormat,IntegerFast,%setting% return out } UIA_GUID(ByRef GUID, sGUID) { ;~ Converts a string to a binary GUID and returns its address. if !sGUID return VarSetCapacity(GUID,16,0) return DllCall("ole32\CLSIDFromString", "wstr",sGUID, "ptr",&GUID)>=0?&GUID:"" } UIA_Variant(ByRef var,type:=0,val:=0) { ; https://www.autohotkey.com/boards/viewtopic.php?t=6979 static SIZEOF_VARIANT := 8 + (2 * A_PtrSize) VarSetCapacity(var, SIZEOF_VARIANT), ComObject(0x400C, &var)[] := type&&(type!=8)?ComObject(type,type=0xB?(!val?0:-1):val):val return &var ; The variant probably doesn't need clearing, because it is passed to UIA and UIA should take care of releasing it. ; Old implementation: ; return (VarSetCapacity(var,8+2*A_PtrSize)+NumPut(type,var,0,"short")+NumPut(type=8? DllCall("oleaut32\SysAllocString", "ptr",&val):val,var,8,"ptr"))*0+&var } UIA_ComVar(Type := 0xC, val:=0) { static base := { __Get: Func("ComVarGet"), __Set: Func("ComVarSet") , __Delete: Func("ComVarDel") } cv := {base: base} cv.SetCapacity("buf", 24), ptr := cv.GetAddress("buf") NumPut(0, NumPut(0, ptr+0, "int64"), "int64") cv.ref := ComObject(0x400C, ptr) cv.ref[] := (type!=0xC)&&(type!=8)?ComObject(type,type=0xB?(!val?0:-1):val):val cv.ptr := ComObjValue(cv.ref) return cv } ComVarGet(cv, p*) { ; Called when script accesses an unknown field. if p.MaxIndex() = "" ; No name/parameters, i.e. cv[] return cv.ref[] } ComVarSet(cv, v, p*) { ; Called when script sets an unknown field. if p.MaxIndex() = "" ; No name/parameters, i.e. cv[]:=v return cv.ref[] := v } ComVarDel(cv) { ; Called when the object is being freed. ; Depending on type, this may be needed to free the value, if set. DllCall("oleaut32\VariantClear", "ptr", cv.GetAddress("buf")) } UIA_IsVariant(ByRef vt, ByRef type:="", offset:=0, flag:=1) { local size:=VarSetCapacity(vt),type:=NumGet(vt,offset,"UShort") return size>=16&&size<=24&&type>=0&&(type<=23||type|0x2000) } UIA_VariantType(type){ static _:={2:[2,"short"] ,3:[4,"int"] ,4:[4,"float"] ,5:[8,"double"] ,0xA:[4,"uint"] ,0xB:[2,"short"] ,0x10:[1,"char"] ,0x11:[1,"uchar"] ,0x12:[2,"ushort"] ,0x13:[4,"uint"] ,0x14:[8,"int64"] ,0x15:[8,"uint64"]} return _.haskey(type)?_[type]:[A_PtrSize,"ptr"] } UIA_VariantData(ByRef p, flag:=1, offset:=0) { local if flag { var := !UIA_IsVariant(p,vt, offset)?"Invalid Variant":ComObject(0x400C, &p)[] ; https://www.autohotkey.com/boards/viewtopic.php?t=6979 UIA_VariantClear(&p) ; Clears variant, except if it contains a pointer to an object (eg IDispatch). BSTR is automatically freed. } else { vt:=NumGet(p+0,offset,"UShort"), var := !(vt>=0&&(vt<=23||vt|0x2000))?"Invalid Variant":ComObject(0x400C, p)[] UIA_VariantClear(p) } return vt=11?-var:var ; Negate value if VT_BOOL (-1=True, 0=False) ; Old implementation, based on Sean's COM_Enumerate function ; return !UIA_IsVariant(p,vt, offset)?"Invalid Variant" ; :vt=0?"" ; VT_EMPTY ; :vt=3?NumGet(p,offset+8,"int") ; :vt=8?StrGet(NumGet(p,offset+8)) ; :vt=11?-NumGet(p,offset+8,"short") ; :vt=9||vt=13||vt&0x2000?ComObj(vt,NumGet(p,offset+8),flag) ; :vt<0x1000&&UIA_VariantChangeType(&p,&p)=0?StrGet(NumGet(p,offset+8)) UIA_VariantClear(&p) ; :NumGet(p,offset+8) /* VT_EMPTY = 0 ; No value VT_NULL = 1 ; SQL-style Null VT_I2 = 2 ; 16-bit signed int VT_I4 = 3 ; 32-bit signed int VT_R4 = 4 ; 32-bit floating-point number VT_R8 = 5 ; 64-bit floating-point number VT_CY = 6 ; Currency VT_DATE = 7 ; Date VT_BSTR = 8 ; COM string (Unicode string with length prefix) VT_DISPATCH = 9 ; COM object VT_ERROR = 0xA 10 ; Error code (32-bit integer) VT_BOOL = 0xB 11 ; Boolean True (-1) or False (0) VT_VARIANT = 0xC 12 ; VARIANT (must be combined with VT_ARRAY or VT_BYREF) VT_UNKNOWN = 0xD 13 ; IUnknown interface pointer VT_DECIMAL = 0xE 14 ; (not supported) VT_I1 = 0x10 16 ; 8-bit signed int VT_UI1 = 0x11 17 ; 8-bit unsigned int VT_UI2 = 0x12 18 ; 16-bit unsigned int VT_UI4 = 0x13 19 ; 32-bit unsigned int VT_I8 = 0x14 20 ; 64-bit signed int VT_UI8 = 0x15 21 ; 64-bit unsigned int VT_INT = 0x16 22 ; Signed machine int VT_UINT = 0x17 23 ; Unsigned machine int VT_RECORD = 0x24 36 ; User-defined type VT_ARRAY = 0x2000 ; SAFEARRAY VT_BYREF = 0x4000 ; Pointer to another type of value = 0x1000 4096 COM_SysAllocString(str) { Return DllCall("oleaut32\SysAllocString", "Uint", &str) } COM_SysFreeString(pstr) { DllCall("oleaut32\SysFreeString", "Uint", pstr) } COM_SysString(ByRef wString, sString) { VarSetCapacity(wString,4+nLen:=2*StrLen(sString)) Return DllCall("kernel32\lstrcpyW","Uint",NumPut(nLen,wString),"Uint",&sString) } DllCall("oleaut32\SafeArrayGetVartype", "ptr*",ComObjValue(SafeArray), "uint*",pvt) HRESULT SafeArrayGetVartype( _In_ SAFEARRAY *psa, _Out_ VARTYPE *pvt ); DllCall("oleaut32\SafeArrayDestroy", "ptr",ComObjValue(SafeArray)) HRESULT SafeArrayDestroy( _In_ SAFEARRAY *psa ); */ } UIA_VariantChangeType(pvarDst, pvarSrc, vt:=8) { ; written by Sean return DllCall("oleaut32\VariantChangeTypeEx", "ptr",pvarDst, "ptr",pvarSrc, "Uint",1024, "Ushort",0, "Ushort",vt) } UIA_VariantClear(pvar) { ; Written by Sean DllCall("oleaut32\VariantClear", "ptr",pvar) } UIA_GetSafeArrayValue(p,type,flag:=1){ ; Credit: https://github.com/neptercn/UIAutomation/blob/master/UIA.ahk local t:=UIA_VariantType(type),item:={},pv:=NumGet(p+8+A_PtrSize,"ptr") loop % NumGet(p+8+2*A_PtrSize,"uint") { item.Insert((type=8)?StrGet(NumGet(pv+(A_Index-1)*t.1,t.2),"utf-16"):NumGet(pv+(A_Index-1)*t.1,t.2)) } if flag DllCall("oleaut32\SafeArrayDestroy","ptr", p) return item } UIA_GetBSTRValue(ByRef bstr) { local val := StrGet(bstr) DllCall("oleaut32\SysFreeString", "ptr", bstr) return val } /* UIA_CreateEventHandler(funcName, handlerType) returns a new handler object that can be used with methods that create EventHandlers (eg AddAutomationEventHandler) funcName: name of the function that will receive the calls when an event happens handlerType: needed by some of the newer Add...EventHandler functions. In the case of AddAutomationEventHandler, this should be left empty. For other Add...EventHandler cases, specify the ... part: FocusChanged, StructureChanged, TextEditTextChanged, Changes, Notification. So for AddFocusChangedEventHandler, set this value to "FocusChanged" The function funcName needs to be able to receive a certain number of arguments that depends on the type on handler being created: HandleAutomationEvent(sender, eventId) <--- this is the most common handler type created with AddAutomationEventHandler, and the handler function needs to have exactly two arguments: sender (the element which sent the event), and eventId. HandleFocusChangedEvent(sender) HandlePropertyChangedEvent(sender, propertyId, newValue) HandleStructureChangedEvent(sender, changeType, runtimeId) HandleTextEditTextChangedEvent(sender, changeType, eventStrings) HandleChangesEvent(sender, uiaChanges, changesCount) HandleNotificationEvent(sender, notificationKind, notificationProcessing, displayString, activityId) */ UIA_CreateEventHandler(funcName, handlerType:="") { ; Possible handlerType values: empty, FocusChanged, StructureChanged, TextEditTextChanged, Changes, Notification. local handler, ptr if !(IsFunc(funcName) || IsObject(funcName)) ; Figuring out if the Object is callable is way too difficult to bother with. throw Exception(funcName "is not a function!", -1) ptr := DllCall("GlobalAlloc", "UInt",0x40, "UInt",A_PtrSize*5, "Ptr" ) handler := new _UIA_%handlerType%EventHandler(ptr,2,funcName) ; deref will be done on destruction of EventHandler. Function name piggybacks on the __Version property ,NumPut(ptr+A_PtrSize,ptr+0) ,NumPut(RegisterCallback("_UIA_QueryInterface","F"),ptr+0,A_PtrSize*1) ,NumPut(RegisterCallback("_UIA_AddRef","F"),ptr+0,A_PtrSize*2) ,NumPut(RegisterCallback("_UIA_Release","F"),ptr+0,A_PtrSize*3) ,NumPut(RegisterCallback("_UIA_" handlerType "EventHandler.Handle" (handlerType == "" ? "Automation" : handlerType) "Event","F",,&handler),ptr+0,A_PtrSize*4) return handler } _UIA_QueryInterface(pSelf, pRIID, pObj){ ; Credit: https://github.com/neptercn/UIAutomation/blob/master/UIA.ahk local DllCall("ole32\StringFromIID","ptr",pRIID,"ptr*",sz:=""),str:=StrGet(sz) ; sz should not be freed here return (str="{00000000-0000-0000-C000-000000000046}")||(str="{146c3c17-f12e-4e22-8c27-f894b9b79c69}")||(str="{40cd37d4-c756-4b0c-8c6f-bddfeeb13b50}")||(str="{e81d1b4e-11c5-42f8-9754-e7036c79f054}")||(str="{c270f6b5-5c69-4290-9745-7a7f97169468}")||(str="{92FAA680-E704-4156-931A-E32D5BB38F3F}")||(str="{58EDCA55-2C3E-4980-B1B9-56C17F27A2A0}")||(str="{C7CB2637-E6C2-4D0C-85DE-4948C02175C7}")?NumPut(pSelf,pObj+0)*0:0x80004002 ; E_NOINTERFACE } _UIA_AddRef(pSelf){ } _UIA_Release(pSelf){ } /* UIA_Enum contains UIA constants and enumerations. There are multiple ways to access the constants: 1) Use the returned object of UIA_Interface: After UIA := UIA_Interface() UIA.UIA_InvokePatternId would return the corresponding ID of 10000. Similarly UIA.TreeScope_Descendants would return 0x4 If a property starts with "UIA_" then that part may be omitted: UIA.ButtonControlTypeId would return 50000. Calling UIA_Enum methods is also supported: UIA.UIA_EventId(20000) would return "ToolTipOpened" 2) Use UIA_Enum prototype. This requires using exact property and method names: UIA_Enum.UIA_InvokePatternId UIA_Enum.UIA_PatternId(10000) 3) Use a UIA_Enum object: After UIAc := new UIA_Enum UIAc.InvokePatternId returns 10000 UIAc.PatternId(10000) returns "InvokePattern" 4) Use the UIA_Enum function: UIA_Enum("ButtonControlTypeId") would return 50000 */ class UIA_Enum { ; main source: https://github.com/Ixiko/AHK-libs-and-classes-collection/blob/master/libs/o-z/UIAutomationClient_1_0_64bit.ahk __Get(member) { if member not in base { if ((SubStr(member, 1, 4) != "UIA_") && ObjHasKey(UIA_Enum, "UIA_" member)) { return this["UIA_" member] } } return UIA_Enum.member } __Call(member, params*) { if member not in base { if ((SubStr(member, 1, 4) != "UIA_") && IsFunc("UIA_Enum.UIA_" member)) return this["UIA_" member](params*) } } ; UIA_Interface specific enums, which define maximum available version numbers for interfaces (eg currently the highest version for UIA_Interface is 7). CurrentVersion specifies the version used by any new objects created, this can be changed dynamically. static UIA_MaxVersion_Interface := 7 static UIA_MaxVersion_Element := 7 static UIA_CurrentVersion_Element := 7 static UIA_MaxVersion_TextRange := 3 static UIA_CurrentVersion_TextRange := 3 ; The following are not strictly enumerations but constants, it makes more sense to include them here ; module UIA_PatternIds static UIA_InvokePatternId := 10000 static UIA_SelectionPatternId := 10001 static UIA_ValuePatternId := 10002 static UIA_RangeValuePatternId := 10003 static UIA_ScrollPatternId := 10004 static UIA_ExpandCollapsePatternId := 10005 static UIA_GridPatternId := 10006 static UIA_GridItemPatternId := 10007 static UIA_MultipleViewPatternId := 10008 static UIA_WindowPatternId := 10009 static UIA_SelectionItemPatternId := 10010 static UIA_DockPatternId := 10011 static UIA_TablePatternId := 10012 static UIA_TableItemPatternId := 10013 static UIA_TextPatternId := 10014 static UIA_TogglePatternId := 10015 static UIA_TransformPatternId := 10016 static UIA_ScrollItemPatternId := 10017 static UIA_LegacyIAccessiblePatternId := 10018 static UIA_ItemContainerPatternId := 10019 static UIA_VirtualizedItemPatternId := 10020 static UIA_SynchronizedInputPatternId := 10021 static UIA_ObjectModelPatternId := 10022 static UIA_AnnotationPatternId := 10023 static UIA_TextPattern2Id := 10024 static UIA_StylesPatternId := 10025 static UIA_SpreadsheetPatternId := 10026 static UIA_SpreadsheetItemPatternId := 10027 static UIA_TransformPattern2Id := 10028 static UIA_TextChildPatternId := 10029 static UIA_DragPatternId := 10030 static UIA_DropTargetPatternId := 10031 static UIA_TextEditPatternId := 10032 static UIA_CustomNavigationPatternId := 10033 static UIA_SelectionPattern2Id := 10034 UIA_PatternId(n:="") { static name:={10000:"InvokePattern",10001:"SelectionPattern",10002:"ValuePattern",10003:"RangeValuePattern",10004:"ScrollPattern",10005:"ExpandCollapsePattern",10006:"GridPattern",10007:"GridItemPattern",10008:"MultipleViewPattern",10009:"WindowPattern",10010:"SelectionItemPattern",10011:"DockPattern",10012:"TablePattern",10013:"TableItemPattern",10014:"TextPattern",10015:"TogglePattern",10016:"TransformPattern",10017:"ScrollItemPattern",10018:"LegacyIAccessiblePattern",10019:"ItemContainerPattern",10020:"VirtualizedItemPattern",10021:"SynchronizedInputPattern",10022:"ObjectModelPattern",10023:"AnnotationPattern",10024:"TextPattern2",10025:"StylesPattern",10026:"SpreadsheetPattern",10027:"SpreadsheetItemPattern",10028:"TransformPattern2",10029:"TextChildPattern",10030:"DragPattern",10031:"DropTargetPattern",10032:"TextEditPattern",10033:"CustomNavigationPattern",10034:"SelectionPattern2"}, id:={InvokePattern:10000,SelectionPattern:10001,ValuePattern:10002,RangeValuePattern:10003,ScrollPattern:10004,ExpandCollapsePattern:10005,GridPattern:10006,GridItemPattern:10007,MultipleViewPattern:10008,WindowPattern:10009,SelectionItemPattern:10010,DockPattern:10011,TablePattern:10012,TableItemPattern:10013,TextPattern:10014,TogglePattern:10015,TransformPattern:10016,ScrollItemPattern:10017,LegacyIAccessiblePattern:10018,ItemContainerPattern:10019,VirtualizedItemPattern:10020,SynchronizedInputPattern:10021,ObjectModelPattern:10022,AnnotationPattern:10023,TextPattern2:10024,StylesPattern:10025,SpreadsheetPattern:10026,SpreadsheetItemPattern:10027,TransformPattern2:10028,TextChildPattern:10029,DragPattern:10030,DropTargetPattern:10031,TextEditPattern:10032,CustomNavigationPattern:10033,SelectionPattern2:10034} if !n return id if n is integer return name[n] if ObjHasKey(id, n "Pattern") return id[n "Pattern"] else if ObjHasKey(id, n) return id[n] return id[RegexReplace(n, "(?:UIA_)?(.+?)(?:Id)?$", "$1")] } ; module UIA_EventIds static UIA_ToolTipOpenedEventId := 20000 static UIA_ToolTipClosedEventId := 20001 static UIA_StructureChangedEventId := 20002 static UIA_MenuOpenedEventId := 20003 static UIA_AutomationPropertyChangedEventId := 20004 static UIA_AutomationFocusChangedEventId := 20005 static UIA_AsyncContentLoadedEventId := 20006 static UIA_MenuClosedEventId := 20007 static UIA_LayoutInvalidatedEventId := 20008 static UIA_Invoke_InvokedEventId := 20009 static UIA_SelectionItem_ElementAddedToSelectionEventId := 20010 static UIA_SelectionItem_ElementRemovedFromSelectionEventId := 20011 static UIA_SelectionItem_ElementSelectedEventId := 20012 static UIA_Selection_InvalidatedEventId := 20013 static UIA_Text_TextSelectionChangedEventId := 20014 static UIA_Text_TextChangedEventId := 20015 static UIA_Window_WindowOpenedEventId := 20016 static UIA_Window_WindowClosedEventId := 20017 static UIA_MenuModeStartEventId := 20018 static UIA_MenuModeEndEventId := 20019 static UIA_InputReachedTargetEventId := 20020 static UIA_InputReachedOtherElementEventId := 20021 static UIA_InputDiscardedEventId := 20022 static UIA_SystemAlertEventId := 20023 static UIA_LiveRegionChangedEventId := 20024 static UIA_HostedFragmentRootsInvalidatedEventId := 20025 static UIA_Drag_DragStartEventId := 20026 static UIA_Drag_DragCancelEventId := 20027 static UIA_Drag_DragCompleteEventId := 20028 static UIA_DropTarget_DragEnterEventId := 20029 static UIA_DropTarget_DragLeaveEventId := 20030 static UIA_DropTarget_DroppedEventId := 20031 static UIA_TextEdit_TextChangedEventId := 20032 static UIA_TextEdit_ConversionTargetChangedEventId := 20033 static UIA_ChangesEventId := 20034 static UIA_NotificationEventId := 20035 static UIA_ActiveTextPositionChangedEventId := 20036 UIA_EventId(n:="") { static id:={ToolTipOpened:20000,ToolTipClosed:20001,StructureChanged:20002,MenuOpened:20003,AutomationPropertyChanged:20004,AutomationFocusChanged:20005,AsyncContentLoaded:20006,MenuClosed:20007,LayoutInvalidated:20008,Invoke_Invoked:20009,SelectionItem_ElementAddedToSelection:20010,SelectionItem_ElementRemovedFromSelection:20011,SelectionItem_ElementSelected:20012,Selection_Invalidated:20013,Text_TextSelectionChanged:20014,Text_TextChanged:20015,Window_WindowOpened:20016,Window_WindowClosed:20017,MenuModeStart:20018,MenuModeEnd:20019,InputReachedTarget:20020,InputReachedOtherElement:20021,InputDiscarded:20022,SystemAlert:20023,LiveRegionChanged:20024,HostedFragmentRootsInvalidated:20025,Drag_DragStart:20026,Drag_DragCancel:20027,Drag_DragComplete:20028,DropTarget_DragEnter:20029,DropTarget_DragLeave:20030,DropTarget_Dropped:20031,TextEdit_TextChanged:20032,TextEdit_ConversionTargetChanged:20033,Changes:20034,Notification:20035,ActiveTextPositionChanged:20036}, name:={20000:"ToolTipOpened",20001:"ToolTipClosed",20002:"StructureChanged",20003:"MenuOpened",20004:"AutomationPropertyChanged",20005:"AutomationFocusChanged",20006:"AsyncContentLoaded",20007:"MenuClosed",20008:"LayoutInvalidated",20009:"Invoke_Invoked",20010:"SelectionItem_ElementAddedToSelection",20011:"SelectionItem_ElementRemovedFromSelection",20012:"SelectionItem_ElementSelected",20013:"Selection_Invalidated",20014:"Text_TextSelectionChanged",20015:"Text_TextChanged",20016:"Window_WindowOpened",20017:"Window_WindowClosed",20018:"MenuModeStart",20019:"MenuModeEnd",20020:"InputReachedTarget",20021:"InputReachedOtherElement",20022:"InputDiscarded",20023:"SystemAlert",20024:"LiveRegionChanged",20025:"HostedFragmentRootsInvalidated",20026:"Drag_DragStart",20027:"Drag_DragCancel",20028:"Drag_DragComplete",20029:"DropTarget_DragEnter",20030:"DropTarget_DragLeave",20031:"DropTarget_Dropped",20032:"TextEdit_TextChanged",20033:"TextEdit_ConversionTargetChanged",20034:"Changes",20035:"Notification",20036:"ActiveTextPositionChanged"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "EventId"), "UIA_")] } ; module UIA_PropertyIds static UIA_RuntimeIdPropertyId := 30000 static UIA_BoundingRectanglePropertyId := 30001 static UIA_ProcessIdPropertyId := 30002 static UIA_ControlTypePropertyId := 30003 static UIA_LocalizedControlTypePropertyId := 30004 static UIA_NamePropertyId := 30005 static UIA_AcceleratorKeyPropertyId := 30006 static UIA_AccessKeyPropertyId := 30007 static UIA_HasKeyboardFocusPropertyId := 30008 static UIA_IsKeyboardFocusablePropertyId := 30009 static UIA_IsEnabledPropertyId := 30010 static UIA_AutomationIdPropertyId := 30011 static UIA_ClassNamePropertyId := 30012 static UIA_HelpTextPropertyId := 30013 static UIA_ClickablePointPropertyId := 30014 static UIA_CulturePropertyId := 30015 static UIA_IsControlElementPropertyId := 30016 static UIA_IsContentElementPropertyId := 30017 static UIA_LabeledByPropertyId := 30018 static UIA_IsPasswordPropertyId := 30019 static UIA_NativeWindowHandlePropertyId := 30020 static UIA_ItemTypePropertyId := 30021 static UIA_IsOffscreenPropertyId := 30022 static UIA_OrientationPropertyId := 30023 static UIA_FrameworkIdPropertyId := 30024 static UIA_IsRequiredForFormPropertyId := 30025 static UIA_ItemStatusPropertyId := 30026 static UIA_IsDockPatternAvailablePropertyId := 30027 static UIA_IsExpandCollapsePatternAvailablePropertyId := 30028 static UIA_IsGridItemPatternAvailablePropertyId := 30029 static UIA_IsGridPatternAvailablePropertyId := 30030 static UIA_IsInvokePatternAvailablePropertyId := 30031 static UIA_IsMultipleViewPatternAvailablePropertyId := 30032 static UIA_IsRangeValuePatternAvailablePropertyId := 30033 static UIA_IsScrollPatternAvailablePropertyId := 30034 static UIA_IsScrollItemPatternAvailablePropertyId := 30035 static UIA_IsSelectionItemPatternAvailablePropertyId := 30036 static UIA_IsSelectionPatternAvailablePropertyId := 30037 static UIA_IsTablePatternAvailablePropertyId := 30038 static UIA_IsTableItemPatternAvailablePropertyId := 30039 static UIA_IsTextPatternAvailablePropertyId := 30040 static UIA_IsTogglePatternAvailablePropertyId := 30041 static UIA_IsTransformPatternAvailablePropertyId := 30042 static UIA_IsValuePatternAvailablePropertyId := 30043 static UIA_IsWindowPatternAvailablePropertyId := 30044 static UIA_ValueValuePropertyId := 30045 static UIA_ValueIsReadOnlyPropertyId := 30046 static UIA_RangeValueValuePropertyId := 30047 static UIA_RangeValueIsReadOnlyPropertyId := 30048 static UIA_RangeValueMinimumPropertyId := 30049 static UIA_RangeValueMaximumPropertyId := 30050 static UIA_RangeValueLargeChangePropertyId := 30051 static UIA_RangeValueSmallChangePropertyId := 30052 static UIA_ScrollHorizontalScrollPercentPropertyId := 30053 static UIA_ScrollHorizontalViewSizePropertyId := 30054 static UIA_ScrollVerticalScrollPercentPropertyId := 30055 static UIA_ScrollVerticalViewSizePropertyId := 30056 static UIA_ScrollHorizontallyScrollablePropertyId := 30057 static UIA_ScrollVerticallyScrollablePropertyId := 30058 static UIA_SelectionSelectionPropertyId := 30059 static UIA_SelectionCanSelectMultiplePropertyId := 30060 static UIA_SelectionIsSelectionRequiredPropertyId := 30061 static UIA_GridRowCountPropertyId := 30062 static UIA_GridColumnCountPropertyId := 30063 static UIA_GridItemRowPropertyId := 30064 static UIA_GridItemColumnPropertyId := 30065 static UIA_GridItemRowSpanPropertyId := 30066 static UIA_GridItemColumnSpanPropertyId := 30067 static UIA_GridItemContainingGridPropertyId := 30068 static UIA_DockDockPositionPropertyId := 30069 static UIA_ExpandCollapseExpandCollapseStatePropertyId := 30070 static UIA_MultipleViewCurrentViewPropertyId := 30071 static UIA_MultipleViewSupportedViewsPropertyId := 30072 static UIA_WindowCanMaximizePropertyId := 30073 static UIA_WindowCanMinimizePropertyId := 30074 static UIA_WindowWindowVisualStatePropertyId := 30075 static UIA_WindowWindowInteractionStatePropertyId := 30076 static UIA_WindowIsModalPropertyId := 30077 static UIA_WindowIsTopmostPropertyId := 30078 static UIA_SelectionItemIsSelectedPropertyId := 30079 static UIA_SelectionItemSelectionContainerPropertyId := 30080 static UIA_TableRowHeadersPropertyId := 30081 static UIA_TableColumnHeadersPropertyId := 30082 static UIA_TableRowOrColumnMajorPropertyId := 30083 static UIA_TableItemRowHeaderItemsPropertyId := 30084 static UIA_TableItemColumnHeaderItemsPropertyId := 30085 static UIA_ToggleToggleStatePropertyId := 30086 static UIA_TransformCanMovePropertyId := 30087 static UIA_TransformCanResizePropertyId := 30088 static UIA_TransformCanRotatePropertyId := 30089 static UIA_IsLegacyIAccessiblePatternAvailablePropertyId := 30090 static UIA_LegacyIAccessibleChildIdPropertyId := 30091 static UIA_LegacyIAccessibleNamePropertyId := 30092 static UIA_LegacyIAccessibleValuePropertyId := 30093 static UIA_LegacyIAccessibleDescriptionPropertyId := 30094 static UIA_LegacyIAccessibleRolePropertyId := 30095 static UIA_LegacyIAccessibleStatePropertyId := 30096 static UIA_LegacyIAccessibleHelpPropertyId := 30097 static UIA_LegacyIAccessibleKeyboardShortcutPropertyId := 30098 static UIA_LegacyIAccessibleSelectionPropertyId := 30099 static UIA_LegacyIAccessibleDefaultActionPropertyId := 30100 static UIA_AriaRolePropertyId := 30101 static UIA_AriaPropertiesPropertyId := 30102 static UIA_IsDataValidForFormPropertyId := 30103 static UIA_ControllerForPropertyId := 30104 static UIA_DescribedByPropertyId := 30105 static UIA_FlowsToPropertyId := 30106 static UIA_ProviderDescriptionPropertyId := 30107 static UIA_IsItemContainerPatternAvailablePropertyId := 30108 static UIA_IsVirtualizedItemPatternAvailablePropertyId := 30109 static UIA_IsSynchronizedInputPatternAvailablePropertyId := 30110 static UIA_OptimizeForVisualContentPropertyId := 30111 static UIA_IsObjectModelPatternAvailablePropertyId := 30112 static UIA_AnnotationAnnotationTypeIdPropertyId := 30113 static UIA_AnnotationAnnotationTypeNamePropertyId := 30114 static UIA_AnnotationAuthorPropertyId := 30115 static UIA_AnnotationDateTimePropertyId := 30116 static UIA_AnnotationTargetPropertyId := 30117 static UIA_IsAnnotationPatternAvailablePropertyId := 30118 static UIA_IsTextPattern2AvailablePropertyId := 30119 static UIA_StylesStyleIdPropertyId := 30120 static UIA_StylesStyleNamePropertyId := 30121 static UIA_StylesFillColorPropertyId := 30122 static UIA_StylesFillPatternStylePropertyId := 30123 static UIA_StylesShapePropertyId := 30124 static UIA_StylesFillPatternColorPropertyId := 30125 static UIA_StylesExtendedPropertiesPropertyId := 30126 static UIA_IsStylesPatternAvailablePropertyId := 30127 static UIA_IsSpreadsheetPatternAvailablePropertyId := 30128 static UIA_SpreadsheetItemFormulaPropertyId := 30129 static UIA_SpreadsheetItemAnnotationObjectsPropertyId := 30130 static UIA_SpreadsheetItemAnnotationTypesPropertyId := 30131 static UIA_IsSpreadsheetItemPatternAvailablePropertyId := 30132 static UIA_Transform2CanZoomPropertyId := 30133 static UIA_IsTransformPattern2AvailablePropertyId := 30134 static UIA_LiveSettingPropertyId := 30135 static UIA_IsTextChildPatternAvailablePropertyId := 30136 static UIA_IsDragPatternAvailablePropertyId := 30137 static UIA_DragIsGrabbedPropertyId := 30138 static UIA_DragDropEffectPropertyId := 30139 static UIA_DragDropEffectsPropertyId := 30140 static UIA_IsDropTargetPatternAvailablePropertyId := 30141 static UIA_DropTargetDropTargetEffectPropertyId := 30142 static UIA_DropTargetDropTargetEffectsPropertyId := 30143 static UIA_DragGrabbedItemsPropertyId := 30144 static UIA_Transform2ZoomLevelPropertyId := 30145 static UIA_Transform2ZoomMinimumPropertyId := 30146 static UIA_Transform2ZoomMaximumPropertyId := 30147 static UIA_FlowsFromPropertyId := 30148 static UIA_IsTextEditPatternAvailablePropertyId := 30149 static UIA_IsPeripheralPropertyId := 30150 static UIA_IsCustomNavigationPatternAvailablePropertyId := 30151 static UIA_PositionInSetPropertyId := 30152 static UIA_SizeOfSetPropertyId := 30153 static UIA_LevelPropertyId := 30154 static UIA_AnnotationTypesPropertyId := 30155 static UIA_AnnotationObjectsPropertyId := 30156 static UIA_LandmarkTypePropertyId := 30157 static UIA_LocalizedLandmarkTypePropertyId := 30158 static UIA_FullDescriptionPropertyId := 30159 static UIA_FillColorPropertyId := 30160 static UIA_OutlineColorPropertyId := 30161 static UIA_FillTypePropertyId := 30162 static UIA_VisualEffectsPropertyId := 30163 static UIA_OutlineThicknessPropertyId := 30164 static UIA_CenterPointPropertyId := 30165 static UIA_RotationPropertyId := 30166 static UIA_SizePropertyId := 30167 static UIA_IsSelectionPattern2AvailablePropertyId := 30168 static UIA_Selection2FirstSelectedItemPropertyId := 30169 static UIA_Selection2LastSelectedItemPropertyId := 30170 static UIA_Selection2CurrentSelectedItemPropertyId := 30171 static UIA_Selection2ItemCountPropertyId := 30172 static UIA_HeadingLevelPropertyId := 30173 static UIA_IsDialogPropertyId := 30174 UIA_PropertyId(n:="") { local static ids:="RuntimeId:30000,BoundingRectangle:30001,ProcessId:30002,ControlType:30003,LocalizedControlType:30004,Name:30005,AcceleratorKey:30006,AccessKey:30007,HasKeyboardFocus:30008,IsKeyboardFocusable:30009,IsEnabled:30010,AutomationId:30011,ClassName:30012,HelpText:30013,ClickablePoint:30014,Culture:30015,IsControlElement:30016,IsContentElement:30017,LabeledBy:30018,IsPassword:30019,NativeWindowHandle:30020,ItemType:30021,IsOffscreen:30022,Orientation:30023,FrameworkId:30024,IsRequiredForForm:30025,ItemStatus:30026,IsDockPatternAvailable:30027,IsExpandCollapsePatternAvailable:30028,IsGridItemPatternAvailable:30029,IsGridPatternAvailable:30030,IsInvokePatternAvailable:30031,IsMultipleViewPatternAvailable:30032,IsRangeValuePatternAvailable:30033,IsScrollPatternAvailable:30034,IsScrollItemPatternAvailable:30035,IsSelectionItemPatternAvailable:30036,IsSelectionPatternAvailable:30037,IsTablePatternAvailable:30038,IsTableItemPatternAvailable:30039,IsTextPatternAvailable:30040,IsTogglePatternAvailable:30041,IsTransformPatternAvailable:30042,IsValuePatternAvailable:30043,IsWindowPatternAvailable:30044,ValueValue:30045,ValueIsReadOnly:30046,RangeValueValue:30047,RangeValueIsReadOnly:30048,RangeValueMinimum:30049,RangeValueMaximum:30050,RangeValueLargeChange:30051,RangeValueSmallChange:30052,ScrollHorizontalScrollPercent:30053,ScrollHorizontalViewSize:30054,ScrollVerticalScrollPercent:30055,ScrollVerticalViewSize:30056,ScrollHorizontallyScrollable:30057,ScrollVerticallyScrollable:30058,SelectionSelection:30059,SelectionCanSelectMultiple:30060,SelectionIsSelectionRequired:30061,GridRowCount:30062,GridColumnCount:30063,GridItemRow:30064,GridItemColumn:30065,GridItemRowSpan:30066,GridItemColumnSpan:30067,GridItemContainingGrid:30068,DockDockPosition:30069,ExpandCollapseExpandCollapseState:30070,MultipleViewCurrentView:30071,MultipleViewSupportedViews:30072,WindowCanMaximize:30073,WindowCanMinimize:30074,WindowWindowVisualState:30075,WindowWindowInteractionState:30076,WindowIsModal:30077,WindowIsTopmost:30078,SelectionItemIsSelected:30079,SelectionItemSelectionContainer:30080,TableRowHeaders:30081,TableColumnHeaders:30082,TableRowOrColumnMajor:30083,TableItemRowHeaderItems:30084,TableItemColumnHeaderItems:30085,ToggleToggleState:30086,TransformCanMove:30087,TransformCanResize:30088,TransformCanRotate:30089,IsLegacyIAccessiblePatternAvailable:30090,LegacyIAccessibleChildId:30091,LegacyIAccessibleName:30092,LegacyIAccessibleValue:30093,LegacyIAccessibleDescription:30094,LegacyIAccessibleRole:30095,LegacyIAccessibleState:30096,LegacyIAccessibleHelp:30097,LegacyIAccessibleKeyboardShortcut:30098,LegacyIAccessibleSelection:30099,LegacyIAccessibleDefaultAction:30100,AriaRole:30101,AriaProperties:30102,IsDataValidForForm:30103,ControllerFor:30104,DescribedBy:30105,FlowsTo:30106,ProviderDescription:30107,IsItemContainerPatternAvailable:30108,IsVirtualizedItemPatternAvailable:30109,IsSynchronizedInputPatternAvailable:30110,OptimizeForVisualContent:30111,IsObjectModelPatternAvailable:30112,AnnotationAnnotationTypeId:30113,AnnotationAnnotationTypeName:30114,AnnotationAuthor:30115,AnnotationDateTime:30116,AnnotationTarget:30117,IsAnnotationPatternAvailable:30118,IsTextPattern2Available:30119,StylesStyleId:30120,StylesStyleName:30121,StylesFillColor:30122,StylesFillPatternStyle:30123,StylesShape:30124,StylesFillPatternColor:30125,StylesExtendedProperties:30126,IsStylesPatternAvailable:30127,IsSpreadsheetPatternAvailable:30128,SpreadsheetItemFormula:30129,SpreadsheetItemAnnotationObjects:30130,SpreadsheetItemAnnotationTypes:30131,IsSpreadsheetItemPatternAvailable:30132,Transform2CanZoom:30133,IsTransformPattern2Available:30134,LiveSetting:30135,IsTextChildPatternAvailable:30136,IsDragPatternAvailable:30137,DragIsGrabbed:30138,DragDropEffect:30139,DragDropEffects:30140,IsDropTargetPatternAvailable:30141,DropTargetDropTargetEffect:30142,DropTargetDropTargetEffects:30143,DragGrabbedItems:30144,Transform2ZoomLevel:30145,Transform2ZoomMinimum:30146,Transform2ZoomMaximum:30147,FlowsFrom:30148,IsTextEditPatternAvailable:30149,IsPeripheral:30150,IsCustomNavigationPatternAvailable:30151,PositionInSet:30152,SizeOfSet:30153,Level:30154,AnnotationTypes:30155,AnnotationObjects:30156,LandmarkType:30157,LocalizedLandmarkType:30158,FullDescription:30159,FillColor:30160,OutlineColor:30161,FillType:30162,VisualEffects:30163,OutlineThickness:30164,CenterPoint:30165,Rotation:30166,Size:30167,IsSelectionPattern2Available:30168,Selection2FirstSelectedItem:30169,Selection2LastSelectedItem:30170,Selection2CurrentSelectedItem:30171,Selection2ItemCount:30173,IsDialog:30174" if !n return ids if n is integer { RegexMatch(ids, "([^,]+):" n, m) return m1 } n := StrReplace(StrReplace(n, "UIA_"), "PropertyId") if (SubStr(n,1,7) = "Current") n := SubStr(n,8) RegexMatch(ids, "i)(?:^|,)" n "(?:" n ")?(?:Id)?:(\d+)", m) if (!m1 && (n = "type")) return 30003 return m1 } UIA_PropertyVariantType(id){ static type:={30000:0x2003,30001:0x2005,30002:3,30003:3,30004:8,30005:8,30006:8,30007:8,30008:0xB,30009:0xB,30010:0xB,30011:8,30012:8,30013:8,30014:0x2005,30015:3,30016:0xB,30017:0xB,30018:0xD,30019:0xB,30020:3,30021:8,30022:0xB,30023:3,30024:8,30025:0xB,30026:8,30027:0xB,30028:0xB,30029:0xB,30030:0xB,30031:0xB,30032:0xB,30033:0xB,30034:0xB,30035:0xB,30036:0xB,30037:0xB,30038:0xB,30039:0xB,30040:0xB,30041:0xB,30042:0xB,30043:0xB,30044:0xB,30045:8,30046:0xB,30047:5,30048:0xB,30049:5,30050:5,30051:5,30052:5,30053:5,30054:5,30055:5,30056:5,30057:0xB,30058:0xB,30059:0x200D,30060:0xB,30061:0xB,30062:3,30063:3,30064:3,30065:3,30066:3,30067:3,30068:0xD,30069:3,30070:3,30071:3,30072:0x2003,30073:0xB,30074:0xB,30075:3,30076:3,30077:0xB,30078:0xB,30079:0xB,30080:0xD,30081:0x200D,30082:0x200D,30083:0x2003,30084:0x200D,30085:0x200D,30086:3,30087:0xB,30088:0xB,30089:0xB,30090:0xB,30091:3,30092:8,30093:8,30094:8,30095:3,30096:3,30097:8,30098:8,30099:0x200D,30100:8}, type2:={30101:8,30102:8,30103:0xB,30104:0xD,30105:0xD,30106:0xD,30107:8,30108:0xB,30109:0xB,30110:0xB,30111:0xB,30112:0xB,30113:3,30114:8,30115:8,30116:8,30117:0xD,30118:0xB,30119:0xB,30120:3,30121:8,30122:3,30123:8,30124:8,30125:3,30126:8,30127:0xB,30128:0xB,30129:8,30130:0x200D,30131:0x2003,30132:0xB,30133:0xB,30134:0xB,30135:3,30136:0xB,30137:0xB,30138:0xB,30139:8,30140:0x2008,30141:0xB,30142:8,30143:0x2008,30144:0x200D,30145:5,30146:5,30147:5,30148:0x200D,30149:0xB,30150:0xB,30151:0xB,30152:3,30153:3,30154:3,30155:0x2003,30156:0x2003,30157:3,30158:8,30159:8,30160:3,30161:0x2003,30162:3,30163:3,30164:0x2005,30165:0x2005,30166:5,30167:0x2005,30168:0xB} ; missing VTs from 30169 and on return ObjHasKey(type, id) ? type[id] : type2[id] } ; module UIA_TextAttributeIds static UIA_AnimationStyleAttributeId := 40000 static UIA_BackgroundColorAttributeId := 40001 static UIA_BulletStyleAttributeId := 40002 static UIA_CapStyleAttributeId := 40003 static UIA_CultureAttributeId := 40004 static UIA_FontNameAttributeId := 40005 static UIA_FontSizeAttributeId := 40006 static UIA_FontWeightAttributeId := 40007 static UIA_ForegroundColorAttributeId := 40008 static UIA_HorizontalTextAlignmentAttributeId := 40009 static UIA_IndentationFirstLineAttributeId := 40010 static UIA_IndentationLeadingAttributeId := 40011 static UIA_IndentationTrailingAttributeId := 40012 static UIA_IsHiddenAttributeId := 40013 static UIA_IsItalicAttributeId := 40014 static UIA_IsReadOnlyAttributeId := 40015 static UIA_IsSubscriptAttributeId := 40016 static UIA_IsSuperscriptAttributeId := 40017 static UIA_MarginBottomAttributeId := 40018 static UIA_MarginLeadingAttributeId := 40019 static UIA_MarginTopAttributeId := 40020 static UIA_MarginTrailingAttributeId := 40021 static UIA_OutlineStylesAttributeId := 40022 static UIA_OverlineColorAttributeId := 40023 static UIA_OverlineStyleAttributeId := 40024 static UIA_StrikethroughColorAttributeId := 40025 static UIA_StrikethroughStyleAttributeId := 40026 static UIA_TabsAttributeId := 40027 static UIA_TextFlowDirectionsAttributeId := 40028 static UIA_UnderlineColorAttributeId := 40029 static UIA_UnderlineStyleAttributeId := 40030 static UIA_AnnotationTypesAttributeId := 40031 static UIA_AnnotationObjectsAttributeId := 40032 static UIA_StyleNameAttributeId := 40033 static UIA_StyleIdAttributeId := 40034 static UIA_LinkAttributeId := 40035 static UIA_IsActiveAttributeId := 40036 static UIA_SelectionActiveEndAttributeId := 40037 static UIA_CaretPositionAttributeId := 40038 static UIA_CaretBidiModeAttributeId := 40039 static UIA_LineSpacingAttributeId := 40040 static UIA_BeforeParagraphSpacingAttributeId := 40041 static UIA_AfterParagraphSpacingAttributeId := 40042 static UIA_SayAsInterpretAsAttributeId := 40043 UIA_AttributeId(n:="") { static id:={AnimationStyle:40000,BackgroundColor:40001,BulletStyle:40002,CapStyle:40003,Culture:40004,FontName:40005,FontSize:40006,FontWeight:40007,ForegroundColor:40008,HorizontalTextAlignment:40009,IndentationFirstLine:40010,IndentationLeading:40011,IndentationTrailing:40012,IsHidden:40013,IsItalic:40014,IsReadOnly:40015,IsSubscript:40016,IsSuperscript:40017,MarginBottom:40018,MarginLeading:40019,MarginTop:40020,MarginTrailing:40021,OutlineStyles:40022,OverlineColor:40023,OverlineStyle:40024,StrikethroughColor:40025,StrikethroughStyle:40026,Tabs:40027,TextFlowDirections:40028,UnderlineColor:40029,UnderlineStyle:40030,AnnotationTypes:40031,AnnotationObjects:40032,StyleName:40033,StyleId:40034,Link:40035,IsActive:40036,SelectionActiveEnd:40037,CaretPosition:40038,CaretBidiMode:40039,LineSpacing:40040,BeforeParagraphSpacing:40041,AfterParagraphSpacing:40042,SayAsInterpretAs:40043}, name:={40000:"AnimationStyle",40001:"BackgroundColor",40002:"BulletStyle",40003:"CapStyle",40004:"Culture",40005:"FontName",40006:"FontSize",40007:"FontWeight",40008:"ForegroundColor",40009:"HorizontalTextAlignment",40010:"IndentationFirstLine",40011:"IndentationLeading",40012:"IndentationTrailing",40013:"IsHidden",40014:"IsItalic",40015:"IsReadOnly",40016:"IsSubscript",40017:"IsSuperscript",40018:"MarginBottom",40019:"MarginLeading",40020:"MarginTop",40021:"MarginTrailing",40022:"OutlineStyles",40023:"OverlineColor",40024:"OverlineStyle",40025:"StrikethroughColor",40026:"StrikethroughStyle",40027:"Tabs",40028:"TextFlowDirections",40029:"UnderlineColor",40030:"UnderlineStyle",40031:"AnnotationTypes",40032:"AnnotationObjects",40033:"StyleName",40034:"StyleId",40035:"Link",40036:"IsActive",40037:"SelectionActiveEnd",40038:"CaretPosition",40039:"CaretBidiMode",40040:"LineSpacing",40041:"BeforeParagraphSpacing",40042:"AfterParagraphSpacing",40043:"SayAsInterpretAs"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "AttributeId"), "UIA_")] } UIA_AttributeVariantType(id){ Static type:={40000:3,40001:3,40002:3,40003:3,40004:3,40005:8,40006:5,40007:3,40008:3,40009:3,40010:5,40011:5,40012:5,40013:0xB,40014:0xB,40015:0xB,40016:0xB,40017:0xB,40018:5,40019:5,40020:5,40021:5,40022:3,40023:3,40024:3,40025:3,40026:3,40027:0x2005,40028:3,40029:3,40030:3,40031:0x2003,40032:0x200D,40033:8,40034:3,40035:0xD,40036:0xB,40037:3,40038:3,40039:3,40040:8,40041:5,40042:5,40043:8} ; 40032 and 40043 might be incorrect return type[id] } ; module UIA_ControlTypeIds static UIA_ButtonControlTypeId := 50000 static UIA_CalendarControlTypeId := 50001 static UIA_CheckBoxControlTypeId := 50002 static UIA_ComboBoxControlTypeId := 50003 static UIA_EditControlTypeId := 50004 static UIA_HyperlinkControlTypeId := 50005 static UIA_ImageControlTypeId := 50006 static UIA_ListItemControlTypeId := 50007 static UIA_ListControlTypeId := 50008 static UIA_MenuControlTypeId := 50009 static UIA_MenuBarControlTypeId := 50010 static UIA_MenuItemControlTypeId := 50011 static UIA_ProgressBarControlTypeId := 50012 static UIA_RadioButtonControlTypeId := 50013 static UIA_ScrollBarControlTypeId := 50014 static UIA_SliderControlTypeId := 50015 static UIA_SpinnerControlTypeId := 50016 static UIA_StatusBarControlTypeId := 50017 static UIA_TabControlTypeId := 50018 static UIA_TabItemControlTypeId := 50019 static UIA_TextControlTypeId := 50020 static UIA_ToolBarControlTypeId := 50021 static UIA_ToolTipControlTypeId := 50022 static UIA_TreeControlTypeId := 50023 static UIA_TreeItemControlTypeId := 50024 static UIA_CustomControlTypeId := 50025 static UIA_GroupControlTypeId := 50026 static UIA_ThumbControlTypeId := 50027 static UIA_DataGridControlTypeId := 50028 static UIA_DataItemControlTypeId := 50029 static UIA_DocumentControlTypeId := 50030 static UIA_SplitButtonControlTypeId := 50031 static UIA_WindowControlTypeId := 50032 static UIA_PaneControlTypeId := 50033 static UIA_HeaderControlTypeId := 50034 static UIA_HeaderItemControlTypeId := 50035 static UIA_TableControlTypeId := 50036 static UIA_TitleBarControlTypeId := 50037 static UIA_SeparatorControlTypeId := 50038 static UIA_SemanticZoomControlTypeId := 50039 static UIA_AppBarControlTypeId := 50040 UIA_ControlTypeId(n:="") { static id:={Button:50000,Calendar:50001,CheckBox:50002,ComboBox:50003,Edit:50004,Hyperlink:50005,Image:50006,ListItem:50007,List:50008,Menu:50009,MenuBar:50010,MenuItem:50011,ProgressBar:50012,RadioButton:50013,ScrollBar:50014,Slider:50015,Spinner:50016,StatusBar:50017,Tab:50018,TabItem:50019,Text:50020,ToolBar:50021,ToolTip:50022,Tree:50023,TreeItem:50024,Custom:50025,Group:50026,Thumb:50027,DataGrid:50028,DataItem:50029,Document:50030,SplitButton:50031,Window:50032,Pane:50033,Header:50034,HeaderItem:50035,Table:50036,TitleBar:50037,Separator:50038,SemanticZoom:50039,AppBar:50040}, name:={50000:"Button",50001:"Calendar",50002:"CheckBox",50003:"ComboBox",50004:"Edit",50005:"Hyperlink",50006:"Image",50007:"ListItem",50008:"List",50009:"Menu",50010:"MenuBar",50011:"MenuItem",50012:"ProgressBar",50013:"RadioButton",50014:"ScrollBar",50015:"Slider",50016:"Spinner",50017:"StatusBar",50018:"Tab",50019:"TabItem",50020:"Text",50021:"ToolBar",50022:"ToolTip",50023:"Tree",50024:"TreeItem",50025:"Custom",50026:"Group",50027:"Thumb",50028:"DataGrid",50029:"DataItem",50030:"Document",50031:"SplitButton",50032:"Window",50033:"Pane",50034:"Header",50035:"HeaderItem",50036:"Table",50037:"TitleBar",50038:"Separator",50039:"SemanticZoom",50040:"AppBar"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "ControlTypeId"), "UIA_")] } ; module AnnotationType static UIA_AnnotationType_Unknown := 60000 static UIA_AnnotationType_SpellingError := 60001 static UIA_AnnotationType_GrammarError := 60002 static UIA_AnnotationType_Comment := 60003 static UIA_AnnotationType_FormulaError := 60004 static UIA_AnnotationType_TrackChanges := 60005 static UIA_AnnotationType_Header := 60006 static UIA_AnnotationType_Footer := 60007 static UIA_AnnotationType_Highlighted := 60008 static UIA_AnnotationType_Endnote := 60009 static UIA_AnnotationType_Footnote := 60010 static UIA_AnnotationType_InsertionChange := 60011 static UIA_AnnotationType_DeletionChange := 60012 static UIA_AnnotationType_MoveChange := 60013 static UIA_AnnotationType_FormatChange := 60014 static UIA_AnnotationType_UnsyncedChange := 60015 static UIA_AnnotationType_EditingLockedChange := 60016 static UIA_AnnotationType_ExternalChange := 60017 static UIA_AnnotationType_ConflictingChange := 60018 static UIA_AnnotationType_Author := 60019 static UIA_AnnotationType_AdvancedProofingIssue := 60020 static UIA_AnnotationType_DataValidationError := 60021 static UIA_AnnotationType_CircularReferenceError := 60022 static UIA_AnnotationType_Mathematics := 60023 UIA_AnnotationType(n:="") { static id:={Unknown:60000,SpellingError:60001,GrammarError:60002,Comment:60003,FormulaError:60004,TrackChanges:60005,Header:60006,Footer:60007,Highlighted:60008,Endnote:60009,Footnote:60010,InsertionChange:60011,DeletionChange:60012,MoveChange:60013,FormatChange:60014,UnsyncedChange:60015,EditingLockedChange:60016,ExternalChange:60017,ConflictingChange:60018,Author:60019,AdvancedProofingIssue:60020,DataValidationError:60021,CircularReferenceError:60022,Mathematics:60023}, name:={60000:"Unknown",60001:"SpellingError",60002:"GrammarError",60003:"Comment",60004:"FormulaError",60005:"TrackChanges",60006:"Header",60007:"Footer",60008:"Highlighted",60009:"Endnote",60010:"Footnote",60011:"InsertionChange",60012:"DeletionChange",60013:"MoveChange",60014:"FormatChange",60015:"UnsyncedChange",60016:"EditingLockedChange",60017:"ExternalChange",60018:"ConflictingChange",60019:"Author",60020:"AdvancedProofingIssue",60021:"DataValidationError",60022:"CircularReferenceError",60023:"Mathematics"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrSplit(n, "_").Pop()] } ; module StyleId static UIA_StyleId_Custom := 70000 static UIA_StyleId_Heading1 := 70001 static UIA_StyleId_Heading2 := 70002 static UIA_StyleId_Heading3 := 70003 static UIA_StyleId_Heading4 := 70004 static UIA_StyleId_Heading5 := 70005 static UIA_StyleId_Heading6 := 70006 static UIA_StyleId_Heading7 := 70007 static UIA_StyleId_Heading8 := 70008 static UIA_StyleId_Heading9 := 70009 static UIA_StyleId_Title := 70010 static UIA_StyleId_Subtitle := 70011 static UIA_StyleId_Normal := 70012 static UIA_StyleId_Emphasis := 70013 static UIA_StyleId_Quote := 70014 static UIA_StyleId_BulletedList := 70015 static UIA_StyleId_NumberedList := 70016 UIA_StyleId(n:="") { static id:={Custom:70000,Heading1:70001,Heading2:70002,Heading3:70003,Heading4:70004,Heading5:70005,Heading6:70006,Heading7:70007,Heading8:70008,Heading9:70009,Title:70010,Subtitle:70011,Normal:70012,Emphasis:70013,Quote:70014,BulletedList:70015,NumberedList:70016}, name:={70000:"Custom",70001:"Heading1",70002:"Heading2",70003:"Heading3",70004:"Heading4",70005:"Heading5",70006:"Heading6",70007:"Heading7",70008:"Heading8",70009:"Heading9",70010:"Title",70011:"Subtitle",70012:"Normal",70013:"Emphasis",70014:"Quote",70015:"BulletedList",70016:"NumberedList"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrSplit(n, "_").Pop()] } ; module LandmarkTypeIds static UIA_CustomLandmarkTypeId := 80000 static UIA_FormLandmarkTypeId := 80001 static UIA_MainLandmarkTypeId := 80002 static UIA_NavigationLandmarkTypeId := 80003 static UIA_SearchLandmarkTypeId := 80004 UIA_LandmarkTypeId(n:="") { static id:={Custom:80000,Form:80001,Main:80002,Navigation:80003,Search:80004}, name:={80000:"Custom",80001:"Form",80002:"Main",80003:"Navigation",80004:"Search"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "LandmarkTypeId"), "UIA_")] } ; module HeadingLevelIds static UIA_HeadingLevel_None := 80050 static UIA_HeadingLevel1 := 80051 static UIA_HeadingLevel2 := 80052 static UIA_HeadingLevel3 := 80053 static UIA_HeadingLevel4 := 80054 static UIA_HeadingLevel5 := 80055 static UIA_HeadingLevel6 := 80056 static UIA_HeadingLevel7 := 80057 static UIA_HeadingLevel8 := 80058 static UIA_HeadingLevel9 := 80059 UIA_HeadingLevel(n:="") { static id:={None:80050, 1:80051, 2:80052, 3:80053, 4:80054, 5:80055, 6:80056, 7:80057, 8:80058, 9:80059}, name:={80050:"None", 80051:"1", 80052:"2", 80053:"3", 80054:"4", 80055:"5", 80056:"6", 80057:"7", 80058:"8", 80059:"9"} if !n return id if n is integer return (n > 80000)?name[n]:id[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "HeadingLevel"), "UIA_")] } ; module ChangeIds static UIA_SummaryChangeId := 90000 UIA_ChangeId(n:="") { static id:={Summary:90000}, name:={90000:"Summary"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "ChangeId"), "UIA_")] } ; module MetadataIds static UIA_SayAsInterpretAsMetadataId := 100000 UIA_MetadataId(n:="") { static id:={SayAsInterpretAs:100000}, name:={100000:"SayAsInterpretAs"} if !n return id if n is integer return name[n] if ObjHasKey(id, n) return id[n] return id[StrReplace(StrReplace(n, "MetadataId"), "UIA_")] } ; Uiautomationcoreapi.h enumerations ; enum AsyncContentLoadedState Contains values that describe the progress of asynchronous loading of content. static AsyncContentLoadedState_Beginning := 0 static AsyncContentLoadedState_Progress := 1 static AsyncContentLoadedState_Completed := 2 AsyncContentLoadedState(Value:="") { static v1:={0:"Beginning", 1:"Progress", 2:"Completed"} if Value is not integer return this["AsyncContentLoadedState_" Value] return (Value=="")?v1:v1[Value] } ; enum AutomationIdentifierType Contains values used in the UiaLookupId function static AutomationIdentifierType_Property := 0 static AutomationIdentifierType_Pattern := 1 static AutomationIdentifierType_Event := 2 static AutomationIdentifierType_ControlType := 3 static AutomationIdentifierType_TextAttribute := 4 static AutomationIdentifierType_LandmarkType := 5 static AutomationIdentifierType_Annotation := 6 static AutomationIdentifierType_Changes := 7 static AutomationIdentifierType_Style := 8 AutomationIdentifierType(Value:="") { static v1:={0:"Property", 1:"Pattern", 2:"Event", 3:"ControlType", 4:"TextAttribute", 5:"LandmarkType", 6:"Annotation", 7:"Changes", 8:"Style"} if Value is not integer return this["AutomationIdentifierType_" Value] return (Value=="")?v1:v1[Value] } ; enum ConditionType Contains values that specify a type of UiaCondition. static ConditionType_True := 0 static ConditionType_False := 1 static ConditionType_Property := 2 static ConditionType_And := 3 static ConditionType_Or := 4 static ConditionType_Not := 5 ConditionType(Value:="") { static v1:={0:"True", 1:"False", 2:"Property", 3:"And", 4:"Or", 5:"Not"} if Value is not integer return this["ConditionType_" Value] return (Value=="")?v1:v1[Value] } ; enum EventArgsType static EventArgsType_Simple := 0 static EventArgsType_PropertyChanged := 1 static EventArgsType_StructureChanged := 2 static EventArgsType_AsyncContentLoaded := 3 static EventArgsType_WindowClosed := 4 static EventArgsType_TextEditTextChanged := 5 static EventArgsType_Changes := 6 static EventArgsType_Notification := 7 static EventArgsType_ActiveTextPositionChanged := 8 static EventArgsType_StructuredMarkup := 9 EventArgsType(Value:="") { static v1:={0:"Simple", 1:"PropertyChanged", 2:"StructureChanged", 3:"AsyncContentLoaded", 4:"WindowClosed", 5:"TextEditTextChanged", 6:"Changes", 7:"Notification", 8:"ActiveTextPositionChanged", 9:"StructuredMarkup"} if Value is not integer return this["EventArgsType_" Value] return (Value=="")?v1:v1[Value] } ; Uiautomationclient.h enumerations ; enum AutomationElementMode Contains values that specify the type of reference to use when returning UI Automation elements. static AutomationElementMode_None := 0x0 static AutomationElementMode_Full := 0x1 AutomationElementMode(Value:="") { static v1:={0x0:"None", 0x1:"Full"} if Value is not integer return this["AutomationElementMode_" Value] return (Value=="")?v1:v1[Value] } ; enum CoalesceEventsOptions Contains possible values for the CoalesceEvents property, which indicates whether an accessible technology client receives all events, or a subset where duplicate events are detected and filtered. static CoalesceEventsOptions_Disabled := 0x0 static CoalesceEventsOptions_Enabled := 0x1 CoalesceEventsOptions(Value:="") { static v1:={0x0:"Disabled", 0x1:"Enabled"} if Value is not integer return this["CoalesceEventsOptions_" Value] return (Value=="")?v1:v1[Value] } ; enum ConnectionRecoveryBehaviorOptions Contains possible values for the ConnectionRecoveryBehavior property, which indicates whether an accessible technology client adjusts provider request timeouts when the provider is non-responsive. static ConnectionRecoveryBehaviorOptions_Disabled := 0 static ConnectionRecoveryBehaviorOptions_Enabled := 0x1 ConnectionRecoveryBehaviorOptions(Value:="") { static v1:={0x0:"Disabled", 0x1:"Enabled"} if Value is not integer return this["ConnectionRecoveryBehaviorOptions_" Value] return (Value=="")?v1:v1[Value] } ; enum PropertyConditionFlags Contains values used in creating property conditions. static PropertyConditionFlags_None := 0x0 static PropertyConditionFlags_IgnoreCase := 0x1 static PropertyConditionFlags_MatchSubstring = 0x2 PropertyConditionFlags(Value:="") { static v1:={0x0:"None", 0x1:"IgnoreCase", 0x2:"MatchSubstring"} if Value is not integer return this["PropertyConditionFlags_" Value] return (Value=="")?v1:v1[Value] } ; enum TreeScope Contains values that specify the scope of various operations in the Microsoft UI Automation tree. static TreeScope_None := 0x0 static TreeScope_Element := 0x1 static TreeScope_Children := 0x2 static TreeScope_Descendants := 0x4 static TreeScope_Parent := 0x8 static TreeScope_Ancestors := 0x10 static TreeScope_Subtree := 0x7 TreeScope(Value:="") { static v1:={0x0:"None", 0x1:"Element", 0x2:"Children", 0x4:"Descendants", 0x8:"Parent", 0x10:"Ancestors", 0x7:"Subtree"} if Value is not integer return this["TreeScope_" Value] return (Value=="")?v1:v1[Value] } ;enum TreeTraversalOptions Defines values that can be used to customize tree navigation order. static TreeTraversalOptions_Default := 0x0 static TreeTraversalOptions_PostOrder := 0x1 static TreeTraversalOptions_LastToFirstOrder := 0x2 TreeTraversalOptions(Value:="") { static v1:={0x0:"Default", 0x1:"PostOrder", 0x2:"LastToFirstOrder"} if Value is not integer return this["TreeTraversalOptions_" Value] return (Value=="")?v1:v1[Value] } ; Uiautomationcore.h enumerations ; enum ActiveEnd Contains possible values for the SelectionActiveEnd text attribute, which indicates the location of the caret relative to a text range that represents the currently selected text. static ActiveEnd_None := 0 static ActiveEnd_Start := 1 static ActiveEnd_End := 2 ActiveEnd(Value:="") { static v1:={0x0:"None", 0x1:"Start", 0x2:"End"} if Value is not integer return this["ActiveEnd_" Value] return (Value=="")?v1:v1[Value] } ; enum AnimationStyle Contains values for the AnimationStyle text attribute. static AnimationStyle_None := 0 static AnimationStyle_LasVegasLights := 1 static AnimationStyle_BlinkingBackground := 2 static AnimationStyle_SparkleText := 3 static AnimationStyle_MarchingBlackAnts := 4 static AnimationStyle_MarchingRedAnts := 5 static AnimationStyle_Shimmer := 6 static AnimationStyle_Other := -1 AnimationStyle(Value:="") { static v1:={0:"None", 1:"LasVegasLights",2:"BlinkingBackground", 3:"SparkleText",4:"MarchingBlackAnts", 5:"MarchingRedAnts", 6:"Shimmer", -1:"Other"} if Value is not integer return this["AnimationStyle_" Value] return (Value=="")?v1:v1[Value] } ; enum BulletStyle Contains values for the BulletStyle text attribute. static BulletStyle_None := 0 static BulletStyle_HollowRoundBullet := 1 static BulletStyle_FilledRoundBullet := 2 static BulletStyle_HollowSquareBullet := 3 static BulletStyle_FilledSquareBullet := 4 static BulletStyle_DashBullet := 5 static BulletStyle_Other := -1 BulletStyle(Value:="") { static v1:={0:"None", 1:"HollowRoundBullet",2:"FilledRoundBullet", 3:"HollowSquareBullet",4:"FilledSquareBullet", 5:"DashBullet", -1:"Other"} if Value is not integer return this["BulletStyle_" Value] return (Value=="")?v1:v1[Value] } ; enum CapStyle Contains values that specify the value of the CapStyle text attribute. static CapStyle_None := 0 static CapStyle_SmallCap := 1 static CapStyle_AllCap := 2 static CapStyle_AllPetiteCaps := 3 static CapStyle_PetiteCaps := 4 static CapStyle_Unicase := 5 static CapStyle_Titling := 6 static CapStyle_Other := -1 CapStyle(Value:="") { static v1:={0:"None", 1:"SmallCap",2:"AllCap", 3:"AllPetiteCaps",4:"PetiteCaps", 5:"Unicase",6:"Titling", -1:"Other"} if Value is not integer return this["CapStyle_" Value] return (Value=="")?v1:v1[Value] } ; enum CaretBidiMode Contains possible values for the CaretBidiMode text attribute, which indicates whether the caret is in text that flows from left to right, or from right to left. static CaretBidiMode_LTR := 0 static CaretBidiMode_RTL := 1 CaretBidiMode(Value:="") { static v1:={0:"LTR", 1:"RTL"} if Value is not integer return this["CaretBidiMode_" Value] return (Value=="")?v1:v1[Value] } ; enum CaretPosition Contains possible values for the CaretPosition text attribute, which indicates the location of the caret relative to a line of text in a text range. static CaretPosition_Unknown := 0 static CaretPosition_EndOfLine := 1 static CaretPosition_BeginningOfLine := 2 CaretPosition(Value:="") { static v1:={0:"Unknown", 1:"EndOfLine", 2:"BeginningOfLine"} if Value is not integer return this["CaretPosition_" Value] return (Value=="")?v1:v1[Value] } ; enum DockPosition Contains values that specify the location of a docking window represented by the Dock control pattern. static DockPosition_Top := 0x0 static DockPosition_Left := 0x1 static DockPosition_Bottom := 0x2 static DockPosition_Right := 0x3 static DockPosition_Fill := 0x4 static DockPosition_None := 0x5 DockPosition(Value:="") { static v1:={0x0:"Top", 0x1:"Left", 0x2:"Bottom", 0x3:"Right", 0x4:"Fill", 0x5:"None"} if Value is not integer return this["DockPosition_" Value] return (Value=="")?v1:v1[Value] } ; enum ExpandCollapseState Contains values that specify the state of a UI element that can be expanded and collapsed. static ExpandCollapseState_Collapsed := 0x0 static ExpandCollapseState_Expanded := 0x1 static ExpandCollapseState_PartiallyExpanded := 0x2 static ExpandCollapseState_LeafNode := 0x3 ExpandCollapseState(Value:="") { static v1:={0x0:"Collapsed", 0x1:"Expanded", 0x2:"PartiallyExpanded", 0x3:"LeafNode"} if Value is not integer return this["ExpandCollapseState_" Value] return (Value=="")?v1:v1[Value] } ; enum FillType Contains values for the FillType attribute. static FillType_None := 0 static FillType_Color := 1 static FillType_Gradient := 2 static FillType_Picture := 3 static FillType_Pattern := 4 FillType(Value:="") { static v1:={0x0:"None", 0x1:"Color", 0x2:"Gradient", 0x3:"Picture", 0x4:"Pattern"} if Value is not integer return this["FillType_" Value] return (Value=="")?v1:v1[Value] } ; enum FlowDirection Contains values for the TextFlowDirections text attribute. static FlowDirections_Default := 0 static FlowDirections_RightToLeft := 0x1 static FlowDirections_BottomToTop := 0x2 static FlowDirections_Vertical := 0x4 FlowDirection(Value:="") { static v1:={0x0:"Default", 0x1:"RightToLeft", 0x2:"BottomToTop", 0x4:"Vertical"} if Value is not integer return this["FlowDirection_" Value] return (Value=="")?v1:v1[Value] } ;enum LiveSetting Contains possible values for the LiveSetting property. This property is implemented by provider elements that are part of a live region. static LiveSetting_Off := 0x0 static LiveSetting_Polite := 0x1 static LiveSetting_Assertive := 0x2 LiveSetting(Value:="") { static v1:={0x0:"Off", 0x1:"Polite", 0x2:"Assertive"} if Value is not integer return this["LiveSetting_" Value] return (Value=="")?v1:v1[Value] } ; enum NavigateDirection Contains values used to specify the direction of navigation within the Microsoft UI Automation tree. static NavigateDirection_Parent := 0x0 static NavigateDirection_NextSibling := 0x1 static NavigateDirection_PreviousSibling := 0x2 static NavigateDirection_FirstChild := 0x3 static NavigateDirection_LastChild := 0x4 NavigateDirection(Value:="") { static v1:={0x0:"Parent", 0x1:"NextSibling", 0x2:"PreviousSibling", 0x3:"FirstChild", 0x4:"LastChild"} if Value is not integer return this["NavigateDirection_" Value] return (Value=="")?v1:v1[Value] } ; enum NotificationKind Defines values that indicate the type of a notification event, and a hint to the listener about the processing of the event. static NotificationKind_ItemAdded := 0 static NotificationKind_ItemRemoved := 1 static NotificationKind_ActionCompleted := 2 static NotificationKind_ActionAborted := 3 static NotificationKind_Other := 4 NotificationKind(Value:="") { static v1:={0x0:"ItemAdded", 0x1:"ItemRemoved", 0x2:"ActionCompleted", 0x3:"ActionAborted", 0x4:"Other"} if Value is not integer return this["NotificationKind_" Value] return (Value=="")?v1:v1[Value] } ; enum NotificationProcessing Defines values that indicate how a notification should be processed. static NotificationProcessing_ImportantAll := 0 static NotificationProcessing_ImportantMostRecent := 1 static NotificationProcessing_All := 2 static NotificationProcessing_MostRecent := 3 static NotificationProcessing_CurrentThenMostRecent := 4 NotificationProcessing(Value:="") { static v1:={0x0:"ImportantAll", 0x1:"ImportantMostRecent", 0x2:"All", 0x3:"MostRecent", 0x4:"CurrentThenMostRecent"} if Value is not integer return this["NotificationProcessing_" Value] return (Value=="")?v1:v1[Value] } ; enum OrientationType Contains values that specify the orientation of a control. static OrientationType_None := 0x0 static OrientationType_Horizontal := 0x1 static OrientationType_Vertical := 0x2 OrientationType(Value:="") { static v1:={0x0:"None", 0x1:"Horizontal", 0x2:"Vertical"} if Value is not integer return this["OrientationType_" Value] return (Value=="")?v1:v1[Value] } ; enum OutlineStyles Contains values for the OutlineStyle text attribute. static OutlineStyles_None := 0 static OutlineStyles_Outline := 1 static OutlineStyles_Shadow := 2 static OutlineStyles_Engraved := 4 static OutlineStyles_Embossed := 8 OutlineStyles(Value:="") { static v1:={0:"None", 1:"Outline", 2:"Shadow", 4:"Engraved", 8:"Embossed"} if Value is not integer return this["OutlineStyles_" Value] return (Value=="")?v1:v1[Value] } ;enum ProviderOptions static ProviderOptions_ClientSideProvider := 0x1 static ProviderOptions_ServerSideProvider := 0x2 static ProviderOptions_NonClientAreaProvider := 0x4 static ProviderOptions_OverrideProvider := 0x8 static ProviderOptions_ProviderOwnsSetFocus := 0x10 static ProviderOptions_UseComThreading := 0x20 static ProviderOptions_RefuseNonClientSupport := 0x40 static ProviderOptions_HasNativeIAccessible := 0x80 static ProviderOptions_UseClientCoordinates := 0x100 ProviderOptions(Value:="") { static v1:={0x1:"ClientSideProvider", 0x2:"ServerSideProvider", 0x4:"NonClientAreaProvider", 0x8:"OverrideProvider", 0x10:"ProviderOwnsSetFocus", 0x20:"UseComThreading", 0x40:"RefuseNonClientSupport", 0x80:"HasNativeIAccessible", 0x100:"UseClientCoordinates"} if Value is not integer return this["ProviderOptions_" Value] return (Value=="")?v1:v1[Value] } ; enum RowOrColumnMajor Contains values that specify whether data in a table should be read primarily by row or by column. static RowOrColumnMajor_RowMajor := 0x0 static RowOrColumnMajor_ColumnMajor := 0x1 static RowOrColumnMajor_Indeterminate := 0x2 RowOrColumnMajor(Value:="") { static v1:={0x0:"RowMajor", 0x1:"ColumnMajor", 0x2:"Indeterminate"} if Value is not integer return this["RowOrColumnMajor_" Value] return (Value=="")?v1:v1[Value] } ; enum SayAsInterpretAs Defines the values that indicate how a text-to-speech engine should interpret specific data. static SayAsInterpretAs_None := 0 static SayAsInterpretAs_Spell := 1 static SayAsInterpretAs_Cardinal := 2 static SayAsInterpretAs_Ordinal := 3 static SayAsInterpretAs_Number := 4 static SayAsInterpretAs_Date := 5 static SayAsInterpretAs_Time := 6 static SayAsInterpretAs_Telephone := 7 static SayAsInterpretAs_Currency := 8 static SayAsInterpretAs_Net := 9 static SayAsInterpretAs_Url := 10 static SayAsInterpretAs_Address := 11 static SayAsInterpretAs_Alphanumeric := 12 static SayAsInterpretAs_Name := 13 static SayAsInterpretAs_Media := 14 static SayAsInterpretAs_Date_MonthDayYear := 15 static SayAsInterpretAs_Date_DayMonthYear := 16 static SayAsInterpretAs_Date_YearMonthDay := 17 static SayAsInterpretAs_Date_YearMonth := 18 static SayAsInterpretAs_Date_MonthYear := 19 static SayAsInterpretAs_Date_DayMonth := 20 static SayAsInterpretAs_Date_MonthDay := 21 static SayAsInterpretAs_Date_Year := 22 static SayAsInterpretAs_Time_HoursMinutesSeconds12 := 23 static SayAsInterpretAs_Time_HoursMinutes12 := 24 static SayAsInterpretAs_Time_HoursMinutesSeconds24 := 25 static SayAsInterpretAs_Time_HoursMinutes24 := 26 SayAsInterpretAs(Value:="") { static v1:={0:"None", 1:"Spell", 2:"Cardinal", 3:"Ordinal", 4:"Number", 5:"Date", 6:"Time", 7:"Telephone", 8:"Currency", 9:"Net", 10:"Url", 11:"Address", 13:"Name", 14:"Media", 15:"Date_MonthDayYear", 16:"Date_DayMonthYear", 17:"Date_YearMonthDay", 18:"Date_YearMonth", 19:"Date_MonthYear", 20:"Date_DayMonth", 21:"Date_MonthDay", 22:"Date_Year", 23:"Time_HoursMinutesSeconds12", 24:"Time_HoursMinutes12", 25:"Time_HoursMinutesSeconds24", 26:"Time_HoursMinutes24"} if Value is not integer return this["SayAsInterpretAs_" Value] return (Value=="")?v1:v1[Value] } ; enum ScrollAmount Contains values that specify the direction and distance to scroll. static ScrollAmount_LargeDecrement := 0x0 static ScrollAmount_SmallDecrement := 0x1 static ScrollAmount_NoAmount := 0x2 static ScrollAmount_LargeIncrement := 0x3 static ScrollAmount_SmallIncrement := 0x4 ScrollAmount(Value:="") { static v1:={0x0:"LargeDecrement", 0x1:"SmallDecrement", 0x2:"NoAmount", 0x3:"LargeIncrement", 0x4:"SmallIncrement"} if Value is not integer return this["ScrollAmount_" Value] return (Value=="")?v1:v1[Value] } ; enum StructureChangeType Contains values that specify the type of change in the Microsoft UI Automation tree structure. static StructureChangeType_ChildAdded := 0x0 static StructureChangeType_ChildRemoved := 0x1 static StructureChangeType_ChildrenInvalidated := 0x2 static StructureChangeType_ChildrenBulkAdded := 0x3 static StructureChangeType_ChildrenBulkRemoved := 0x4 static StructureChangeType_ChildrenReordered := 0x5 StructureChangeType(Value:="") { static v1:={0x0:"ChildAdded", 0x1:"ChildRemoved", 0x2:"ChildrenInvalidated", 0x3:"ChildrenBulkAdded", 0x4:"ChildrenBulkRemoved", 0x5:"ChildrenReordered"} if Value is not integer return this["StructureChangeType_" Value] return (Value=="")?v1:v1[Value] } ; enum SupportedTextSelection Contains values that specify the supported text selection attribute. static SupportedTextSelection_None := 0x0 static SupportedTextSelection_Single := 0x1 static SupportedTextSelection_Multiple := 0x2 SupportedTextSelection(Value:="") { static v1:={0x0:"None", 0x1:"Single", 0x2:"Multiple"} if Value is not integer return this["SupportedTextSelection_" Value] return (Value=="")?v1:v1[Value] } ; enum SynchronizedInputType Contains values that specify the type of synchronized input. static SynchronizedInputType_KeyUp := 0x1 static SynchronizedInputType_KeyDown := 0x2 static SynchronizedInputType_LeftMouseUp := 0x4 static SynchronizedInputType_LeftMouseDown := 0x8 static SynchronizedInputType_RightMouseUp := 0x10 static SynchronizedInputType_RightMouseDown := 0x20 SynchronizedInputType(Value:="") { static v1:={0x1:"KeyUp", 0x2:"KeyDown", 0x4:"LeftMouseUp", 0x8:"LeftMouseDown", 0x10:"RightMouseUp", 0x20:"RightMouseDown"} if Value is not integer return this["SynchronizedInputType_" Value] return (Value=="")?v1:v1[Value] } ; enum TextDecorationLineStyle Contains values that specify the OverlineStyle, StrikethroughStyle, and UnderlineStyle text attributes. static TextDecorationLineStyle_None := 0 static TextDecorationLineStyle_Single := 1 static TextDecorationLineStyle_WordsOnly := 2 static TextDecorationLineStyle_Double := 3 static TextDecorationLineStyle_Dot := 4 static TextDecorationLineStyle_Dash := 5 static TextDecorationLineStyle_DashDot := 6 static TextDecorationLineStyle_DashDotDot := 7 static TextDecorationLineStyle_Wavy := 8 static TextDecorationLineStyle_ThickSingle := 9 static TextDecorationLineStyle_DoubleWavy := 11 static TextDecorationLineStyle_ThickWavy := 12 static TextDecorationLineStyle_LongDash := 13 static TextDecorationLineStyle_ThickDash := 14 static TextDecorationLineStyle_ThickDashDot := 15 static TextDecorationLineStyle_ThickDashDotDot := 16 static TextDecorationLineStyle_ThickDot := 17 static TextDecorationLineStyle_ThickLongDash := 18 static TextDecorationLineStyle_Other := -1 TextDecorationLineStyle(Value:="") { static v1:={0:"None", 1:"Single", 2:"WordsOnly", 3:"Double", 4:"Dot", 5:"Dash", 6:"DashDot", 7:"DashDotDot", 8:"Wavy", 9:"ThickSingle", 11:"DoubleWavy", 12:"ThickWavy", 13:"LongDash", 14:"ThickDash", 15:"ThickDashDot", 16:"ThickDashDotDot", 17:"ThickDot", 18:"ThickLongDash", -1:"Other"} if Value is not integer return this["TextDecorationLineStyle_" Value] return (Value=="")?v1:v1[Value] } ; enum TextEditChangeType Describes the text editing change being performed by controls when text-edit events are raised or handled. static TextEditChangeType_None := 0x0 static TextEditChangeType_AutoCorrect := 0x1 static TextEditChangeType_Composition := 0x2 static TextEditChangeType_CompositionFinalized := 0x3 static TextEditChangeType_AutoComplete := 0x4 TextEditChangeType(Value:="") { static v1:={0x0:"None", 0x1:"AutoCorrect", 0x2:"Composition", 0x3:"CompositionFinalized", 0x4:"AutoComplete"} if Value is not integer return this["TextEditChangeType_" Value] return (Value=="")?v1:v1[Value] } ; enum TextPatternRangeEndpoint Contains values that specify the endpoints of a text range. static TextPatternRangeEndpoint_Start := 0x0 static TextPatternRangeEndpoint_End := 0x1 TextPatternRangeEndpoint(Value:="") { static v1:={0x0:"Start", 0x1:"End"} if Value is not integer return this["TextPatternRangeEndpoint_" Value] return (Value=="")?v1:v1[Value] } ; enum TextUnit Contains values that specify units of text for the purposes of navigation. static TextUnit_Character := 0x0 static TextUnit_Format := 0x1 static TextUnit_Word := 0x2 static TextUnit_Line := 0x3 static TextUnit_Paragraph := 0x4 static TextUnit_Page := 0x5 static TextUnit_Document := 0x6 TextUnit(Value:="") { static v1:={0x0:"Character", 0x1:"Format", 0x2:"Word", 0x3:"Line", 0x4:"Paragraph", 0x5:"Page", 0x6:"Document"} if Value is not integer return this["TextUnit_" Value] return (Value=="")?v1:v1[Value] } ; enum ToggleState Contains values that specify the toggle state of a Microsoft UI Automation element that implements the Toggle control pattern. static ToggleState_Off := 0x0 static ToggleState_On := 0x1 static ToggleState_Indeterminate := 0x2 ToggleState(Value:="") { static v1:={0x0:"Off", 0x1:"On", 0x2:"Indeterminate"} if Value is not integer return this["ToggleState_" Value] return (Value=="")?v1:v1[Value] } ;enum ZoomUnit Contains possible values for the IUIAutomationTransformPattern2::ZoomByUnit method, which zooms the viewport of a control by the specified unit. static ZoomUnit_NoAmount := 0x0 static ZoomUnit_LargeDecrement := 0x1 static ZoomUnit_SmallDecrement := 0x2 static ZoomUnit_LargeIncrement := 0x3 static ZoomUnit_SmallIncrement := 0x4 ZoomUnit(Value:="") { static v1:={0x0:"NoAmount", 0x1:"LargeDecrement", 0x2:"SmallDecrement", 0x3:"LargeIncrement", 0x4:"SmallIncrement"} if Value is not integer return this["ZoomUnit_" Value] return (Value=="")?v1:v1[Value] } ; enum WindowVisualState Contains values that specify the visual state of a window. static WindowVisualState_Normal := 0x0 static WindowVisualState_Maximized := 0x1 static WindowVisualState_Minimized := 0x2 WindowVisualState(Value:="") { static v1:={0x0:"Normal", 0x1:"Maximized", 0x2:"Minimized"} if Value is not integer return this["WindowVisualState_" Value] return (Value=="")?v1:v1[Value] } ; enum WindowInteractionState Contains values that specify the current state of the window for purposes of user interaction. static WindowInteractionState_Running := 0x0 static WindowInteractionState_Closing := 0x1 static WindowInteractionState_ReadyForUserInteraction := 0x2 static WindowInteractionState_BlockedByModalWindow := 0x3 static WindowInteractionState_NotResponding := 0x4 WindowInteractionState(Value:="") { static v1:={0x0:"Running", 0x1:"Closing", 0x2:"ReadyForUserInteraction", 0x3:"BlockedByModalWindow", 0x4:"NotResponding"} if Value is not integer return this["WindowInteractionState_" Value] return (Value=="")?v1:v1[Value] } } class IAccessible_Enum { ; from UIA2.ahk (https://github.com/neptercn/UIAutomation/blob/master/UIA2.ahk) ; enum SELFLAG specify how an accessible object becomes selected or takes the focus. http://msdn.microsoft.com/en-us/library/dd373634(v=vs.85).aspx static SELFLAG_NONE := 0 static SELFLAG_TAKEFOCUS := 0x1 static SELFLAG_TAKESELECTION := 0x2 static SELFLAG_EXTENDSELECTION := 0x4 static SELFLAG_ADDSELECTION := 0x8 static SELFLAG_REMOVESELECTION := 0x10 static SELFLAG_VALID := 0x1f ; enum Roles describe the roles of various UI objects in an application. http://msdn.microsoft.com/en-us/library/dd373608%28v=vs.85%29.aspx static ROLE_SYSTEM_TITLEBAR := 0x1 static ROLE_SYSTEM_MENUBAR := 0x2 static ROLE_SYSTEM_SCROLLBAR := 0x3 static ROLE_SYSTEM_GRIP := 0x4 static ROLE_SYSTEM_SOUND := 0x5 static ROLE_SYSTEM_CURSOR := 0x6 static ROLE_SYSTEM_CARET := 0x7 static ROLE_SYSTEM_ALERT := 0x8 static ROLE_SYSTEM_WINDOW := 0x9 static ROLE_SYSTEM_CLIENT := 0xa static ROLE_SYSTEM_MENUPOPUP := 0xb static ROLE_SYSTEM_MENUITEM := 0xc static ROLE_SYSTEM_TOOLTIP := 0xd static ROLE_SYSTEM_APPLICATION := 0xe static ROLE_SYSTEM_DOCUMENT := 0xf static ROLE_SYSTEM_PANE := 0x10 static ROLE_SYSTEM_CHART := 0x11 static ROLE_SYSTEM_DIALOG := 0x12 static ROLE_SYSTEM_BORDER := 0x13 static ROLE_SYSTEM_GROUPING := 0x14 static ROLE_SYSTEM_SEPARATOR := 0x15 static ROLE_SYSTEM_TOOLBAR := 0x16 static ROLE_SYSTEM_STATUSBAR := 0x17 static ROLE_SYSTEM_TABLE := 0x18 static ROLE_SYSTEM_COLUMNHEADER := 0x19 static ROLE_SYSTEM_ROWHEADER := 0x1a static ROLE_SYSTEM_COLUMN := 0x1b static ROLE_SYSTEM_ROW := 0x1c static ROLE_SYSTEM_CELL := 0x1d static ROLE_SYSTEM_LINK := 0x1e static ROLE_SYSTEM_HELPBALLOON := 0x1f static ROLE_SYSTEM_CHARACTER := 0x20 static ROLE_SYSTEM_LIST := 0x21 static ROLE_SYSTEM_LISTITEM := 0x22 static ROLE_SYSTEM_OUTLINE := 0x23 static ROLE_SYSTEM_OUTLINEITEM := 0x24 static ROLE_SYSTEM_PAGETAB := 0x25 static ROLE_SYSTEM_PROPERTYPAGE := 0x26 static ROLE_SYSTEM_INDICATOR := 0x27 static ROLE_SYSTEM_GRAPHIC := 0x28 static ROLE_SYSTEM_STATICTEXT := 0x29 static ROLE_SYSTEM_TEXT := 0x2a static ROLE_SYSTEM_PUSHBUTTON := 0x2b static ROLE_SYSTEM_CHECKBUTTON := 0x2c static ROLE_SYSTEM_RADIOBUTTON := 0x2d static ROLE_SYSTEM_COMBOBOX := 0x2e static ROLE_SYSTEM_DROPLIST := 0x2f static ROLE_SYSTEM_PROGRESSBAR := 0x30 static ROLE_SYSTEM_DIAL := 0x31 static ROLE_SYSTEM_HOTKEYFIELD := 0x32 static ROLE_SYSTEM_SLIDER := 0x33 static ROLE_SYSTEM_SPINBUTTON := 0x34 static ROLE_SYSTEM_DIAGRAM := 0x35 static ROLE_SYSTEM_ANIMATION := 0x36 static ROLE_SYSTEM_EQUATION := 0x37 static ROLE_SYSTEM_BUTTONDROPDOWN := 0x38 static ROLE_SYSTEM_BUTTONMENU := 0x39 static ROLE_SYSTEM_BUTTONDROPDOWNGRID := 0x3a static ROLE_SYSTEM_WHITESPACE := 0x3b static ROLE_SYSTEM_PAGETABLIST := 0x3c static ROLE_SYSTEM_CLOCK := 0x3d static ROLE_SYSTEM_SPLITBUTTON := 0x3e static ROLE_SYSTEM_IPADDRESS := 0x3f static ROLE_SYSTEM_OUTLINEBUTTON := 0x40 ; enum State describe the state of objects in an application UI. http://msdn.microsoft.com/en-us/library/dd373609%28v=vs.85%29.aspx static STATE_SYSTEM_NORMAL := 0 static STATE_SYSTEM_UNAVAILABLE := 0x1 static STATE_SYSTEM_SELECTED := 0x2 static STATE_SYSTEM_FOCUSED := 0x4 static STATE_SYSTEM_PRESSED := 0x8 static STATE_SYSTEM_CHECKED := 0x10 static STATE_SYSTEM_MIXED := 0x20 static STATE_SYSTEM_INDETERMINATE := 0x20 static STATE_SYSTEM_READONLY := 0x40 static STATE_SYSTEM_HOTTRACKED := 0x80 static STATE_SYSTEM_DEFAULT := 0x100 static STATE_SYSTEM_EXPANDED := 0x200 static STATE_SYSTEM_COLLAPSED := 0x400 static STATE_SYSTEM_BUSY := 0x800 static STATE_SYSTEM_FLOATING := 0x1000 static STATE_SYSTEM_MARQUEED := 0x2000 static STATE_SYSTEM_ANIMATED := 0x4000 static STATE_SYSTEM_INVISIBLE := 0x8000 static STATE_SYSTEM_OFFSCREEN := 0x10000 static STATE_SYSTEM_SIZEABLE := 0x20000 static STATE_SYSTEM_MOVEABLE := 0x40000 static STATE_SYSTEM_SELFVOICING := 0x80000 static STATE_SYSTEM_FOCUSABLE := 0x100000 static STATE_SYSTEM_SELECTABLE := 0x200000 static STATE_SYSTEM_LINKED := 0x400000 static STATE_SYSTEM_TRAVERSED := 0x800000 static STATE_SYSTEM_MULTISELECTABLE := 0x1000000 static STATE_SYSTEM_EXTSELECTABLE := 0x2000000 static STATE_SYSTEM_ALERT_LOW := 0x4000000 static STATE_SYSTEM_ALERT_MEDIUM := 0x8000000 static STATE_SYSTEM_ALERT_HIGH := 0x10000000 static STATE_SYSTEM_PROTECTED := 0x20000000 static STATE_SYSTEM_VALID := 0x7fffffff static STATE_SYSTEM_HASPOPUP := 0x40000000 ; enum Event describes the events that are generated by the operating system and by server applications. http://msdn.microsoft.com/en-us/library/dd318066%28v=vs.85%29.aspx static EVENT_MIN := 0x00000001 static EVENT_MAX := 0x7FFFFFFF static EVENT_SYSTEM_SOUND := 0x0001 static EVENT_SYSTEM_ALERT := 0x0002 static EVENT_SYSTEM_FOREGROUND := 0x0003 static EVENT_SYSTEM_MENUSTART := 0x0004 static EVENT_SYSTEM_MENUEND := 0x0005 static EVENT_SYSTEM_MENUPOPUPSTART := 0x0006 static EVENT_SYSTEM_MENUPOPUPEND := 0x0007 static EVENT_SYSTEM_CAPTURESTART := 0x0008 static EVENT_SYSTEM_CAPTUREEND := 0x0009 static EVENT_SYSTEM_MOVESIZESTART := 0x000A static EVENT_SYSTEM_MOVESIZEEND := 0x000B static EVENT_SYSTEM_CONTEXTHELPSTART := 0x000C static EVENT_SYSTEM_CONTEXTHELPEND := 0x000D static EVENT_SYSTEM_DRAGDROPSTART := 0x000E static EVENT_SYSTEM_DRAGDROPEND := 0x000F static EVENT_SYSTEM_DIALOGSTART := 0x0010 static EVENT_SYSTEM_DIALOGEND := 0x0011 static EVENT_SYSTEM_SCROLLINGSTART := 0x0012 static EVENT_SYSTEM_SCROLLINGEND := 0x0013 static EVENT_SYSTEM_SWITCHSTART := 0x0014 static EVENT_SYSTEM_SWITCHEND := 0x0015 static EVENT_SYSTEM_MINIMIZESTART := 0x0016 static EVENT_SYSTEM_MINIMIZEEND := 0x0017 static EVENT_SYSTEM_DESKTOPSWITCH := 0x0020 static EVENT_SYSTEM_END := 0x00FF static EVENT_OEM_DEFINED_START := 0x0101 static EVENT_OEM_DEFINED_END := 0x01FF static EVENT_UIA_EVENTID_START := 0x4E00 static EVENT_UIA_EVENTID_END := 0x4EFF static EVENT_UIA_PROPID_START := 0x7500 static EVENT_UIA_PROPID_END := 0x75FF static EVENT_CONSOLE_CARET := 0x4001 static EVENT_CONSOLE_UPDATE_REGION := 0x4002 static EVENT_CONSOLE_UPDATE_SIMPLE := 0x4003 static EVENT_CONSOLE_UPDATE_SCROLL := 0x4004 static EVENT_CONSOLE_LAYOUT := 0x4005 static EVENT_CONSOLE_START_APPLICATION := 0x4006 static EVENT_CONSOLE_END_APPLICATION := 0x4007 static EVENT_CONSOLE_END := 0x40FF static EVENT_OBJECT_CREATE := 0x8000 static EVENT_OBJECT_DESTROY := 0x8001 static EVENT_OBJECT_SHOW := 0x8002 static EVENT_OBJECT_HIDE := 0x8003 static EVENT_OBJECT_REORDER := 0x8004 static EVENT_OBJECT_FOCUS := 0x8005 static EVENT_OBJECT_SELECTION := 0x8006 static EVENT_OBJECT_SELECTIONADD := 0x8007 static EVENT_OBJECT_SELECTIONREMOVE := 0x8008 static EVENT_OBJECT_SELECTIONWITHIN := 0x8009 static EVENT_OBJECT_STATECHANGE := 0x800A static EVENT_OBJECT_LOCATIONCHANGE := 0x800B static EVENT_OBJECT_NAMECHANGE := 0x800C static EVENT_OBJECT_DESCRIPTIONCHANGE := 0x800D static EVENT_OBJECT_VALUECHANGE := 0x800E static EVENT_OBJECT_PARENTCHANGE := 0x800F static EVENT_OBJECT_HELPCHANGE := 0x8010 static EVENT_OBJECT_DEFACTIONCHANGE := 0x8011 static EVENT_OBJECT_ACCELERATORCHANGE := 0x8012 static EVENT_OBJECT_INVOKED := 0x8013 static EVENT_OBJECT_TEXTSELECTIONCHANGED := 0x8014 static EVENT_OBJECT_CONTENTSCROLLED := 0x8015 static EVENT_SYSTEM_ARRANGMENTPREVIEW := 0x8016 static EVENT_OBJECT_END := 0x80FF static EVENT_AIA_START := 0xA000 static EVENT_AIA_END := 0xAFFF ; enum Navigation indicate the spatial (up, down, left, and right) or logical (first child, last, next, and previous) direction observed when clients use IAccessible::accNavigate to navigate from one user interface element to another within the same container. http://msdn.microsoft.com/en-us/library/dd373600%28v=vs.85%29.aspx static NAVDIR_MIN := 0 static NAVDIR_UP := 1 static NAVDIR_DOWN := 2 static NAVDIR_LEFT := 3 static NAVDIR_RIGHT := 4 static NAVDIR_NEXT := 5 static NAVDIR_PREVIOUS := 6 static NAVDIR_FIRSTCHILD := 7 static NAVDIR_LASTCHILD := 8 static NAVDIR_MAX := 9 ; enum Object Identifiers determine the object to which a WM_GETOBJECT message request refers. http://msdn.microsoft.com/en-us/library/dd373606%28v=vs.85%29.aspx static OBJID_WINDOW := 0 static OBJID_SYSMENU := -1 static OBJID_TITLEBAR := -2 static OBJID_MENU := -3 static OBJID_CLIENT := -4 static OBJID_VSCROLL := -5 static OBJID_HSCROLL := -6 static OBJID_SIZEGRIP := -7 static OBJID_CARET := -8 static OBJID_CURSOR := -9 static OBJID_ALERT := -10 static OBJID_SOUND := -11 static OBJID_QUERYCLASSNAMEIDX := -12 static OBJID_NATIVEOM := -16 }
评论(0)