Jump to content
RHolmes

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

Share this post


Link to post
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.

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

  • Similar Content

    • By nacerbaaziz
      hello sirs, please i created a tool witch get the focused control in a window and play a audio file linked with this controls
      e.g buttons, checkBoxes, radios, comboboxes, and others
      i know that their is a function that give us the control focus but it return the classNN
      i want to get the class name to use it with a switch and
      because their are more than class e.g button tbutton timagebutton tnewButton...
      please can any one help me to get the class name not the classnn
      thanks in advance
    • By nacerbaaziz
      Hello my friends
      Can we create a single context menu on more than one item?
      For example, a context menu includes standardized options on more than one control, such as buttons or check boxes
      to Create a context menu on one item am using this function
      GUICtrlCreateContextMenu ($ HWND)
      How to link it with more than one element please?
      or if we can't do that, please give me a solution
      so i tried to add an context menus to all the controls but the script will be long, for that if their are any solutions i hope to give it to me
      thanks in advanced
    • By TheAutomator
      Is there a (simple) way to make your script using a picture-control to resize the gui?
      This would be useful for a transparant pop-up window with a custom made theme using picture controls:
      $Form = GUICreate('', 301, 173, 5, 5, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST)) GUICtrlCreatePic(@scriptdir & "\resize_win.bmp", 0, 73, 20, 51) ; some api call or code telling the os to use this picture as a resize border GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT) GUISetState(@SW_SHOW) While True if GUIGetMsg() = $GUI_EVENT_CLOSE then Exit WEnd  
      EDIT: to make it more clear what i wanna do, if you go with the mouse arrow over the border of a re-sizable window the arrow changes to a "resize" arrow, you click and drag the border and then the window size adjusts to the mouse position until you release the mouse button.
      I want my picture control to be used the same way as the resize border to resize my window.
    • By ur
      An application is there which is created using vc++,mostly mfc.
       
      DOn't know the details completely.
       
      WHen I try to automate the control clicks for testing the UI.
      THe below control is not detected.
      As you can see, during UI operations I can click the elements one by one.
      But all the elements is selected as a whole set, when I use the Windowinfo tool.

       
      How to click this using AutoIT.?
       
      Please suggest.
    • By nacerbaaziz
      Hi dear
      This is the first include file I designed
      This work is especially directed to NVDA free screen reader users
      It contains a set of functions that enable you to control the program
      Such as forcing the program to read a custom text
      Force it to stop talking
      Find out if the program is running
      And show custom text in the Braille screen
      Available functions are
      _nvdaControllerClient_Load()
      to load the dll file
      _nvdaControllerClient_free()
      to UnLoad the dll file
      _nvdaControllerClient_SpeakText()
      to speak a custom text
      _nvdaControllerClient_brailleMessage()
      to show custom text in the Braille screen
      _nvdaControllerClient_cancelSpeech()
      to Force the NVDA  to stop talking
      _nvdaControllerClient_testIfRunning()
      to check if the NVDA is running
      important note :
      All of these functions depend on a nvdaControllerClient32.dll
      I've added it in the attachments, as well as a file for examples, and other files
      As the source and examples in other languages
      For those who wanted to download the free screen reader, this is the download link from the official website
      https://www.nvaccess.org/download/
      i hope you like this topic
      I hope you will try it and give me your opinions
      Thank you all members and administrators for their help
      now with the  Attachments
       
      nvdaControllerClient_UDF.zip
×
×
  • Create New...