Jump to content
Sign in to follow this  

Recommended Posts

I have found AutoIT to be very useful in automating some of the older programs that we use, but I am now trying to work out how to automate newer programs that use the Windows Forms - such as WindowsForms10.Window.8.app.0.2bf8098_r13_ad1

I have read through the manual, but do not find anything on this there. I have also done some reading on the forum and have found material that looks useful, but I am not familiar with this and some of the threads look a little old. Please could someone update me on what the latest status is on this?

  • Are there any plans to provide wrappers to the UI Automation controls, similar to those already provided for ListView, ComboBox, etc?
  • How would I go about making a menu selection with such a system?
  • If people are not using AutoIT for this kind of automation, then what are they using instead?

Similar threads:

Other questions if you have time...

  • What is the difference between MSAA mode and UI Automation?
  • If I am using "Inspect.exe", how do I identify what information that I need to send a command to the control?

Sorry - lots of questions - I am very much finding my way around this.

 

Share this post


Link to post
Share on other sites

muchado, Windows Forms can be automated with the UI Automation framework. (How could you fail to find that thread? You need to improve your searching skills.)

Download the two UDFs in bottom of first post, and download and run the code in the "Simple spy demo" codebox in the middle of first post.

To verify that a control can be identified place the mouse cursor over the control and press Ctrl+w. You can see an example here.

Note that the framework is based on COM interface objects (created with ObjCreateInterface), so it's not just as easy to use as most built-in commands.

One of the UDFs contain wrapper functions to make everything a little bit easier. But it's still not as easy to use as built-in commands.

To see how to automate a menu system, just go through some of the examples (you can test some searching here).

When it comes to pure UI Automation, you can do everything with AutoIt as you can do with C++. There is really no need to use anything else. And I don't know what people else are using.

When you are using MSAA mode (in Inspect.exe), the information is provided with the old MS Active Accessibility API (IAccessible interface and some helper functions, both are implemented in the UI Automation framework). When you are using UI Automation mode, the information is provided with the new UI Automation interfaces. UI Automation is much better (and bigger) than MSAA.

With the "Simple spy demo" it's much easier to identify a specific control or window, than it is with Inspect.exe. I'm mostly using Inspect.exe to verify that the "Simple spy demo" does provide correct information. And it does.

In addition to UI Automation and IAccessible interfaces, IAccessible2 and ISimpleDOM are implemented too.

Share this post


Link to post
Share on other sites

Have you looked through the IUIAutomation UDF thread in the examples section?

'?do=embed' frameborder='0' data-embedContent>>

Thanks!

muchado, Windows Forms can be automated with the UI Automation framework. (How could you fail to find that thread? You need to improve your searching skills.)

Download the two UDFs in bottom of first post, and download and run the code in the "Simple spy demo" codebox in the middle of first post.

To verify that a control can be identified place the mouse cursor over the control and press Ctrl+w. You can see an example here.

Note that the framework is based on COM interface objects (created with ObjCreateInterface), so it's not just as easy to use as most built-in commands.

One of the UDFs contain wrapper functions to make everything a little bit easier. But it's still not as easy to use as built-in commands.

To see how to automate a menu system, just go through some of the examples (you can test some searching here).

When it comes to pure UI Automation, you can do everything with AutoIt as you can do with C++. There is really no need to use anything else. And I don't know what people else are using.

When you are using MSAA mode (in Inspect.exe), the information is provided with the old MS Active Accessibility API (IAccessible interface and some helper functions, both are implemented in the UI Automation framework). When you are using UI Automation mode, the information is provided with the new UI Automation interfaces. UI Automation is much better (and bigger) than MSAA.

With the "Simple spy demo" it's much easier to identify a specific control or window, than it is with Inspect.exe. I'm mostly using Inspect.exe to verify that the "Simple spy demo" does provide correct information. And it does.

In addition to UI Automation and IAccessible interfaces, IAccessible2 and ISimpleDOM are implemented too.

Thanks for the additional information and for the relative value of MSAA and UI Automation. That is very helpful.

It is strange that I didn't find that posting. My searching skills are generally quite good and I thought I had put some of those terms in my Google Search. I found plenty that was written by junkew and spent quite a lot of time reading his posts as well as those by others.

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 rmckay
      Hello,
      I'm trying to change the text in a TextBlock.  I stumbled onto the solution a couple of days ago but managed to delete the script.  I found an example in Stack Overflow written in C++ and the comments indicated that the proper way to change the text is using the "value" variables.  I've tried several combinations in AutoIt with no success 
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include "UIA_Constants.au3" ; Can be copied from UIASpy Includes folder Opt("MustDeclareVars", 1) HotKeySet('{ESC}', 'Quit') Example() Func Example() ; Create UI Automation object Local $oUIAutomation = ObjCreateInterface($sCLSID_CUIAutomation8, $sIID_IUIAutomation5, $dtag_IUIAutomation5) 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_IUIAutomationElement8, $dtag_IUIAutomationElement8) 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_ClassNamePropertyId, "TextBlock", $pCondition0) If Not $pCondition0 Then Return ConsoleWrite("$pCondition0 ERR" & @CRLF) ConsoleWrite("$pCondition0 OK" & @CRLF) Local $pText1, $oText1 $oDesktop.FindFirst($TreeScope_Descendants, $pCondition0, $pText1) $oText1 = ObjCreateInterface($pText1, $sIID_IUIAutomationElement8, $dtag_IUIAutomationElement8) If Not IsObj($oText1) Then Return ConsoleWrite("$oText1 ERR" & @CRLF) ConsoleWrite("$oText1 OK" & @CRLF) ; --- Control Pattern Properties --- ConsoleWrite("--- Control Pattern Properties ---" & @CRLF) Local $sLegacyIAccessibleName1 $oText1.GetCurrentPropertyValue($UIA_LegacyIAccessibleNamePropertyId, $sLegacyIAccessibleName1) ConsoleWrite("$sLegacyIAccessibleName1 = " & $sLegacyIAccessibleName1 & @CRLF) ; --- LegacyIAccessible Pattern (action) Object --- ConsoleWrite("--- LegacyIAccessible Pattern (action) Object ---" & @CRLF) Local $pLegacyIAccessiblePattern1, $oLegacyIAccessiblePattern1 $oText1.GetCurrentPattern($UIA_LegacyIAccessiblePatternId, $pLegacyIAccessiblePattern1) $oLegacyIAccessiblePattern1 = ObjCreateInterface($pLegacyIAccessiblePattern1, $sIID_IUIAutomationLegacyIAccessiblePattern, $dtag_IUIAutomationLegacyIAccessiblePattern) If Not IsObj($oLegacyIAccessiblePattern1) Then Return ConsoleWrite("$oLegacyIAccessiblePattern1 ERR" & @CRLF) ConsoleWrite("$oLegacyIAccessiblePattern1 OK" & @CRLF) ; --- LegacyIAccessible Pattern (action) Methods --- ConsoleWrite("--- LegacyIAccessible Pattern (action) Methods ---" & @CRLF) Local $iStr = "Test String" $oLegacyIAccessiblePattern1.SetValue($iStr) ConsoleWrite("$oLegacyIAccessiblePattern1.SetValue()" & @CRLF) While 1 WEnd EndFunc ;==>Example Func Quit() Exit EndFunc ;==>Quit $oUIAutomation OK $oDesktop OK --- Find window/control --- $pCondition0 OK $oText1 OK --- Control Pattern Properties --- $sLegacyIAccessibleName1 = 12/26/2019 11:38:15 PM --- LegacyIAccessible Pattern (action) Object --- $oLegacyIAccessiblePattern1 OK --- LegacyIAccessible Pattern (action) Methods --- $oLegacyIAccessiblePattern1.SetValue() This is the window I'm working with:

      and here is the UIASpy display

      The text in the TextBlock never changes and I've used $oLegacyIAccessiblePattern.CurrentValue($iCurrentValue) on several different attempts (not in script).  The output is always blank.  
      Thanks in advance
    • By rmckay
      Hello,
      I'm trying to use ui automation to control a 3rd party program called Ninja Trader.  It's a stock charting program.  It creates child charts that can be modified individually.  Each chart has a popup window to enable modifications to the respective chart.  I've nearly completed the automation project I've been working on for months (includes attempting to understand the ui automation process).  The last challenge is to activate the popup window.  It's accessed from the respective chart by right clicking on the chart.  I've tried the combination of each Element Properties (has/is info), Control Patterns (element actions), and Control Pattern Properties with all the Control Pattern Methods.  Most of those combinations give an error.  I assumed the combination of $UIA_IsLegacyIAccessiblePatternAvailablePropertyId  True (LegacyIAccessiblePattern) and      DoDefaultAction() would do something.  It doesn't get flagged as an error but it also doesn't do anything.  I've done the same drill with both "Menu: ContextMenu" and " Pane:ScrollIViewer" as the base for ObjCreateInterface.  I've included screen shots of the UIASpy results and a screen shot of the window with popup.  I assumed that I could modify code that worked with menus activated by right clicking on task bar icons.  I've not been able to locate code (maybe recognize it) that addresses the problem.   Any pointers as to what I'm missing will be greatly appreciated.
      Thanks in advance.
       



    • By toto22
      I'm working on a script that does Auto-Log in for me. it looks like this :
      #include "UIAWrappers.au3" If ProcessExists("Advanced Dashboard.exe") Then Else Run("C:\Program Files (x86)\Advanced Dashboard\Advanced Dashboard.exe") EndIf sleep(1000) Local $oP6=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=Advanced Dashboard", $treescope_children) Local $oP5=_UIA_getObjectByFindAll($oP6, "Title:=;controltype:=UIA_PaneControlTypeId;class:=WindowsForms10.Window.8.app.0.34f5582_r9_ad1", $treescope_children) Local $oP4=_UIA_getObjectByFindAll($oP5, "Title:=;controltype:=UIA_PaneControlTypeId;class:=Shell Embedding", $treescope_children) Local $oP3=_UIA_getObjectByFindAll($oP4, "Title:=;controltype:=UIA_PaneControlTypeId;class:=Shell DocObject View", $treescope_children) Local $oP2=_UIA_getObjectByFindAll($oP3, "controltype:=UIA_PaneControlTypeId;class:=Internet Explorer_Server", $treescope_children) _UIA_Action($oP2,"setfocus") Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=WebBroker Login;controltype:=UIA_PaneControlTypeId;class:=", $treescope_children) Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_GroupControlTypeId;class:=", $treescope_children) Local $oUIElement1=_UIA_getObjectByFindAll($oP0, "title:=Password;ControlType:=UIA_EditControlTypeId", $treescope_subtree) ;~_UIA_action($oUIElement,"highlight") _UIA_action($oUIElement1,"click") Send("*****") Local $oUIElement2=_UIA_getObjectByFindAll($oP0, "title:=Login;ControlType:=UIA_ButtonControlTypeId", $treescope_subtree) ;~_UIA_action($oUIElement,"highlight") _UIA_action($oUIElement2,"click") Is there a way to check if "$oUIElement1" exists before I enter my password?
      I want my script to wait for "$oUIElement1" object to be present in-order to to do a log-in and do not rely on Sleep(1000). Thank you in advance!
    • By RomanY
      Hi all,
      I have simple question and can not find answer on it. I am working with WPF application and I want to automate it with Autoit. For now I found Inspect.exe tool which gives me all wpf controls, but how do I can use that controls to click some buttons or dropdown list?
      For example I have such a controls
      AutomationId:    "comboArrayType" or 
      Name:    "_Submit"
      Which autoit command can I use to handle this?
      Thanks and Regards, Roman Y
    • By 232showtime
      Good  day, its my first time creating script using UIA Wrappers. im kinda confused:
      #include "UIAWrappers.au3" $FrmClassName="TFrmMain" $Button1="Add" ;script is clicking all the button, if I use all the button name in this control->[CLASS:TBitBtn; INSTANCE:12] $Form=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $FrmClassName, $treescope_children) if isobj($Form) Then $Button2=_UIA_getFirstObjectOfElement($Form,"name:=" & $Button1, $treescope_subtree) $oInvokeP=_UIA_getpattern($Button2,$UIA_InvokePatternID) $oInvokeP.Invoke EndIf  
      but if I use the option name in [CLASS:TActionMainMenuBar; INSTANCE:1] it doesn't click any option in menu bar like "File", "View" or "Edit" and got error mesage
       
      #include "UIAWrappers.au3" $FrmClassName="TFrmMain" $Button1="File" ;doesnt click File, View or edit in menubar $Form=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $FrmClassName, $treescope_children) if isobj($Form) Then $Button2=_UIA_getFirstObjectOfElement($Form,"name:=" & $Button1, $treescope_subtree) $oInvokeP=_UIA_getpattern($Button2,$UIA_InvokePatternID) $oInvokeP.Invoke EndIf ;got error "C:\Program Files (x86)\AutoIt3\Include\UIAWrappers.au3" (514) : ==> Variable must be of type "Object".: $obj.getCurrentPattern($patternID, $pPattern) $obj^ ERROR ->09:03:47 AutoIt3.exe ended.rc:1
      +>09:03:47 AutoIt3Wrapper Finished.
      >Exit code: 1    Time: 1.383
       
       
       
       
×
×
  • Create New...