A project I’m currently working on involves populating data into a rather poorly designed user interface. A particular challenge were the drop down lists and list boxes due to the fact that you can’t “drill down” by sending the text of the item you want selected.
The solution we settled upon uses the text capture function GetTextAtPoint in a loop which arrows down the entire list, with GetTextAtPoint capturing the text in the selection box to see if it’s the value required. If it is we stop, else we continue to press down and loop. We stop if the item selected is the same as the previous item, signifying that we’ve reached the end (obviously this assumes the list doesn’t have duplicates appearing together).
Here’s the subroutine:
SRT>dropDownSelect /***** Usage: GoSub>dropDownSelect,X,Y,text_to_select Where X and Y are coordinates in the edit box (where the item appears once selected) and text_to_select is the text you want selected Important: the drop down needs to have the focus *****/ If>dropDownSelect_Var_3<> GetTextReset Press Home Wait>0.1 Let>prev_comboText=Z@$%#XXX Let>dropDownFound=FALSE Label>select_drop GetTextAtPoint>dropDownSelect_Var_1,dropDownSelect_Var_2,comboText,c Pos>dropDownSelect_Var_3,comboText,1,p If>p<>1 If>prev_comboText<>comboText Press Down Wait>0.2 Let>prev_comboText=comboText Goto>select_drop Endif Else Let>dropDownFound=TRUE Endif Endif END>dropDownSelect
So, for example, you could call it something like:
Press Tab GoSub>dropDownSelect,240,355,Apples
Note that the drop down needs to be focused. Usually you’d be “tabbing” through fields on the form, so once you’ve used “Press Tab” to get focus onto the control you can call dropDownSelect.
This version requires that you pass the X,Y screen position of the text box area of the drop down. In development at the moment we have a new function which returns the handle of the currently focused object, and this can then be used in GetWindowPos to get the X,Y position. So in future you will be able to determine the X,Y position dynamically.
Hopefully you won’t need this function as you can usually “drill down” on a list box or drop down list by sending the text of the item you want as mentioned here. But for those badly designed controls that won’t allow that this function can be a life saver.