WARNING: This is old thread. It is continued here.
This method was presented before but here is my version. See also: LetUserSelectRect
License: In my opinion, this code isn't capable to be protected by nobodies copyright - so it can be used freely. In case it's under my copyright, I declare it public domain.
Function
SelectArea(Options="") { ; by Learning one /* Returns selected area. Return example: 22|13|243|543 Options: (White space separated) - c color. Default: Blue. - t transparency. Default: 50. - g GUI number. Default: 99. - m CoordMode. Default: s. s = Screen, r = Relative */ CoordMode, Mouse, Screen MouseGetPos, MX, MY CoordMode, Mouse, Relative MouseGetPos, rMX, rMY CoordMode, Mouse, Screen loop, parse, Options, %A_Space% { Field := A_LoopField FirstChar := SubStr(Field,1,1) if FirstChar contains c,t,g,m { StringTrimLeft, Field, Field, 1 %FirstChar% := Field } } c := (c = "") ? "Blue" : c, t := (t = "") ? "50" : t, g := (g = "") ? "99" : g , m := (m = "") ? "s" : m Gui %g%: Destroy Gui %g%: +AlwaysOnTop -caption +Border +ToolWindow +LastFound WinSet, Transparent, %t% Gui %g%: Color, %c% Hotkey := RegExReplace(A_ThisHotkey,"^(\w* & |\W*)") While, (GetKeyState(Hotkey, "p")) { Sleep, 10 MouseGetPos, MXend, MYend w := abs(MX - MXend), h := abs(MY - MYend) X := (MX < MXend) ? MX : MXend Y := (MY < MYend) ? MY : MYend Gui %g%: Show, x%X% y%Y% w%w% h%h% NA } Gui %g%: Destroy if m = s ; Screen { MouseGetPos, MXend, MYend If ( MX > MXend ) temp := MX, MX := MXend, MXend := temp If ( MY > MYend ) temp := MY, MY := MYend, MYend := temp Return MX "|" MY "|" MXend "|" MYend } else ; Relative { CoordMode, Mouse, Relative MouseGetPos, rMXend, rMYend If ( rMX > rMXend ) temp := rMX, rMX := rMXend, rMXend := temp If ( rMY > rMYend ) temp := rMY, rMY := rMYend, rMYend := temp Return rMX "|" rMY "|" rMXend "|" rMYend } }
Examples:
Rbutton::MsgBox,,, % SelectArea(), 1.5 Mbutton::MsgBox,,, % SelectArea("cLime t100 g55 mr"), 1.5