Jump to content

ControlGetHandle won't return control


Recommended Posts

I wrote a script a few months ago that was working at the time. When I tried it today it wouldn't retrieve any controls.  The application successfully launches, but I cannot figure out how to retrieve the control from the window that is launched. I'm on a windows 10 machine using AutoIt v3.3.14.2. The only thing I can think of that has changed is windows updates? Code is below, any help is greatly appreciated.
  
; Notes: 
; HandleError( handleToCheck, MsgToLogOnFailure, terminateAutoItOnFail ) : function that simply checks the handle and quits AutoIt if not present

; all of this works well
FileChangeDir( $CLIENT_APPLICATION_DIR );  
Run( "Client.exe" )  
Local $hClient = WinWaitActive( $CLIENT_TITLE, "", 10 )  
$terminateOnFail = 1  
HandleError( $hClient, "LaunchClient::Error: Failed to launch client. Either timed-out or failed.", $terminateOnFail )  
LogToFile( "Client launched, waiting for system to ready." )  

Sleep( 5000 )  

; this part does not work
; $SYSTEM_INDICATOR is a global variable. I have tried these values: "SystemIndicatorWindow" (Text), "Qt5QWindowIcon101" (ClassNN), and 
; "[CLASS:Qt5QWindowIcon; INSTANCE:101]"
Local $hStatusIndicator = ControlGetHandle( $hClient, "", $SYSTEM_INDICATOR )  
HandleError( $hStatusIndicator, "CheckStatus::Error: couldn't retrieve control: " & $SYSTEM_INDICATOR, $terminateOnFail )

This is what the spy reveals: 

help.png.b1d4209be46c47c33cb5e69b17bd1606.png

 

Edit: I just tried this code and it works for notepad++.

FileChangeDir( "C:\Program Files\Notepad++\" );
  Run( "notepad++.exe" )
  Local $hNotePad = WinWaitActive( "new 1 - Notepad++", "", 10 )

  If $hNotePad = 0 Or $hNotePad = -1 Then
    MsgBox( $MB_SYSTEMMODAL, "Error", "Error getting app handle." )
  EndIf

  Sleep( 1000 )

  Local $hNewFileBtn = ControlGetHandle( $hNotePad, "", "[CLASS:ToolbarWindow32; INSTANCE:1]" )

  If $hNewFileBtn = 0 Or $hNewFileBtn = -1 Then
    MsgBox( $MB_SYSTEMMODAL, "Error", "Error getting button handle." )
  EndIf

  MsgBox( $MB_SYSTEMMODAL, "Success", "Success." )

 

Edited by RHolmes
additional information
Link to comment
Share on other sites

Just to cleanup your code, I'd use IsHwnd

Local $hNotePad = WinWait("new 1 - Notepad++","",10)
If Not IsHWnd($hNotePad) Then
    MsgBox($MB_SYSTEMMODAL,"Error","Error getting app handle.")
    Exit
EndIf
WinActivate($hNotePad)

Local $hNewFileBtn = ControlGetHandle($hNotePad,"","[CLASS:ToolbarWindow32; INSTANCE:1]")
If Not IsHWnd($hNewFileBtn) Then
    MsgBox($MB_SYSTEMMODAL,"Error","Error getting button handle.")
    Exit
EndIf

Maybe try using my signature, and seeing if there are other attributes that you can use to ID your control?  I'm thinking I'll post a function I use at work that was super helpful for me...it accepts an array of parameters so that you can narrow down controls by visibility, text, enabled/disabled, id, class, etc....all in one go.

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.
Link to comment
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
 Share

×
×
  • Create New...