Drugoy пишет:Мне часто приходится писать скрипты, которые работают с пикселями. Есть ли простой способ (хотя бы на время создания скрипта) как-то визуально отобразить что за точку я выбрал? […] (т.е. растянул на экране спец прямоугольничек, а у тебя координаты всех 4-ёх его вершин сразу в текстовом виде вставляются куда-то?
Ниже — «дружелюбный» аналог PixelSearch (раз уж речь зашла за прямоугольники).
Принцип использования:
В код включается нижеприведенный класс, в секции автозагрузки создаётся «экземпляр класса» с искомым кодом цвета, допустимой вариативностью и режимом поиска в качестве параметров.
Далее, при необходимости выбрать «регион поиска заданного цвета» необходимо вызвать метод ToggleRect(), при этом отобразится полупрозрачный прямоугольник, который можно перемещать зажав левую кнопку мыши и изменять его размер перемещением мыши с зажатой правой кнопкой. Поместив прямоугольник в «нужном месте» можно сразу начать поиск нужного цвета вызовом метода Search()
Данный метод возвращает единицу при нахождении нужного цвета, либо ноль в ином случае. Если пиксель найден — его координаты сохраняются в полях x и y данного экземпляра класса.
Горячие клавиши 1, 2, 3 в примере ниже позволяют отобразить-скрыть «прямоугольник», просмотреть содержимое полей объекта, произвести поиск.
«Дружелюбный к пользователю аналог» прочих команд работающих с пикселями и цветом напишите сами 
Dark := new CSimplePixelSearch(0x404040, 10, "Fast RGB")
1::Dark.ToggleRect()
2::
for i,k in Dark
if IsObject(k)
for j, v in k
o .= "Dark." i "." . j . ": " . v . "`n"
else o .= "Dark." . i . ": " . k . "`n"
MsgBox % o "" o := ""
return
3::MsgBox % Dark.Search()? ("x: " . Dark.x . " y: " Dark.y) : "Not Found"
class CSimplePixelSearch
{
__New(color, variation, searchMode)
{
this.Rect := {w: 200, h: 100, transparent: 80, guiName: this.Random(20), guiColor: this.Random(6)}
guiName := this.Rect.guiName
Gui, %guiName%: -Resize +LastFound +AlwaysOnTop -Caption +ToolWindow +HWNDhWnd -E0x08000000
Gui, %guiName%: Color, % this.Rect.guiColor
WinSet, Transparent, % this.Rect.transparent
this.Rect.hwnd := hWnd
this.color := color
this.searchMode := searchMode
this.variation := variation
}
ToggleRect()
{
guiName := this.Rect.guiName
if WinExist("ahk_id" this.Rect.hWnd)
this.SaveRectPos()
else {
coord .= (x := this.Rect.x)? "x" . x . " " : ""
coord .= (y := this.Rect.y)? "y" . y . " " : ""
coord .= (w := this.Rect.w)? "w" . w . " " : ""
coord .= (h := this.Rect.h)? "h" . h . " " : ""
Gui, %guiName%: Show, % coord . "NA"
this.EnableRectControl(true)
}
}
EnableRectControl(switch = true)
{
static WM_RBUTTONDOWN := 0x204, WM_LBUTTONDOWN := 0x201
if (switch) {
OnMessage(WM_LBUTTONDOWN, this.__class . ".WindowProc")
OnMessage(WM_RBUTTONDOWN, this.__class . ".WindowProc")
}
else {
OnMessage(WM_LBUTTONDOWN, "")
OnMessage(WM_RBUTTONDOWN, "")
}
}
SaveRectPos()
{
WinGetPos, x, y, w, h, % "ahk_id" this.Rect.hWnd
if (x) {
this.x1 := x
this.y1 := y
this.x2 := x + w
this.y2 := y + h
this.Rect.x := x
this.Rect.y := y
this.Rect.w := w
this.Rect.h := h
guiName := this.Rect.guiName
Gui, %guiName%: Cancel
}
}
Search()
{
WinExist("ahk_id" this.Rect.hWnd) && this.SaveRectPos()
CoordMode, Pixel
PixelSearch, x, y, this.x1, this.y1, this.x2, this.y2, this.color, this.variation, % this.searchMode
this.found := !ErrorLevel
return !ErrorLevel, this.x := x, this.y := y
}
Random(nLenght)
{
static baseCharSet := "1|2|3|4|5|6|7|8|9|0|A|B|C|D|E|F"
charSet := baseCharSet
loop % nLenght//17
charSet .= baseCharSet
Sort, charSet, D| Random
StringReplace, charSet, charSet, |,,1
return SubStr(charSet, 1, nLenght)
}
WindowProc(lParam, uMsg, hWnd)
{
static WM_RBUTTONDOWN := 0x204, WM_LBUTTONDOWN := 0x201, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2
if (uMsg = WM_LBUTTONDOWN)
PostMessage, WM_NCLBUTTONDOWN, HTCAPTION ,,, % "ahk_id"hWnd
else if (uMsg = WM_RBUTTONDOWN) {
CoordMode, Mouse
SetWinDelay, 0
WinExist("ahk_id" hWnd)
while GetKeyState("RButton", "P")
{
MouseGetPos, x, y
if (x <> priorX || y <> priorY) {
WinGetPos,,, w, h
WinMove,,,,, w + (x - priorX), h + (y - priorY)
priorX := x, priorY := y
}
Sleep 10
}
}
return true
}
}