Fiinguer Posted February 19, 2021 Share Posted February 19, 2021 Hi there, I am STRUGGLING with this and I didn't find an answer. I have this simple code below, where I need to click a button to export some data from the application "CSDB - Cost Saving Database". expandcollapse popup; Create UI Automation object Local $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtag_IUIAutomation ) If Not IsObj( $oUIAutomation ) Then Return ConsoleWrite( "$oUIAutomation ERR" & @CRLF ) ConsoleWrite( "$oUIAutomation OK" & @CRLF ) ; Get Desktop element Local $pDesktop, $oDesktop $oUIAutomation.GetRootElement( $pDesktop ) $oDesktop = ObjCreateInterface( $pDesktop, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement ) If Not IsObj( $oDesktop ) Then Return ConsoleWrite( "$oDesktop ERR" & @CRLF ) ConsoleWrite( "$oDesktop OK" & @CRLF ) ; --- Find window/control --- ConsoleWrite( "--- Find window/control ---" & @CRLF ) Local $pCondition0 $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "CSDB - Cost Saving Database", $pCondition0 ) If Not $pCondition0 Then Return ConsoleWrite( "$pCondition0 ERR" & @CRLF ) ConsoleWrite( "$pCondition0 OK" & @CRLF ) Local $pWindow1, $oWindow1 $oDesktop.FindFirst( $TreeScope_Children, $pCondition0, $pWindow1 ) $oWindow1 = ObjCreateInterface( $pWindow1, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement ) If Not IsObj( $oWindow1 ) Then Return ConsoleWrite( "$oWindow1 ERR" & @CRLF ) ConsoleWrite( "$oWindow1 OK" & @CRLF ) ; --- Find window/control --- ConsoleWrite( "--- Find window/control ---" & @CRLF ) Local $pCondition1 $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, "toolStripButton2", $pCondition1 ) If Not $pCondition1 Then Return ConsoleWrite( "$pCondition1 ERR" & @CRLF ) ConsoleWrite( "$pCondition1 OK" & @CRLF ) Local $pButton1, $oButton1 $oWindow1.FindFirst( $TreeScope_Descendants, $pCondition1, $pButton1 ) $oButton1 = ObjCreateInterface( $pButton1, $sIID_IUIAutomationElement, $dtag_IUIAutomationElement ) If Not IsObj( $oButton1 ) Then Return ConsoleWrite( "$oButton1 ERR" & @CRLF ) ConsoleWrite( "$oButton1 OK" & @CRLF ) ; --- Invoke Pattern (action) Object --- ConsoleWrite( "--- Invoke Pattern (action) Object ---" & @CRLF ) Local $pInvokePattern1, $oInvokePattern1 $oButton1.GetCurrentPattern( $UIA_InvokePatternId, $pInvokePattern1 ) $oInvokePattern1 = ObjCreateInterface( $pInvokePattern1, $sIID_IUIAutomationInvokePattern, $dtag_IUIAutomationInvokePattern ) If Not IsObj( $oInvokePattern1 ) Then Return ConsoleWrite( "$oInvokePattern1 ERR" & @CRLF ) ConsoleWrite( "$oInvokePattern1 OK" & @CRLF ) $oInvokePattern1.invoke() In this first image, I have "Summary" tab selected with some data. When I run the code, it goes to the excel logo button on the toolbar and exports beautifully. $oUIAutomation OK $oDesktop OK --- Find window/control --- $pCondition0 OK $oWindow1 OK --- Find window/control --- $pCondition1 OK $oButton1 OK --- Invoke Pattern (action) Object --- $oInvokePattern1 OK In this second image, I have tab "Prices" selected. And when I run the code I get error: $oUIAutomation OK $oDesktop OK --- Find window/control --- $pCondition0 OK $oWindow1 OK --- Find window/control --- $pCondition1 OK $oButton1 ERR I don't know what else I can do, I have already tried everything I know (kinda new at autoit), but it does not makes any sense to me. I need to export the data from the tab "Prices", not "Summary". Anyone who can help me? Please!! (I have uploaded screens of UIASpy showing the main application, info about the toolstrip toolbar and the button. I have already tried first with toolbar and after button, but I get the same situation for the toolbar) Link to comment Share on other sites More sharing options...
LarsJ Posted February 19, 2021 Share Posted February 19, 2021 In such a slightly strange situation, the best thing you can do is print the entire control structure in the window. Print the control structure when the "Summary" tab is selected and print the control structure again when the "Prices" tab is selected. Then you can compare the two control structures and try to find out why the Excel button is only correctly identified in one of the two situations. You print the entire control structure this way: Right-click the application top window in the tree view in UIASpy and select "Update all childs of element". Right-click the application top window again and select "Create element tree structure". Then the entire control structure should be shown in the list view. Right-click the list view and select "Copy all items". Now you can Paste the entire control structure into your Editor. Fiinguer 1 Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
Fiinguer Posted February 19, 2021 Author Share Posted February 19, 2021 3 hours ago, LarsJ said: In such a slightly strange situation, the best thing you can do is print the entire control structure in the window. Print the control structure when the "Summary" tab is selected and print the control structure again when the "Prices" tab is selected. Then you can compare the two control structures and try to find out why the Excel button is only correctly identified in one of the two situations. You print the entire control structure this way: Right-click the application top window in the tree view in UIASpy and select "Update all childs of element". Right-click the application top window again and select "Create element tree structure". Then the entire control structure should be shown in the list view. Right-click the list view and select "Copy all items". Now you can Paste the entire control structure into your Editor. It worked! Thank you very much! In "Prices" tab it had 2 "toolStrip" toolbars, don't know why. The only thing it changes between the 2 of them is the native handle property. My question is, can I identify the handle of the "right" toolStrip? Or the handle never changes? LarsJ 1 Link to comment Share on other sites More sharing options...
LarsJ Posted February 20, 2021 Share Posted February 20, 2021 Good to see that you're able to use UI Automation code. The toolStrip handle will get a new value every time you open the application. But as long as the application is open, the handle will be the same. You must divide the search for the Excel button into two steps. First you'll find the correct toolStrip control. Then you'll find the Excel button. You use FindAll( $TreeScope_Descendants, $pCondition, $pElements ) to find the two toolStrip controls. The result in $pElements is an UI Automation element array with two elements. Since the control structure of your window is always the same, the index of the array element that contains the correct handle will also always be the same. ConsoleWrite the two handles in the element array and Use UIASpy to identify the correct index. Get all texts in a Chrome window shows how to use an UI Automation element array. There's a 7z-file at bottom of post that you can download and run the code. Once you have identified the correct toolStrip control, you can search for the Excel button with the toolStrip control as the start control. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now