abaj Posted October 14, 2010 Posted October 14, 2010 Good day, In C++ MFC application (i'm testing it with AutoIt, ActiveX version) there are several similar dialogs with almost similar controls. But actual "TEXT" parameter for these controls differs. So, there might be button "TEXT:OK" in one dialog, and "TEXT:&OK" in another one. (Of cause, this is an application problem, but workaround is needed anyway) I might have tried it incorrectly, but following doesn't work: ControlClick("My Window", "", "[CLASS:Button; TEXT:.*Finish; INSTANCE:2]") Of cause i can check which of buttons "TEXT:OK" or "TEXT:&OK" exists at each specified moment of script, but it looks like slow solution. Considering, that there are REGEXPCLASS parameter for Control definition, is there some functionality like REGEXPTEXT ? Like ControlClick("My Window", "", "[CLASS:Button; REGEXPTEXT:.*Finish; INSTANCE:2]") Thanks for any comments
PsaltyDS Posted October 14, 2010 Posted October 14, 2010 No, but you could implement that pretty easily by looping on INSTANCE (1-based) and testing the text in any way you like. Demo not tested, but you get the idea: $sTitle = "My Window" $sText = "" $sClass = "Button" $hButton = _ControlGetHandleByText($sTitle, $sText, $sClass, ".*Finish") If @error Then MsgBox(16, "Error", "Not found, _ControlGetHandleByText() returned @error = " & @error) Else ControlClick($sTitle, $sText, $hButton) MsgBox(64, "Success", "Click button with handle = " & $hButton) EndIf Func _ControlGetHandleByText($vWinTitle, $vWinText, $sCtrlClass, $sTextRegExp) Local $hWin, $hCtrl, $sCtrlText, $i = 0 $hWin = WinGetHandle($vWinTitle, $vWinText) If @error Then Return SetError(1, 0, "") ; Window not found If Not IsString($sCtrlClass) Then Return SetError(2, 0, "") ; Invalid class string While 1 $i += 1 $hCtrl = ControlGetHandle($hWin, "", "[CLASS:" & $sCtrlClass & "; INSTANCE:" & $i & "]") If @error Then Return SetError(3, 0, "") ; Control not found If StringRegExp(ControlGetText($hWin, "", $hCtrl), $sTextRegExp, 0) Then Return $hCtrl ; Match found WEnd EndFunc ;==>_ControlGetHandleByText Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
abaj Posted October 15, 2010 Author Posted October 15, 2010 Thank you, I'll use your solution. Just wanted to be sure that there is no built-in way to get control by regexp text. Because of using AutoIt via COM as AutoItX3.dll (from C#), i was thinking that built-in way will work some faster. But timers show that "WinGetHandle" takes about 1 ms, and "ControlGetText" takes about 0.7 ms. So, even with 10-20 controls on the dialog - this loop will work fast enough. Thanks
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now