Sign in to follow this  
Followers 0
BigDaddyO

Identify Popup windows of a specific Window Handle

5 posts in this topic

#1 ·  Posted

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

  1. 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.
  2. 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?

 


Share this post


Link to post
Share on other sites



#2 ·  Posted

Update:  

Still unsure how to handle #1 above, but for my #2 above, I have found a rather complicated process, but it works and seems to be reliable.

I'll have to do this every time I interact with a popup so I'll probably put this into a separate function.

;Open the targeted Facets environment
    ConsoleWrite("File > Open" & @CRLF)
    WinMenuSelectItem($hFacets, "", "&File", "&Open Database")

;Find the Open Product window and specify the Database
    $bChild = False
    For $c = 1 to 10
        ConsoleWrite("$hFacets Handle = " & $hFacets & @CRLF)

        $hOpenHwnd = WinWait("Open Facets Product", "", 5)              ;Loop up to 10 times looking for the Open Facets Product, below process ensures it's the one for this script.
        If $hOpenHwnd <> 0 Then
            ConsoleWrite("Found the Open Facets Product window" & @CRLF)

            ;$bChild = _WinAPI_IsChild($hOpenHwnd, $hFacets)            ;Always returns 0 even though I can match properly using the GetParent!!!
            ;ConsoleWrite("is Popup a child:  " & $bChild & @CRLF)

            $hParent = _WinAPI_GetParent($hOpenHwnd)
            ConsoleWrite("The Open Facets Product Parent = " & $hParent & @CRLF)

            If $hParent = $hFacets Then
                $bChild = True
                ExitLoop
            EndIf

        Else
            ConsoleWrite("Error, Couldn't find the Open Facets Product window " & @CRLF)
            ContinueLoop
        EndIf
    Next

    If $bChild <> True Then Exit 1


;Select the database we want to use.
    ControlSetText($hOpenHwnd, "", "Edit1", $sDatabase)                     ;Type out the full path to the database we want
    sleep(250)
    ControlClick($hOpenHwnd, "", "Button1")                                 ;Click the Open button
    sleep(500)


;Log onto the selected Database
    $bChild = False
    For $c = 1 to 10
        ConsoleWrite("$hFacets Handle = " & $hFacets & @CRLF)

        $hLogonHwnd = WinWait("Logon", "", 5)               ;Loop up to 10 times looking for the Open Facets Product, below process ensures it's the one for this script.
        If $hLogonHwnd <> 0 Then
            ConsoleWrite("Found the Logon window" & @CRLF)

            ;$bChild = _WinAPI_IsChild($hLogonHwnd, $hFacets)           ;Always returns 0 even though I can match properly using the GetParent!!!
            ;ConsoleWrite("is Popup a child:  " & $bChild & @CRLF)

            $hParent = _WinAPI_GetParent($hLogonHwnd)
            ConsoleWrite("The Logon Parent = " & $hParent & @CRLF)

            If $hParent = $hFacets Then
                $bChild = True
                ExitLoop
            EndIf

        Else
            ConsoleWrite("Error, Couldn't find the Logon window " & @CRLF)
            ContinueLoop
        EndIf
    Next

    If $bChild <> True Then Exit 1

    ;Log into the database
    ControlSetText($hLogonHwnd, "", "Edit3", $sUserName)                                    ;Type in the UserID
    ;sleep(250)
    ControlSetText($hLogonHwnd, "", "Edit4", $sPassword)                                    ;Type in the Password
    ;sleep(250)
    ControlClick($hLogonHwnd, "", "Button1")                                                ;Click OK to login

 


Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

I have lots of functions like this at work...If I remember, I'll bring them back tomorrow...but another good one to look into:

#include <WinAPI.au3>
_WinAPI_GetWindow ( $hWnd, $iCmd )

 

Use $iCmd = 6, where you pass in the parent window's handle...it will always return the processes current 'Enabled Popup' window handle (class something like #32700...could be a bit off...adding this off of memory)...you can use _WinAPI_GetWindow to get the 'parent window' as well

Edited by jdelaney

IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.

Share this post


Link to post
Share on other sites

#4 ·  Posted

10 hours ago, jdelaney said:

#include <WinAPI.au3>
_WinAPI_GetWindow ( $hWnd, $iCmd )

jdelaney,  Thanks for the info, and that function works but I have to include it as part of a loop to wait for the window and also add additional steps to ensure it's the popup window I want.  I'm going to stick with my function posted above for now.  I think I'm going to use _WinAPI_GetWindow as part of my cleanup function to close any popup window.


Share this post


Link to post
Share on other sites

#5 ·  Posted

That's going to be a standard for all scripting.  There are generally granular functions that you want to use, that you have to wrap with a timer (loop) to do exactly what is required.


IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.

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  
Followers 0

  • Similar Content

    • parrishjason
      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.
    • ngskicker
      By ngskicker
      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> UIA_ProcessId:= <1404> UIA_ControlType:= <50033> UIA_LocalizedControlType:= <pane> UIA_Name:= <20.40.22> UIA_HasKeyboardFocus:= <True> UIA_IsKeyboardFocusable:= <True> UIA_IsEnabled:= <True> UIA_ClassName:= <OKttbx> UIA_Culture:= <0> UIA_IsControlElement:= <True> UIA_IsContentElement:= <True> UIA_IsPassword:= <False> UIA_NativeWindowHandle:= <1311620> UIA_IsOffscreen:= <False> UIA_Orientation:= <0> UIA_FrameworkId:= <Win32> UIA_IsRequiredForForm:= <False> UIA_IsDockPatternAvailable:= <False> UIA_IsExpandCollapsePatternAvailable:= <False> UIA_IsGridItemPatternAvailable:= <False> UIA_IsGridPatternAvailable:= <False> UIA_IsInvokePatternAvailable:= <False> UIA_IsMultipleViewPatternAvailable:= <False> UIA_IsRangeValuePatternAvailable:= <False> UIA_IsScrollPatternAvailable:= <False> UIA_IsScrollItemPatternAvailable:= <False> UIA_IsSelectionItemPatternAvailable:= <False> UIA_IsSelectionPatternAvailable:= <False> UIA_IsTablePatternAvailable:= <False> UIA_IsTableItemPatternAvailable:= <False> UIA_IsTextPatternAvailable:= <False> UIA_IsTogglePatternAvailable:= <False> UIA_IsTransformPatternAvailable:= <False> UIA_IsValuePatternAvailable:= <False> UIA_IsWindowPatternAvailable:= <False> UIA_ValueIsReadOnly:= <True> UIA_RangeValueValue:= <0> UIA_RangeValueIsReadOnly:= <True> UIA_RangeValueMinimum:= <0> UIA_RangeValueMaximum:= <0> UIA_RangeValueLargeChange:= <0> UIA_RangeValueSmallChange:= <0> UIA_ScrollHorizontalScrollPercent:= <0> UIA_ScrollHorizontalViewSize:= <100> UIA_ScrollVerticalScrollPercent:= <0> UIA_ScrollVerticalViewSize:= <100> UIA_ScrollHorizontallyScrollable:= <False> UIA_ScrollVerticallyScrollable:= <False> UIA_SelectionCanSelectMultiple:= <False> UIA_SelectionIsSelectionRequired:= <False> UIA_GridRowCount:= <0> UIA_GridColumnCount:= <0> UIA_GridItemRow:= <0> UIA_GridItemColumn:= <0> UIA_GridItemRowSpan:= <1> UIA_GridItemColumnSpan:= <1> UIA_DockDockPosition:= <5> UIA_ExpandCollapseExpandCollapseState:= <3> UIA_MultipleViewCurrentView:= <0> UIA_WindowCanMaximize:= <False> UIA_WindowCanMinimize:= <False> UIA_WindowWindowVisualState:= <0> UIA_WindowWindowInteractionState:= <0> UIA_WindowIsModal:= <False> UIA_WindowIsTopmost:= <False> UIA_SelectionItemIsSelected:= <False> UIA_TableRowOrColumnMajor:= <2> UIA_ToggleToggleState:= <2> UIA_TransformCanMove:= <False> UIA_TransformCanResize:= <False> UIA_TransformCanRotate:= <False> UIA_IsLegacyIAccessiblePatternAvailable:= <True> UIA_LegacyIAccessibleChildId:= <0> UIA_LegacyIAccessibleName:= <20.40.22> UIA_LegacyIAccessibleRole:= <10> UIA_LegacyIAccessibleState:= <1048580> UIA_IsDataValidForForm:= <False> UIA_ProviderDescription:= <[pid:5708,hwnd:0x140384 Main:Nested [pid:1404,hwnd:0x140384 Annotation(parent link):Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); 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>
    • luckyluke
      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