Code:
;
;MouseLocate by David Bradford
;
;This is an example of how to use this script
;ctrl-alt-l will position my mouse over the submit button on http://www.rottentomatoes.com
;However, to use this, you'll want to scan a control yourself. Hold down the ctrl key
;and press the left mouse button, then drag the window that appears till it covers the
;control. Be careful not to highlight or do anything that changes the appearance of the
;control, as the mouse will still do whatever it would normally do on that window.
;
;Go to Notepad and make sure you are using a fixed-width font (as a suggestion, go to
;Format->Font, select Terminal font, Regular style, and the smallest size you can). Then
;paste from the clipboard.
;
;I have switched to all alpha characters as it makes coding easier.
;
;Below, I have put the output after "scanning" the submit button from Rotten Tomatoes.
;Note that the mouse will be put in the center of whatever graphic you use, so narrow it
;down to just the control for best results.
;
;scan_x_start, scan_x_end, scan_y_start, and scan_y_end tell it what rectangle to search
;for the control.
;
;Thanks to Jon for the control selection code
;
^!l::
;Uncomment the next two lines if you want to search the screen instead of the current window
;CoordMode, Pixel, Screen
;CoordMode, Mouse, Screen
scan_x_start=8
scan_x_end =208
scan_y_start=573
scan_y_end =707
scan_in_line0 =ttttttcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccntttttt
scan_in_line1 =ttttccctttttttttttttttttttttttttttttttttttttttttttttttttttttttttttnntttt
scan_in_line2 =tttccttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
scan_in_line3 =ttnctttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttMtt
scan_in_line4 =ttctttttttttnnnnnnntnnntttnnnnnnnnnnntnnnnttttnnntnnnnnnnnnnnttttttttttt
scan_in_line5 =tncttttttttniiiiiiinnictttnicniiiiiiinniiinttniiinnicciiiiiictttttttttMt
scan_in_line6 =tntttttttttnictttnnnnictttnicnictttnicnicicttcicinnictttiittttttttttttMt
scan_in_line7 =tntttttttttniiiiiiinnictttnicniiccciinniccinniccinnictttiittttttttttttMt
scan_in_line8 =tnttttttttttnnnnncicnictttnicnicnnnnicnictiiiitcinnictttiittttttttttttMt
scan_in_line9 =tntttttttttnicnnncicniinnncicniinnnniinictniintcinnictttiittttttttttttMt
scan_in_line10=tttttttttttnciiiiicntniiiiicnniiiiiiinnicttccttcinnictttiitttttttttttMMt
scan_in_line11=tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttMtt
scan_in_line12=tttMttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttMMtt
scan_in_line13=tttMtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttMMttt
scan_in_line14=ttttMMtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttMMMtttt
scan_in_line15=ttttttMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMtttttt
WinActivate ahk_id %dmb_lastwin%
Gosub, MouseLocate
return
MouseLocate:
Gosub, ScanScreen
scan_j=0
scan_found=0
scan_last_index=-1
scan_num_searched=0
scan_output=%scan_current_line%
Loop, Parse, scan_output, 0
{
Transform, scan_cur_line, deref, `%scan_in_line%scan_j%`%
If (scan_j > 0 and !scan_cur_line)
{
scan_found=1
break
}
StringGetPos, scan_index, A_LoopField, %scan_cur_line%
If(scan_index > -1 and scan_j = 0 or (scan_j > 0 and scan_last_index = scan_index))
{
If(scan_j = 0)
{
scan_y_adj=%scan_num_searched%
}
scan_j++
scan_last_index=%scan_index%
StringLen, scan_str_len, scan_cur_line
if(scan_str_len > scan_max_len)
{
scan_max_len=%scan_str_len%
}
}
else
{
scan_j=0
}
scan_num_searched++
}
if(scan_found)
{
scan_center_x := scan_max_len / 2
scan_center_y := scan_j / 2
Transform, scan_center_x, Round, %scan_center_x%
Transform, scan_center_y, Round, %scan_center_y%
scan_center_x := scan_center_x + scan_last_index + scan_x_start
scan_center_y := scan_center_y + scan_y_start + scan_y_adj
MouseMove, %scan_center_x%, %scan_center_y%
}
return
~^LButton::
#persistent
CoordMode, Mouse, Screen
CoordMode, Tooltip, Screen
MouseGetPos, scan_x_start, scan_y_start
currentXpos=%scan_x_start%
currentYpos=%scan_y_start%
ToolTip, ., scan_x_start, scan_y_start
WinSet, Transparent, 100, ahk_class tooltips_class32
Loop
{
MouseGetPos, scan_x, scan_y
scan_x-=%currentXpos%
scan_y-=%currentYpos%
WinMove, ahk_class tooltips_class32, , , , %scan_x%, %scan_y%
GetKeyState, state, LButton
if state=u
{
tooltip
break
}
}
MouseGetPos, scan_x_end, scan_y_end
TrayTip, , Scanning...., , 1
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
MouseGetPos, scan_x_end, scan_y_end
Gosub, ScanScreen
StringReplace, Clipboard, scan_current_line, 0, `r`n, 1
TrayTip, , Scan complete, , 1
sleep, 1000
TrayTip
return
ScanScreen:
;results returned in %scan_current_line%
scan_current_y=%scan_y_start%
scan_current_x=%scan_x_start%
scan_current_line=
Loop
{
scan_current_x++
if scan_current_x > %scan_x_end%
{
scan_current_line=%scan_current_line%0
scan_current_y++
if scan_current_y > %scan_y_end%
break
scan_current_x=%scan_x_start%
continue
}
PixelGetColor, found_color, %scan_current_x%, %scan_current_y%
StringMid, scan_rgb_r, found_color, 3, 2
StringMid, scan_rgb_g, found_color, 5, 2
StringMid, scan_rgb_b, found_color, 7, 2
scan_rgb_r=0x%scan_rgb_r%
scan_rgb_g=0x%scan_rgb_g%
scan_rgb_b=0x%scan_rgb_b%
scan_rgb_sum:=scan_rgb_r + scan_rgb_g + scan_rgb_b
if scan_rgb_sum > 0x280
{
scan_current_line =%scan_current_line%i
}
else if scan_rgb_sum > 0x200
{
scan_current_line =%scan_current_line%c
}
else if scan_rgb_sum > 0x180
{
scan_current_line =%scan_current_line%n
}
else if scan_rgb_sum > 0x100
{
scan_current_line =%scan_current_line%t
}
else if scan_rgb_sum > 0x80
{
scan_current_line =%scan_current_line%I
}
else
{
scan_current_line =%scan_current_line%M
}
}
return