26

Re: AHK: Совершить клик по существующим изображениям

Malcev, чтобы при нажатии на горячую клавишу, в случае, если ни одного искомого изображения не найдено или примера изображения по заданному пути не существует, выходило одно соответствующее сообщение об ошибке.
Когда сценарий после обнаружения первого изображения переходит к повторному поиску (циклу), то в случае, если второго такого же изображения не найдено, просто прекращает свою работу без оповещения об ошибке.

Win10x64, AHK v1.1.25

27

Re: AHK: Совершить клик по существующим изображениям

1::
lock := ["unlocked", "unlocked2", "locked", "locked2"]
MouseGetPos, xPosCursor, yPosCursor
Loop % lock.Length()
{
   ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, % A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"
   if ErrorLevel = 0
   {
      MouseClick, , %FoundX%, %FoundY%, 1 , 0.5
      MouseMove, xPosCursor, yPosCursor, 0.5
         break
   }
}
if ErrorLevel = 1
   msgbox 1
if ErrorLevel = 2
   msgbox 2
return

28

Re: AHK: Совершить клик по существующим изображениям

Malcev, то, что нужно. Спасибо!

Win10x64, AHK v1.1.25

29 (изменено: Vicoriyan, 2017-09-21 18:40:32)

Re: AHK: Совершить клик по существующим изображениям

Malcev А можно этот же скрипт http://forum.script-coding.com/viewtopi … 76#p110676 сделать с помощью Gdip_ImageSearch и чтоб была вариация? Если с Gdip скорость не поменяется, то как добавить вариацию в существующий код?

30

Re: AHK: Совершить клик по существующим изображениям

Читайте справку по ImageSearch  и в функции Gdip_ImageSearch тоже всё расписано.
Скорости у них не сравнивал, но полагаю, что с Gdi+ быстрее.

31

Re: AHK: Совершить клик по существующим изображениям

Malcev по ImageSearch читаю и про вариацию нашел. Ставлю в код *5 и ошибка. А вот как по другому, в справке и не написано. По крайне мере пока не нашел или не разобрался.

ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *5 % A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

32

Re: AHK: Совершить клик по существующим изображениям

А что вы имеете в виду под этим выражением?

% A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

33 (изменено: Vicoriyan, 2017-09-21 23:09:46)

Re: AHK: Совершить клик по существующим изображениям

Malcev Перебор картинок с чем сравнивает скрипт при поиске. Берет первую картинку, если не найдено, берет вторую картинку и так далее. Конкретно это выражение - путь к картинкам.

34

Re: AHK: Совершить клик по существующим изображениям

 % "*5 " A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

35 (изменено: Vicoriyan, 2017-09-22 13:40:14)

Re: AHK: Совершить клик по существующим изображениям

Malcev Нигде не встречал такое оформление. Спасибо за помощь. Теперь хотел сделать вариацию переменной и не один с методов не работает.
Оформлял так:

variation := 50

; не работает
% "*%variation% " A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

; не работает
% *variation A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

; не работает
% "*% variation " A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

; не работает
% *% variation  A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"

36

Re: AHK: Совершить клик по существующим изображениям

Если у вас вначале идёт %, то это означает,  то, что идёт после него является выражением и знаками процента переменные обрамлять не нужно, а строки нужно обрамлять кавычками.

variation := 50
msgbox % "*" variation " " A_ScriptDir "\v" A_ThisHotkey lock[A_Index] ".png"

37 (изменено: Vicoriyan, 2017-09-22 17:19:30)

Re: AHK: Совершить клик по существующим изображениям

Malcev Пролистываю информацию по Gdip_ImageSearch и и не могу понять, что за цифры мне выдает в сообщении этот код.

#Include Gdip.ahk
#Include Gdip_ImageSearch.ahk

gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromScreen()
bmpNeedle := Gdip_CreateBitmapFromFile("test.png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST)
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
MsgBox, % "Returned: " RET "`n`n" LIST

Экран считывает и находит картинку и выдает 2 3-значных числа через запятую. Что это - не понятно мне.

38

Re: AHK: Совершить клик по существующим изображениям

Там же написано:

; ++ RETURN VALUES ++
;
; -1001 ==> invalid haystack and/or needle bitmap pointer
; -1002 ==> invalid variation value
; -1003 ==> X1 and Y1 cannot be negative
; -1004 ==> unable to lock haystack bitmap bits
; -1005 ==> unable to lock needle bitmap bits
; any non-negative value ==> the number of instances found

; OutputList
;   ByRef variable to store the list of coordinates where a match was found

39 (изменено: Vicoriyan, 2017-09-22 20:05:32)

Re: AHK: Совершить клик по существующим изображениям

Malcev Мог бы и догадаться сам, что это координаты.  Допер, как эти координаты вытащить и кликнуть по картинке.

#Include Gdip.ahk
#Include Gdip_ImageSearch.ahk

gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromScreen()
bmpNeedle := Gdip_CreateBitmapFromFile("test.png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST)
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
CoordMode, Mouse, Screen
Loop, Parse, LIST, `n
{
    StringSplit, Coord, A_LoopField, `,
    MouseMove, %Coord1%, %Coord2%, 0
}

Но вот в затруднении, как организовать работу как на скрипте с ImageSearch http://forum.script-coding.com/viewtopi … 76#p110676 чтоб была не одна картинка, а несколько и чтоб была вариация?

40

Re: AHK: Совершить клик по существующим изображениям

Какой параметр отвечает за  вариацию написано в описании функции.
Чтобы искать несколько картинок нужно сделать типа такого цикла, заменив пути и вставив массив:

gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromScreen()
loop
{
   bmpNeedle := Gdip_CreateBitmapFromFile("test.png")
   RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST)
   Gdip_DisposeImage(bmpNeedle)
   CoordMode, Mouse, Screen
   Loop, Parse, LIST, `n
   {
      StringSplit, Coord, A_LoopField, `,
      MouseMove, %Coord1%, %Coord2%, 0
   }
}
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(gdipToken)

41 (изменено: Vicoriyan, 2017-09-23 17:11:06)

Re: AHK: Совершить клик по существующим изображениям

Malcev Сделал, картинку находит, а кликать четко по картинке не хочет, но курсор всегда располагается относительно картинки. Как бы я картинку эту не сдвигал, курсор тоже движешься за картинкой относительно. Делая bmpHaystack := Gdip_BitmapFromScreen() - все работает. Где у меня может быть ошибки ? И еще вопрос, где нужно поставить break, чтоб после нахождения и клика скрипт не продолжал перебор картинок?

1::
lock := ["unlocked", "unlocked2", "locked", "locked2"]
gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromScreen("65|215|210|400")
loop % lock.Length()
{
   bmpNeedle := Gdip_CreateBitmapFromFile(A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png")
   RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST)
   Gdip_DisposeImage(bmpNeedle)
   CoordMode, Mouse, Screen
   Loop, Parse, LIST, `n
   {
      StringSplit, Coord, A_LoopField, `,
      MouseClick, , %Coord1%, %Coord2%, 1 , 0.5
   }
}
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(gdipToken)

42

Re: AHK: Совершить клик по существующим изображениям

Если у вас картинка на которой вы ищите совпадения берется из файла, то список координат совпадений, которые вы получаете, будет относительно левого верхнего угла картинки.
Чтобы прекратить поиск картинок впишите в цикл перебирания координат break 2.
За вариацию отвечает:
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,0,0xFFFFFF,1,0)

; This function searches for pBitmapNeedle within pBitmapHaystack
; The returned value is the number of instances found (negative = error)
;
; ++ PARAMETERS ++
;
; pBitmapHaystack and pBitmapNeedle
;   Self-explanatory bitmap pointers, are the only required parameters
;
; OutputList
;   ByRef variable to store the list of coordinates where a match was found
;
; OuterX1, OuterY1, OuterX2, OuterY2
;   Equivalent to ImageSearch's X1,Y1,X2,Y2
;   Default: 0 for all (which searches the whole haystack area)
;
; Variation
;   Just like ImageSearch, a value from 0 to 255
;   Default: 0
;
; Trans
;   Needle RGB transparent color, should be a numerical value from 0 to 0xFFFFFF
;   Default: blank (does not use transparency)
;
; SearchDirection
;   Haystack search direction
;     Vertical preference:
;       1 = top->left->right->bottom [default]
;       2 = bottom->left->right->top
;       3 = bottom->right->left->top
;       4 = top->right->left->bottom
;     Horizontal preference:
;       5 = left->top->bottom->right
;       6 = left->bottom->top->right
;       7 = right->bottom->top->left
;       8 = right->top->bottom->left
;
; Instances
;   Maximum number of instances to find when searching (0 = find all)
;   Default: 1 (stops after one match is found)
;
; LineDelim and CoordDelim
;   Outer and inner delimiters for the list of coordinates (OutputList)
;   Defaults: "`n" and ","
;
; ++ RETURN VALUES ++
;
; -1001 ==> invalid haystack and/or needle bitmap pointer
; -1002 ==> invalid variation value
; -1003 ==> X1 and Y1 cannot be negative
; -1004 ==> unable to lock haystack bitmap bits
; -1005 ==> unable to lock needle bitmap bits
; any non-negative value ==> the number of instances found

43 (изменено: Vicoriyan, 2017-09-24 13:31:30)

Re: AHK: Совершить клик по существующим изображениям

Malcev Про break и вариацию буду разбираться. Спасибо Вам за подсказку. Что касательно клика по картинке. То, что клик происходит относительно левого верхнего угла картинки это я знаю, но дело в том, что клик происходит далеко не по картинке. Картинка например размером 10х10, а клик происходит на 50-70 пикселей вверх по оси Y и на 10-15 пикселей по оси Х. Четко сказать цифру смещения пока не могу, но если нужно, я узнаю.

44

Re: AHK: Совершить клик по существующим изображениям

Если вы поставите вашу картинку в левый верхний угол экрана, то координаты должны совпадать.

45 (изменено: Vicoriyan, 2017-09-24 14:42:50)

Re: AHK: Совершить клик по существующим изображениям

Malcev Хм, ставлю bmpHaystack := Gdip_BitmapFromScreen("0|0|210|400") - все работает. Картинку находит и кликает на левый верхний угол картинки. Ставлю bmpHaystack := Gdip_BitmapFromScreen("65|215|390|390") - идет непонятное смещение. А как тогда прописать, чтоб сканировало не с нулевого верхнего угла, а с точки X-65 Y-215 ? По вариации Вы выделили жирный ноль и я понял, что это там нужно указывать значение вариации? Ставлю RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,0,0,0,0,50,0xFFFFFF,1,0) и мышка сходит с ума.

46 (изменено: Malcev, 2017-09-24 14:22:47)

Re: AHK: Совершить клик по существующим изображениям

Gdip_BitmapFromScreen("65|215|390|390") - у найденных координат идет смещение на 65 пикселей по x и 215 по y, относительно экрана.
MouseMove, X+65, Y+215.
Либо делайте снимок всего экрана, а поиск осуществляйте в заданных координатах.
Без понятия почему она у вас сходит с ума, может из-за указанной прозрачности.
Тестируйте.

47 (изменено: Vicoriyan, 2017-09-24 14:42:42)

Re: AHK: Совершить клик по существующим изображениям

Malcev То есть Gdip_ImageSearch не умеет сканировать с заданной точки, а только с 0 и по определенное значение?

48

Re: AHK: Совершить клик по существующим изображениям

Gdip_ImageSearch ищет картинку.
У вас картинка обрезанная, поэтому и координаты будут относительно обрезанного экрана.
Берите Gdip_BitmapFromScreen относительно всего экрана, а в Gdip_ImageSearch укажите координаты поиска:

; OuterX1, OuterY1, OuterX2, OuterY2
;   Equivalent to ImageSearch's X1,Y1,X2,Y2
;   Default: 0 for all (which searches the whole haystack area)

49 (изменено: Vicoriyan, 2017-09-24 16:41:57)

Re: AHK: Совершить клик по существующим изображениям

Malcev Все работает. Теперь зона поиска 65.215.210,400. Вариация 20. Перебор заканчивается при нахождении картинки.

1::
lock := ["unlocked", "unlocked2", "locked", "locked2"]
gdipToken := Gdip_Startup()
bmpHaystack := Gdip_BitmapFromScreen("0|0|275|615")
loop % lock.Length()
{
   bmpNeedle := Gdip_CreateBitmapFromFile(A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png")
   RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,LIST,65,215,0,0,20,0xFFFFFF,1,0)
   Gdip_DisposeImage(bmpNeedle)
   CoordMode, Mouse, Screen
   Loop, Parse, LIST, `n
   {
      StringSplit, Coord, A_LoopField, `,
      MouseClick, , %Coord1%, %Coord2%, 1 , 0.5
        break 2
   }
}
Gdip_DisposeImage(bmpHaystack)
Gdip_Shutdown(gdipToken)

50 (изменено: Vicoriyan, 2017-09-24 22:23:35)

Re: AHK: Совершить клик по существующим изображениям

Malcev Вопрос, как очистить список LIST? Когда запускаю скрипт он ждет нажатия 1. Нажимаю, скрипт выполняется и снова становится в режим ожидая для нажатия 1 и выполнения. Но дело в том, что при повторном выполнении скрипта, он запоминает координаты картинки, которая была найдена изначально и кликает по этим координатам, хотя картинки там уже нет.