NearMadness Posted June 27, 2011 Share Posted June 27, 2011 I admit, I've spent hours during the since yesterday on this and need help. It is NearMadness time around here! Ultimately, I need to be able to find out if the user has entered a specific textbox/area in a web form. I am not concerned with HOW he got there (whether it was by tabbing and/or clicking) - just need to know that the text-cursor has entered the object. For testing purposes, I have tried a number of approaches to determine the coordinates of the text cursor but the results are inconsistent. The code below shows some of my unrealiable tests - just shared to demonstrate effort undertaken but - feel free to ignore it and offer something completely different that actually works! Ideally, some guru here can offer a Function that can return whether or not the text cursor is within specified coordinates in a specified webform/page/url. expandcollapse popupAutoItSetOption("WinTitleMatchMode", 2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase AutoItSetOption("CaretCoordMode",2) ;2=relative to client window $varCoreApplWindow = "Contact Us - Online Form Builder | Freedback - Windows Internet Explorer" $i = 0 While $i <= 10 If WinExists($varCoreApplWindow) Then $state = WinGetState($varCoreApplWindow, "") ;2 = Window is visible ;4 = Window is enabled ;8 = Window is active ;16 = Window is minimized If BitAnd($state,2) And BitAnd($state,4) And Not BitAnd($state,16) Then $a = WinGetCaretPos() MsgBox(0,"First Method Pos", $a[0]) MsgBox(0,"First Method Pos", $a[1]) $b = _CaretPos() MsgBox(0,"Second Method Pos", $b[0]) MsgBox(0,"Second Method Pos", $b[1]) ; _Main() EndIf EndIf $i = $i + 1 MsgBox(0, "Value of $i is:", $i) WEnd ; If $ans < 0 Then ExitLoop WinGetCaretPos() Opt('MustDeclareVars', 1) Func _Main() Local $cursor, $text $cursor = _WinAPI_GetCursorInfo() $text = "Was the operation sucessful? " & $cursor[0] & @LF $text &= "Is the cursor showing? " & $cursor[1] & @LF & @LF $text &= "Cursor Handle: " & $cursor[2] & @LF $text &= "X Coordinate: " & $cursor[3] & @LF $text &= "Y Coordinate: " & $cursor[4] MsgBox(0, "_WinApi_GetCursorInfo Example", $text) EndFunc ;==>_Main ; More reliable method to get caret coords in MDI text editors. Func _CaretPos() Local $x_adjust = 5 Local $y_adjust = 40 Opt("CaretCoordMode", 0) ;relative mode Local $c = WinGetCaretPos() ;relative caret coords Local $w = WinGetPos("") ;window's coords Local $f = ControlGetFocus("","") ;text region "handle" Local $e = ControlGetPos("", "", $f) ;text region coords Local $t[2] If IsArray($c) and IsArray($w) and IsArray($e) Then $t[0] = $c[0] + $w[0] + $e[0] + $x_adjust $t[1] = $c[1] + $w[1] + $e[1] + $y_adjust Return $t ;absolute screen coords of caret cursor Else SetError(1) EndIf EndFunc Link to comment Share on other sites More sharing options...
monoscout999 Posted June 28, 2011 Share Posted June 28, 2011 (edited) Can you post the web link for test?... i think controlcommand() can do the job, but i have to figure out how to use it.Look at the example in the help of the function _IEPropertyGet()EDITED: Here i extract this.#include <IE.au3> $oIE = _IE_Example("form") $oForm = _IEFormGetObjByName($oIE, "ExampleForm") $oTextArea = _IEFormElementGetObjByName($oForm, "textareaExample") $innertext = _IEPropertyGet($oTextArea, "innertext") ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $innertext = ' & $innertext & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console Edited June 28, 2011 by monoscout999 Link to comment Share on other sites More sharing options...
NearMadness Posted June 28, 2011 Author Share Posted June 28, 2011 Monoscout,Thanks for pointing me in the direction of _IEPropertyGet()... I have just begun reading it but can't find a reference to Cursor or Focus... Can you help me a bit more?Say the webpage is the contact us form at https://www.goodsamdayton.org/gshcontactus.aspx - For instance, how can I find out if the cursor is placed in the Business Phone?Gracias! Link to comment Share on other sites More sharing options...
monoscout999 Posted June 28, 2011 Share Posted June 28, 2011 i ´m looking into MSDN i think that theres a way to catch some event when the control is active... but i`m new on _IE and objects.. so im learning too. the first problem i have is getting the exact object. Link to comment Share on other sites More sharing options...
NearMadness Posted June 28, 2011 Author Share Posted June 28, 2011 MOnoscout, I've been thinking that _WinAPI_GetCursorInfo holds the answer to this challenge but for some reason it returns unexpected coordinates/results.... although I can see going the way of _IE and objects would be far more reliable and elegant. Thanks for continuing to think about this. Link to comment Share on other sites More sharing options...
monoscout999 Posted June 28, 2011 Share Posted June 28, 2011 (edited) I advance a little! , but still i´m fighting to find out how to catch some Focus event on the object. Buuuuut i manage to do this "check for changes" script. #include <IE.au3> HotKeyset("{esc}","_exit") $oIE = _IECreate ("https://www.goodsamdayton.org/gshcontactus.aspx") $oInput = _IEGetObjByName ($oIE, "ctl00$ContentPlaceHolder1$txtBusinessPhone") ;~ for $i = 0 to 10 ;~ sleep(100) ;~ $pInput = _IEPropertyset($oInput, "innertext",$i) ;~ Next ; This was a test... $vInput = _IEFormElementGetValue($oInput) ; I don´t know why _IEPropertyget($oInput, "innertext") dont work :S while True If _IEFormElementGetValue($oInput) <> $vInput Then msgbox(0,"i think i got it","Somethign has changed") $vInput = _IEFormElementGetValue($oInput) EndIf sleep(500) WEnd func _exit() Exit EndFunc Run it, an IE window will open, then try to write something in the Business Phone input. I have a couple of problems doing this, i dont know why my IE8 cant be attached and always need to open a new window. and i don´t know why _IEPropertyget() dont return anything and i have to use _IEFormElementGetValue(). If someone experienced know any answer i will apreciate. Edited June 28, 2011 by monoscout999 Link to comment Share on other sites More sharing options...
NearMadness Posted June 28, 2011 Author Share Posted June 28, 2011 (edited) Monoscout999, You have become a hero around here this morning...! That is most excellent progress. I had not considered comparing strings because I would prefer to intervene right before the user starts typing, however, your solution will do for now --- perhaps it is the only solution. I wonder if the same approach is possible with Firefox... On the other hand, I had no problems with the following instruction under IE8: $oIE = _IEAttach ("Good Samaritan") Thanks again for this excellent code/idea. Edited June 28, 2011 by NearMadness Link to comment Share on other sites More sharing options...
monoscout999 Posted June 28, 2011 Share Posted June 28, 2011 (edited) i suggest change the thread title to something more understeable like "Focus status of Web object" or "Focus status of web object in FireFox". only a suggest.#include <IE.au3> HotKeyset("{esc}","_exit") $oIE = _IECreate ("https://www.goodsamdayton.org/gshcontactus.aspx") $oInput = _IEGetObjByName ($oIE, "ctl00$ContentPlaceHolder1$txtBusinessPhone") while True consolewrite($oInput.value&@CRLF) sleep(2000) WEnd func _exit() Exit EndFuncthis way works too.EDITED: yes i got something! After digging around msdn i get the properties and events list from the input element object, so i solve the way to catch the onfocus event. here you got.#include <IE.au3> HotKeyset("{esc}","_exit") $oIE = _IECreate ("https://www.goodsamdayton.org/gshcontactus.aspx") $oInput = _IEGetObjByName ($oIE, "ctl00$ContentPlaceHolder1$txtBusinessPhone") $SinkObject=ObjEvent($oInput,"InputEvent_") while True sleep(2000) WEnd func _exit() Exit EndFunc Func InputEvent_onfocus() ConsoleWrite("I got the focus"& @crlf) ;### Debug Console EndFuncA couple of links about the object and the eventinput type=file Object and onfocus EventThe script open an IE window and get the object by the name, the name is taken from the source of the web page, after that i set the onevent mode from the object, and set the function of onfocus event. This was fun, i never use objects before now im gonna look a way to do it using FireFox... Edited June 28, 2011 by monoscout999 Link to comment Share on other sites More sharing options...
NearMadness Posted June 28, 2011 Author Share Posted June 28, 2011 Your function is PERFECT... That is what I needed!!! Monoscout is now officially elevated to royalty Many thanks! Link to comment Share on other sites More sharing options...
monoscout999 Posted June 28, 2011 Share Posted June 28, 2011 You`re welcome it was fun for me Link to comment Share on other sites More sharing options...
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