Jump to content
Sign in to follow this  
ngskicker

Set text on a control using IUIAutomation.

Recommended Posts

I don't know if this is a correct place to ask this, so forgive me if this is the wrong place.

I need to set text in a text field, and then press enter, this is a text field on "Microsoft Access Database Project", this control is not visible on AutoItInfo, below is what I get from simplespy

Mouse position is retrieved 433-228
At least we have an element [20.40.22][OKttbx]

Having the following values for all properties:
Title is: <20.40.22>    Class := <OKttbx>    controltype:= <UIA_PaneControlTypeId>    ,<50033>    , (0000C371)    366;221;151;15
*** Parent Information top down ***
4: Title is: <Desktop>    Class := <#32769>    controltype:= <UIA_PaneControlTypeId>    ,<50033>    , (0000C371)    0;0;1366;768
"Title:=Desktop;controltype:=UIA_PaneControlTypeId;class:=#32769"    
3: Title is: <Registrasi Px RSMLA>    Class := <OMain>    controltype:= <UIA_WindowControlTypeId>    ,<50032>    , (0000C370)    -8;-8;1382;744
"Title:=Registrasi Px RSMLA;controltype:=UIA_WindowControlTypeId;class:=OMain"    
2: Title is: <Workspace>    Class := <MDIClient>    controltype:= <UIA_PaneControlTypeId>    ,<50033>    , (0000C371)    0;74;1366;654
"Title:=Workspace;controltype:=UIA_PaneControlTypeId;class:=MDIClient"    
1: Title is: <Appointment Form>    Class := <OForm>    controltype:= <UIA_WindowControlTypeId>    ,<50032>    , (0000C370)    259;124;847;537
"Title:=Appointment Form;controltype:=UIA_WindowControlTypeId;class:=OForm"    
0: Title is: <>    Class := <OFormSub>    controltype:= <UIA_PaneControlTypeId>    ,<50033>    , (0000C371)    262;197;824;343
"Title:=;controltype:=UIA_PaneControlTypeId;class:=OFormSub"    


;~ *** Standard code ***
#include "UIAWrappers.au3"
AutoItSetOption("MustDeclareVars", 1)

Local $oP3=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=Registrasi Px RSMLA;controltype:=UIA_WindowControlTypeId;class:=OMain", $treescope_children)    
_UIA_Action($oP3,"setfocus")
Local $oP2=_UIA_getObjectByFindAll($oP3, "Title:=Workspace;controltype:=UIA_PaneControlTypeId;class:=MDIClient", $treescope_children)    
_UIA_Action($oP2,"setfocus")
Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=Appointment Form;controltype:=UIA_WindowControlTypeId;class:=OForm", $treescope_children)    
_UIA_Action($oP1,"setfocus")
Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_PaneControlTypeId;class:=OFormSub", $treescope_children)    
_UIA_Action($oP0,"setfocus")
_UIA_setVar("20.40.22.mainwindow","title:=20.40.22;classname:=OKttbx")
_UIA_action("20.40.22.mainwindow","setfocus")


*** Detailed properties of the highlighted element ***
UIA_title:= <20.40.22>
UIA_text:= <20.40.22>
UIA_regexptitle:= <20.40.22>
UIA_class:= <OKttbx>
UIA_regexpclass:= <OKttbx>
UIA_iaccessiblechildId:= <0>
UIA_handle:= <1311620>
UIA_RuntimeId:= <42;1311620>
UIA_BoundingRectangle:= <366;221;151;15>
; Main:Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]; Hwnd(parent link):Microsoft: HWND Proxy (unmanaged:uiautomationcore.dll)]>
UIA_IsItemContainerPatternAvailable:= <False>
UIA_IsVirtualizedItemPatternAvailable:= <False>
UIA_IsSynchronizedInputPatternAvailable:= <False>
Edited by ngskicker

Share this post


Link to post
Share on other sites

you have to provide a little more info. If the proper area is highlighted by the simplespy you normally can reach it.

whats the result of the code that simplespy gives you?

;~ *** Standard code ***
#include "UIAWrappers.au3"
AutoItSetOption("MustDeclareVars", 1)

Local $oP3=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=Registrasi Px RSMLA;controltype:=UIA_WindowControlTypeId;class:=OMain", $treescope_children)    
_UIA_Action($oP3,"setfocus")
Local $oP2=_UIA_getObjectByFindAll($oP3, "Title:=Workspace;controltype:=UIA_PaneControlTypeId;class:=MDIClient", $treescope_children)    
_UIA_Action($oP2,"setfocus")
Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=Appointment Form;controltype:=UIA_WindowControlTypeId;class:=OForm", $treescope_children)    
_UIA_Action($oP1,"setfocus")
Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_PaneControlTypeId;class:=OFormSub", $treescope_children)    
_UIA_Action($oP0,"setfocus")
_UIA_setVar("20.40.22.mainwindow","title:=20.40.22;classname:=OKttbx")
_UIA_action("20.40.22.mainwindow","setfocus")

if above works change last line to

_UIA_action("20.40.22.mainwindow","setvalue", "123")

alternatives

"setValue using keys","setValue using clipboard","sendkeys", "enterstring", "type", "typetext"

could be this does not behave properly in framework

"20.40.22.mainwindow"

make it something like below by replacing dots in first part with underscores

"20_40_22.mainwindow"

Share this post


Link to post
Share on other sites

you have to provide a little more info. If the proper area is highlighted by the simplespy you normally can reach it.

whats the result of the code that simplespy gives you?

;~ *** Standard code ***
#include "UIAWrappers.au3"
AutoItSetOption("MustDeclareVars", 1)

Local $oP3=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=Registrasi Px RSMLA;controltype:=UIA_WindowControlTypeId;class:=OMain", $treescope_children)    
_UIA_Action($oP3,"setfocus")
Local $oP2=_UIA_getObjectByFindAll($oP3, "Title:=Workspace;controltype:=UIA_PaneControlTypeId;class:=MDIClient", $treescope_children)    
_UIA_Action($oP2,"setfocus")
Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=Appointment Form;controltype:=UIA_WindowControlTypeId;class:=OForm", $treescope_children)    
_UIA_Action($oP1,"setfocus")
Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_PaneControlTypeId;class:=OFormSub", $treescope_children)    
_UIA_Action($oP0,"setfocus")
_UIA_setVar("20.40.22.mainwindow","title:=20.40.22;classname:=OKttbx")
_UIA_action("20.40.22.mainwindow","setfocus")

if above works change last line to

_UIA_action("20.40.22.mainwindow","setvalue", "123")

alternatives

"setValue using keys","setValue using clipboard","sendkeys", "enterstring", "type", "typetext"

could be this does not behave properly in framework

"20.40.22.mainwindow"

make it something like below by replacing dots in first part with underscores

"20_40_22.mainwindow"

unfortunately the code above is not working, I can confirm the textbox is highlighted when I press Ctrl+W, but not when I run the script above, the code _UIA_Action($oP0,"setfocus") still works, but code below it is not, by the way "20.40.22" is value of the textbox, this value is not always same.

Share this post


Link to post
Share on other sites

It may be difficult to identify the proper control. I would recommend you to use Inspect.exe from Windows SDK to verify that it's the right control. Inspect.exe also shows how the control is placed in the hierarchy of windows and container controls. When you have identified the proper control, you can use the UI Automation framework to set the text.

Share this post


Link to post
Share on other sites

Simple spy proves it can work. Most likely you have to use instance property. The xxxxxx.mainwindow part should xxxxxxx not contain dots else it will not work. So 204022.mainwindow you could try. And try to remove title:=20.40.22 as classname seems to be unique or try classname with instance:=nn with nn being 1 2 3 etc

If you say it works up till setfocus you should see box highlghting but then setvalue is not workng due to not iuia compatible and you should try the other options given

Edited by junkew

Share this post


Link to post
Share on other sites

"setValue using keys","setValue using clipboard","sendkeys", "enterstring", "type", "typetext"

just to make sure this is what i mean

_UIA_setVar("204022.mainwindow","classname:=OKttbx;instance:=1")
_UIA_action("204022.mainwindow","setfocus")
_UIA_action("204022.mainwindow","setvalue using keys","hello world")
_UIA_action("204022.mainwindow","setvalue using clipboard","hello world")

all those variations of setting values use slightly different ways of dealing with the not so standard textboxes

setvalue uses iuiautomation which unfortunately is not supported by all controls (you should complain to your supplier if possible)

Edited by junkew

Share this post


Link to post
Share on other sites

"setValue using keys","setValue using clipboard","sendkeys", "enterstring", "type", "typetext"

just to make sure this is what i mean

_UIA_setVar("204022.mainwindow","classname:=OKttbx;instance:=1")
_UIA_action("204022.mainwindow","setfocus")
_UIA_action("204022.mainwindow","setvalue using keys","hello world")
_UIA_action("204022.mainwindow","setvalue using clipboard","hello world")

all those variations of setting values use slightly different ways of dealing with the not so standard textboxes

setvalue uses iuiautomation which unfortunately is not supported by all controls (you should complain to your supplier if possible)

Hi junkew, thanks, I'll try it onthe next hour, 

but "20.40.22" is control value, and will always have different value, and sometimes empty

Share this post


Link to post
Share on other sites

"204022.mainwindow" with quotes around it is just a reference name, something like a variable and not related to the value of the box.

It was just the value at the moment the spy looked at it.

you just as wel can use

"abc.mainwindow"

using it in a property like this

title:=20.40.22

means look for a control with contentvalue/title to be 20.40.22

as you say it can be empty or unknown values its not smart to find based on title property and you have to fall back to other properties to uniquely identify your control

Edited by junkew

Share this post


Link to post
Share on other sites

junkew, I'm pretty sure, that this pane control in first post is not the proper control. If ngskicker manually can edit the control with the keyboard (if not, he will not be able to set the text automatically with UI Automation), then it's not a pane control. Then it's an edit control.

What's going on is that the pane control is a container for the edit control. (The edit control is a child control of the pane control.) Because the edit control is below the pane control, Simple Spy will return the pane control. Simple Spy returns the first control it sees at the position. With the current implementation of Simple Spy I don't think it'll be able to return the edit control.

This limitation is a main issue for the Simple Spy script. And it's the cause of many of the posts about UI Automation. It's not returning the control, that the users think it's returning. E.g. it's returning a pane control, and the user think it's an edit control.

Use Inspect.exe to get the proper edit control below the pane control.

Merry Christmas by the way.

Share this post


Link to post
Share on other sites

@LarsJ: Thx. Will enhance simple spy in future version to return information of childcontrols and if its less then 5 childs display base information on the childs. Wondering how inspect.exe retrieves the right control or only can get there with a treewalker. seems uipane does not have the child controls in MS Access

Just adding this in simplespy below

_UIA_DrawRect($t[1],$t[3]+$t[1],$t[2],$t[4]+$t[2])

;~  Just walk thru all childs
;~  at least 1 assumed (assuming we are not spying the desktop)
    $i=0
    local $oChildHandle
    local $pChildHandle

    local $oParentHandle
    local $pParentHandle
    $oTW.getparentelement($oUIElement,$pParentHandle)
    $oParentHandle=objcreateinterface($pparentHandle,$sIID_IUIAutomationElement, $dtagIUIAutomationElement)

    $oTW.GetFirstChildElement($oParenthandle,$pChildHandle)
    $oChildHandle=objcreateinterface($pChildHandle,$sIID_IUIAutomationElement, $dtagIUIAutomationElement)
    If IsObj($oChildHandle) = 0 Then
        msgbox(1,"No childs", "No childs below this element",10)
    Else

        while (IsObj($oChildHandle)=1)
            consolewrite("title:=" & _UIA_getPropertyValue($oChildHandle,$UIA_NamePropertyId) & ";classname:=" & _UIA_getPropertyValue($oUIElement,$uia_classnamepropertyid) & @CRLF)
            $oTW.GetNextSiblingElement($oChildHandle,$pChildHandle)
            $oChildHandle=objcreateinterface($pChildHandle,$sIID_IUIAutomationElement, $dtagIUIAutomationElement)

        wend
    EndIf 



 

Edited by junkew

Share this post


Link to post
Share on other sites

The width/height of the pane control in first post is 151/15. This probably means that the pane control only contains the edit control. And it's likely that the edit control has the exact same size.

Child controls. I think that you only have to care about child controls in case that the current control is a pane control.

Generally there seems to be some problems with pane controls. E.g. this issue at stackoverflow. Note that Inspect.exe can find the controls.

Simple Spy. I would like to see the list of parent controls from the current control to desktop printed out in opposite order. So that the first parent is immediately below the current control.

Share this post


Link to post
Share on other sites

Hi junkew, I tried everything you mentioned, but I still cant get it to work, if I can I want to send the program, but unfortunately, the program need a database that can't be sent.

Share this post


Link to post
Share on other sites

@ngskicker: Best to see if it can work is indeed install inspect.exe frow windows SDK as that way you can navigate thru the hierarchy and see if your control is really recognized as type Edit (and not type pane)

I partly can reproduce simplespy not recognizing controls on an ms access form but need more time to fix simplespy icm with current framework IUIA I am working on.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By junkew
      Working on a new version of iuiautomation and uia wrappers I needed a better way of getting my interface's
      Concept version 0.6 to generate based on idl file an au3 file with the definitions.
      As allways its more complicated then I thought ;-) due to small differences in the idl files on closing braces, separating inheritance colon inconsistencies in the idl tool that generates them so most likely its better to write a lexer/parser then the search/replace I do now
      Alternatives
      typelibinspector but could not generate them all at once aiowrappergenerator was generating for aio and not for objcreateinterface based on tli interfaces / xml but seemed incomplete Known issues
      Enums without given constant values to be filled in manually Enum adding fix first parameter to have a $ Empty interfaces fail on _ to be replaced with "" propput and propget deal with methods with same name Must be wrapped in main function $i counting to be done differently Working on the typedef's and replacements of identifiers in the string (some are replaced) enum automatically is a long typedefs are automatically assumed an int (which is not perfect but a start) struct like POINT pt is now generated as int Testing/debugging Choices done
      get_ and put_ prefixing only for put_ as that will have less impact on existing scripts that do not use get_ like ControlViewWalker, Current.. properties etc.

      So instead of Global Const $sIID_IUIAutomationCacheRequest = "{B32A92B5-BC25-4078-9C08-D7EE95C48E03}" Global $dtagIUIAutomationCacheRequest = _ "AddProperty hresult(int);" & _ "AddPattern hresult(int);" & _ "Clone hresult(ptr*);" & _ "get_TreeScope hresult(long*);" & _ "put_TreeScope hresult(long);" & _ "get_TreeFilter hresult(ptr*);" & _ "put_TreeFilter hresult(ptr);" & _ "get_AutomationElementMode hresult(long*);" & _ "put_AutomationElementMode hresult(long);" it will be like (see for example TreeScope and put_TreeScope)
      Global Const $sIID_IUIAutomationCacheRequest = "{b32a92b5-bc25-4078-9c08-d7ee95c48e03}" Global $dtagIUIAutomationCacheRequest= _ "AddProperty hresult(struct);" & _ "AddPattern hresult(int);" & _ "Clone hresult(ptr*);" & _ "TreeScope hresult(long*);" & _ "put_TreeScope hresult(long);" & _ "TreeFilter hresult(ptr*);" & _ "put_TreeFilter hresult(ptr);" & _ "AutomationElementMode hresult(long*);" & _ "put_AutomationElementMode hresult(long);"  
      Prerequisites
      Win 10 SDK installed at location as given in constants to have IDL file Output
      File with same name as idl in scriptdir with  extension au3 having the definitions for OBJCreateInterface
        Example output
      ;~ // ;~ // IUIAutomation ;~ // ;~[object, uuid(30cbe57d-d9d0-452a-ab13-7ac5ac4825ee), pointer_default(unique)] ;~interface IUIAutomation : IUnknown Global Const $sIID_IUIAutomation = "{30cbe57d-d9d0-452a-ab13-7ac5ac4825ee}" Global $dtag_IUIAutomation= _ "CompareElements hresult(IUIAutomationElement*el1,IUIAutomationElement*el2,int*);" & _ "CompareRuntimeIds hresult(SAFEARRAY(int)runtimeId1,SAFEARRAY(int)runtimeId2,intareSame);" & _ "GetRootElement hresult(IUIAutomationElement**);" & _ "ElementFromHandle hresult(UIA_inthwnd,IUIAutomationElement**);" & _ "ElementFromPoint hresult(intpt,IUIAutomationElement**);" & _ "GetFocusedElement hresult(IUIAutomationElement**);" & _ "GetRootElementBuildCache hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "ElementFromHandleBuildCache hresult(UIA_inthwnd,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "ElementFromPointBuildCache hresult(intpt,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "GetFocusedElementBuildCache hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" & _ "CreateTreeWalker hresult(IUIAutomationCondition*pCondition,IUIAutomationTreeWalker**);" & _ "ControlViewWalker hresult(IUIAutomationTreeWalker**);" & _ "ContentViewWalker hresult(IUIAutomationTreeWalker**);" & _ "RawViewWalker hresult(IUIAutomationTreeWalker**);" & _ "RawViewCondition hresult(IUIAutomationCondition**);" & _ "ControlViewCondition hresult(IUIAutomationCondition**);" & _ "ContentViewCondition hresult(IUIAutomationCondition**);" & _ "CreateCacheRequest hresult(IUIAutomationCacheRequest**);" & _ "CreateTrueCondition hresult(IUIAutomationCondition**);" & _ "CreateFalseCondition hresult(IUIAutomationCondition**);" & _ "CreatePropertyCondition hresult(intpropertyId,variantvalue,IUIAutomationCondition**);" & _ "CreatePropertyConditionEx hresult(intpropertyId,variantvalue,longflags,IUIAutomationCondition**);" & _ "CreateAndCondition hresult(IUIAutomationCondition*condition1,IUIAutomationCondition*condition2,IUIAutomationCondition**);" & _ "CreateAndConditionFromArray hresult(SAFEARRAY(IUIAutomationCondition)conditions,IUIAutomationCondition**);" & _ "CreateAndConditionFromNativeArray hresult(IUIAutomationCondition**conditions,intconditionCount,IUIAutomationCondition**);" & _ "CreateOrCondition hresult(IUIAutomationCondition*condition1,IUIAutomationCondition*condition2,IUIAutomationCondition**);" & _ "CreateOrConditionFromArray hresult(SAFEARRAY(IUIAutomationCondition)conditions,IUIAutomationCondition**);" & _ "CreateOrConditionFromNativeArray hresult(IUIAutomationCondition**conditions,intconditionCount,IUIAutomationCondition**);" & _ "CreateNotCondition hresult(IUIAutomationCondition*condition,IUIAutomationCondition**);" & _ "AddAutomationEventHandler hresult(inteventId,IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationEventHandler*);" & _ "RemoveAutomationEventHandler hresult(inteventId,IUIAutomationElement*element,IUIAutomationEventHandler*);" & _ "AddPropertyChangedEventHandlerNativeArray hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationPropertyChangedEventHandler*handler,int*propertyArray,int);" & _ "AddPropertyChangedEventHandler hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationPropertyChangedEventHandler*handler,SAFEARRAY(PROPERTYID));" & _ "RemovePropertyChangedEventHandler hresult(IUIAutomationElement*element,IUIAutomationPropertyChangedEventHandler*);" & _ "AddStructureChangedEventHandler hresult(IUIAutomationElement*element,longscope,IUIAutomationCacheRequest*cacheRequest,IUIAutomationStructureChangedEventHandler*);" & _ "RemoveStructureChangedEventHandler hresult(IUIAutomationElement*element,IUIAutomationStructureChangedEventHandler*);" & _ "AddFocusChangedEventHandler hresult(IUIAutomationCacheRequest*cacheRequest,IUIAutomationFocusChangedEventHandler*);" & _ "RemoveFocusChangedEventHandler hresult(IUIAutomationFocusChangedEventHandler*);" & _ "RemoveAllEventHandlers hresult);" & _ "IntNativeArrayToSafeArray hresult(int*array,intarrayCount,SAFEARRAY(int)*);" & _ "IntSafeArrayToNativeArray hresult(SAFEARRAY(int)intArray,int**array,int*);" & _ "RectTovariant hresult(intrc,variant*);" & _ "variantToRect hresult(variantvar,int*);" & _ "SafeArrayToRectNativeArray hresult(SAFEARRAY(double)rects,int**rectArray,int*);" & _ "CreateProxyFactoryEntry(IUIAutomationProxyFactory hresult*factory,IUIAutomationProxyFactoryEntry);" & _ "ProxyFactoryMapping(IUIAutomationProxyFactoryMapping hresult);" & _ "GetPropertyProgrammaticName(int hresultproperty,int*);" & _ "GetPatternProgrammaticName(int hresultpattern,int*);" & _ "PollForPotentialSupportedPatterns(IUIAutomationElement hresult*pElement,SAFEARRAY(int)*patternIds,SAFEARRAY(BSTR)patternNames);" & _ "PollForPotentialSupportedProperties(IUIAutomationElement hresult*pElement,SAFEARRAY(int)*propertyIds,SAFEARRAY(BSTR)propertyNames);" & _ "CheckNotSupported(variant hresultvalue,intisNotSupported);" & _ "ReservedNotSupportedValue(IUnknown hresult**notSupportedValue);" & _ "ReservedMixedAttributeValue(IUnknown hresult**mixedAttributeValue);" & _ "ElementFromIAccessible hresult(IAccessible*accessible,intchildId,IUIAutomationElement**);" & _ "ElementFromIAccessibleBuildCache hresult(IAccessible*accessible,intchildId,IUIAutomationCacheRequest*cacheRequest,IUIAutomationElement**);" ;~}  
      Script
      #include <FileConstants.au3> #include <MsgBoxConstants.au3> #include <StringConstants.au3> #include <Array.au3> ;~ testit() ;~ Exit Local $IDLFolder="C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um\" Local $IDLFileName="UIAutomationClient.idl" Local $IDLFullFileName = $IDLFolder & $IDLFileName Local $IDLArray = FileReadToArray($IDLFullFileName) Local $iLineCount = @extended Local $IDLAU3FullFileName=@ScriptDir & "\" & $IDLFileName $IDLAU3FullFileName=stringreplace($IDLAU3FullFileName,".idl",".au3") If @error Then MsgBox($MB_SYSTEMMODAL, "", "There was an error reading the file. @error: " & @error) ; An error occurred reading the current script file. exit EndIf Local $hFileOpen = FileOpen($IDLAU3FullFileName, $FO_OVERWRITE ) If $hFileOpen = -1 Then MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst writing the new au3 file.") exit EndIf ;~TODO: Naming prefixing Global $interfaceName Global $GUID Global $i=0 while $i < $iLineCount - 1 ;~ consolewrite($i) $tLine=$IDLArray[$i] $blockType=0 if stringleft($tLine,2)="//" then $blockType=1 if stringleft($tLine,4)="cpp_" then $blockType=1 if stringleft($tLine,1)="#" then $blockType=1 if stringleft($tLine,6)="import" then $blockType=1 if stringleft($tLine,4)="midl" then $blockType=1 if $blockType=1 Then writeCommentedLine() continueloop; EndIf if stringleft($tLine,4)="enum" then $blockType=2 handleEnumBlock() EndIf if stringinstr($tLine, "module ") > 0 then $blockType=3 handleModuleBlock() EndIf if stringinstr($tLine, "[object") > 0 then $blockType=4 handleObjectBlock() EndIf if stringinstr($tLine, "interface ") > 0 then $blockType=5 handleInterfaceBlock() EndIf if $blockType=0 Then writeUnhandledLine() EndIf WEnd func writeUnhandledLine() filewriteline($hFileOpen,";~" & $tline) $i=$i+1 EndFunc func writeCommentedLine() $tLineOut=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) if $tLineOut <> "" Then $tLineOut=";~" & $tLineOut filewriteline($hFileOpen, $tLineOut) $i=$i+1 EndFunc func handleEnumBlock() writeCommentedLine() ;~ Copy enum line $tLine=$IDLArray[$i] writeCommentedLine() ;~ Copy curly brace line $tLine=$IDLArray[$i] while stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) <> "};" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then writeCommentedLine() Else $tLine=stringleft($tLine,$tPos) & "Global Const $" & stringmid($tline,$tPos+1) $tLine=stringreplace($tLine, ",","") $tLine=stringreplace($tLine, "| ","+ $") writeEnumLine() EndIf $tLine=$IDLArray[$i] WEnd EndFunc func writeEnumLine() filewriteline($hFileOpen, $tline) $i=$i+1 EndFunc func handleModuleBlock() writeCommentedLine() ;~ Copy module line $tLine=$IDLArray[$i] writeCommentedLine() ;~ Copy curly brace line $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ Some end with }; and some with } while stringleft($tValue,1) <> "}" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then if ($tpos=0) then $i=$i+1 ;~ Do no output Else writeCommentedLine() EndIf Else $tLine=stringreplace($tline,"const long ", "Global Const $") $tLine=stringreplace($tLine, ";","") writeModuleLine() EndIf $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) WEnd writeCommentedLine() ;~ Copy curly closing brace line EndFunc func writeModuleLine() filewriteline($hFileOpen, $tline) $i=$i+1 EndFunc func handleObjectBlock() writeCommentedLine() $tPos=stringinstr($tLine,"(") $tPos2=stringinstr($tLine,")") $GUID=stringmid($tLine,$tpos+1, $tPos2-1 - $tpos) ;~ consolewrite($GUID & @CRLF) EndFunc func handleInterfaceBlock() if stringright($tLine,1)=";" Then writeCommentedLine() ;~ Copy Interface line its just a definition line Return EndIf writeCommentedLine() ;~ Copy interface line $interfaceName=getInterfaceName() writeInterFaceLine1() $tLine=$IDLArray[$i] ;~ writeCommentedLine() ;~ Copy curly brace line $i=$i+1 ;~ Do no output $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ Some end with }; and some with } while stringleft($tValue,1) <> "}" $tPos=getPosFirstNonWhiteSpace($tLine) if ($tpos=0) or (stringmid($tLine,$tPos+1,2)="//") Then if ($tpos=0) then $i=$i+1 ;~ Do no output Else $i=$i+1 ;~ Do no output, AU3 does not like it in multiline strings ;~ writeCommentedLine() EndIf Else while stringright($tLine,1) <> ";" $i=$i+1 $tLine=$tLine & stringstripws($IDLArray[$i], $STR_STRIPLEADING + $STR_STRIPTRAILING) wend writeInterfaceLine() EndIf $tLine=$IDLArray[$i] $tValue=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) WEnd ;~ consolewrite($IDLArray[$i-1] & @CRLF) ;~ consolewrite($IDLArray[$i] & @CRLF) ;~ consolewrite($IDLArray[$i+1] & @CRLF) writeCommentedLine() ;~ Copy curly closing brace line EndFunc func writeInterFaceLine1() $tOutputLine="Global Const $sIID_" & getInterfaceName() & " = " $tOutputLine=$tOutputLine & """" $tOutputLine=$tOutputLine & "{" & $GUID & "}" $tOutputLine=$tOutputLine & """" filewriteline($hFileOpen, $tOutputLine) $toutputLine = "Global $dtag" & getInterfaceName() & "= _" & @CRLF filewriteline($hFileOpen, $tOutputLine) EndFunc func writeInterfaceLine() $tmpLine=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) if stringleft($tmpLine,1)="}" Then filewriteline($hFileOpen, $tmpLine) $i=$i+1 return EndIf ;~ Handle get/put properties prefix local $strPrefix="" if stringinstr($tmpLine,"[propget]")>0 then ;~ no prefix for the get as its more logical/natural in AutoIt to do it without (as oppossed to C where get_ is more logical ;~ $strPrefix="get_" ;~ consolewrite($tmpLine & @CRLF) $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) EndIf if stringinstr($tmpLine,"[propput]")>0 then ;~ prefix for the put as it can get in conflict with the get duplicate name $strPrefix="put_" ;~ consolewrite($tmpLine & @CRLF) $tmpLine=stringreplace($tmpLine, "[propput] ", "", 0, $STR_CASESENSE) EndIf ; $tmpLine ="HRESULT FindAll ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition, [out, retval] IUIAutomationElementArray ** found );" ;~ $tmpLine="[propget] HRESULT PropertyId ([out, retval] PROPERTYID * propertyId );" ;~ $tmpLine="HRESULT GetCurrentPropertyValue ([in] PROPERTYID propertyId,[out, retval] VARIANT * retVal);" ;~ $tmpLine="HRESULT FindAllBuildCache ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition,[in] IUIAutomationCacheRequest * cacheRequest,[out, retval] IUIAutomationElementArray ** found );" $tmpLine=stringreplace($tmpLine, "HRESULT", "hresult", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "VARIANT", "variant", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "BSTR", "bstr", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "BOOL", "bool", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "void", "none", 0, $STR_CASESENSE) ;~ Some where we are sure it should not be an int $tmpLine=stringreplace($tmpLine, "POINT", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "PROPERTYID", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "RECT", "struct", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "UIA_HWND", "hwnd", 0, $STR_CASESENSE) ;~ Some cleanup for parsing later $tmpLine=stringreplace($tmpLine, "(", " (") $tmpLine=stringreplace($tmpLine, " (", " (") $tmpLine=stringreplace($tmpLine, " );", ");") ;~ remove the pointer references for in/out parameters if stringinstr($tmpLine,"[in")>0 then $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "**", "SINGLESTAR") $tmpLine=stringreplace($tmpLine, "*", "") $tmpLine=stringreplace($tmpLine, "SINGLESTAR", "*") EndIf ;~ For out parameter we keep the pointer * if stringinstr($tmpLine,"[out")>0 then $tmpLine=stringreplace($tmpLine, "[propget] ", "", 0, $STR_CASESENSE) $tmpLine=stringreplace($tmpLine, "**", "SINGLESTAR") ;~ $tmpLine=stringreplace($tmpLine, "*", "") $tmpLine=stringreplace($tmpLine, "SINGLESTAR", "*") EndIf $tmpLine=StringRegExpReplace($tmpLine,"[A-Z]+ ","int ") ;~ TODO: assumption full uppercase is a TYPEDEF frequently int but definitily not sure $tmpLine=StringRegExpReplace($tmpLine,"enum [A-Za-z_]+ ","long ") ;~ An enum followed by an identifier is normally a long $tmpLine=StringRegExpReplace($tmpLine,"\[.*?] "," ") ;~ [in, out] stuff followed by space we normally ignore, space we keep for separator ;~ reshuffle and remove varnames $aArray=stringsplit($tmpLine," ") if ($aArray[0] < 2) then _arraydisplay($aArray) consolewrite(stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING)) consolewrite($tmpLine) EndIf $tOutputLine= $strPrefix & $aArray[2] & " " & $aArray[1] For $j = 3 To $aArray[0] $strAppend= $aArray[$j] if (stringright($aArray[$j],1))= "," then $strAppend= ";" if (stringright($aArray[$j],1))= ";" then if $aArray[$j]<>"();" then $strAppend= ");" EndIf $strAppend=getnewtype($strAppend) $tOutputLine= $tOutputLine & $strAppend Next ;~ $tOutputLine= $tOutputLine & $aarray[$aArray[0]] $tOutputline = @TAB & """" & $tOutputLine & """" $tValue=stringstripws($IDLArray[$i+1], $STR_STRIPLEADING + $STR_STRIPTRAILING) ;~ sometimes its not just 1 line ahead for closing but 2 lines ahead if $tValue="" then $tValue=stringstripws($IDLArray[$i+2], $STR_STRIPLEADING + $STR_STRIPTRAILING) endif if (stringleft($tValue,1) <> "}") then $tOutputLine= $tOutputLine & " & _ " filewriteline($hFileOpen, $tOutputLine) $i=$i+1 EndFunc func getPosFirstNonWhiteSpace($str) Local $aArray = StringToASCIIArray($str) for $i=0 to ubound($aArray)-1 if $aArray[$i]<>32 Then return $i Next return 0 EndFunc func getInterfaceName() $tmpLine=stringstripws($tLine, $STR_STRIPLEADING + $STR_STRIPTRAILING) $tArr=stringsplit($tmpLine," ") $tName=$tarr[2] if stringright($tname,1)=":" then $tName=stringleft($tname,stringlen($tname)-1) return $tname EndFunc func testIt() ;~ $tmpline="HRESULT SetFocus ( );" ; $tmpLine ="HRESULT FindAll ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition, [out, retval] IUIAutomationElementArray ** found );" $tmpLine="[propget] HRESULT PropertyId ([out, retval] PROPERTYID * propertyId );" ;~ $tmpLine="HRESULT GetCurrentPropertyValue ([in] PROPERTYID propertyId,[out, retval] VARIANT * retVal);" ;~ $tmpLine="HRESULT FindAllBuildCache ([in] enum TreeScope scope,[in] IUIAutomationCondition * condition,[in] IUIAutomationCacheRequest * cacheRequest,[out, retval] IUIAutomationElementArray ** found );" $strPrefix="" if stringinstr($tmpLine,"[propget]")>0 then $strPrefix="get_" if stringinstr($tmpLine,"[propput]")>0 then $strPrefix="put_" consolewrite($strPrefix) ;~ consolewrite($tOutputline & @CRLF) ;~ consolewrite($tmpLine) ;~ _arraydisplay($aArray) EndFunc func getNewType($str) $retVal=stringregexp($str, "[A-Za-z0-9_]+", $STR_REGEXPMATCH) ;~ if stringleft($str,"3") = "ret" then consolewrite($retVal & $str & @CRLF) if $retval=0 then return $str $tStr=$str & "," $objTypes="none,byte,boolean,short,word,ushort,int,long,bool,dword," & _ "ulong,uint,hresult,int64,uint64,ptr,hwnd,handle,float," & _ "double,int_ptr,long_ptr,lresult,lparam,uint_ptr,ulong_ptr,"& _ "dword_ptr,wparam,str,wstr,bstr,variant,idispatch,object," & _ "clsid,struct,*,**" if stringinstr($objtypes,$tstr)>0 Then return $str return "ptr" EndFunc  
    • By autotin
      Hello I am a first time user of AutoIT with little coding experience and I would REALLY really appreciate your help.
      I work in a warehouse where I am responsible for data entry along with a slew of other different tasks such as auditing and managing paperwork. Most of my time is tied up entering info to close receipts of product orders (8-12+ hours for thousands of products). The quantity actually produced by the warehouse is sometimes different from the quantity listed on the reciept (in this case 20). I need to change all the build qty for sublocation "1-WIP" from 20 to the actual quantity 22 and set all other numbers as 0. The form is an iframe coded with jQuery and freezes for 1-2 seconds after every entry and refreshes. As such, it doesn't allow me to use tab and I need to click and type every incorrect field.
      I have attached an image as an example from the webapp, FinaleInventory.
      I'm thinking that I probably need a macro that has a message box entry where I can type the corrected number entry I want. Then it uses image/character recognition (Tesseract?) to find "WIP" sublocation =,   Move the mouse over to the right to "Quantity" relative to location of WIP If quantity number = entry, then move to next "WIP" image (Not quite sure how to make Tesseract "find next") Elseif quantity number ≠ entry then click quantity number of "WIP" and type corrected entry Scroll down Loop until bottom of page I would greatly appreciate any help, ideas or pointers for this project. Thank you!
      -A newbie scripter

    • By BigDaddyO
      I have been using Auto IT along with the IUIAutomation for the nasty bits to perform automation in the Trizetto Facets application and everything is going well, until I was asked to use some of my scripts to generate Load on the system. 
      In order to do this, I would need to Launch My AutoIT script "which opens the Facets application" multiple times.  Each time it is launched a new Facets App on the same computer will open.
      Couple problems with this that I'm hoping someone will be able to help me out with
      On Launch of Facets, I get the PID from Shellexecute which I can then pass into the IUIA to search the proper window which is great, but the Click and Send functions from IUIA don't actually send directly to the control so It can get flaky when 5+ Facets screens are being controlled at the same time. On Launch of Facets, I use the PID to then get the Windows Hwnd.  When trying to do ControlClick, or Control* I can't seem to find any of the Popup windows such as the Database Select, or Login Creds using the Handle from the Main App and text from the Pop window. ex... ControlClick($MainUIhwnd, "text from popup", "Button1")  Is there some other way to identify popup windows for ControlClick type functions?  
    • By parrishjason
      Hello all.

      I currently have an AutoIT script that uses INetGet to retrieve and run files over a network. However, as it stands the app has currently changed to the point where I must open an actual browser in order to be able to get to the file (at least, this is the easiest way).
       
      Right now I have an extremely unreliable and clunky set of Send and Click commands to accomplish this task with sleeps in between everything to the point where I *hope* my file was downloaded before I try to click the "Run" button in microsoft edge. 
       
      I've been looking into IUIautomation, but I'm having quite a time understanding how to actually use it properly.
       
      I'd think that a script to navigate to a URL, download a file, then click "Run" in the browser would be simple. If I can get any help that'd be highly appreciated.
       
      Once I see a sample of how to download the file, the navigation part should be quite trivial to figure out.
    • By luckyluke
      Hi all
      Im working with sample code from this page:
      '?do=embed' frameborder='0' data-embedContent>>
      The example code is 
      Example 4 that demonstrates the calculator ​The error i get when run this code is:
      --> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop matched: class30012 Matching: 30012 for CalcFrame "C:\Program Files\AutoIt3\Include\UIAWrappers.au3" (553) : ==> Variable must be of type "Object".: $objUIAutomation.createPropertyCondition($PropertyId, $tVal, $pCondition) $objUIAutomation^ ERROR ->21:51:53 AutoIt3.exe ended.rc:1 +>21:51:53 AutoIt3Wrapper Finished.. Please help
      Thanks
×
×
  • Create New...