1

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

Необходимо два сценария. Первый совершает клик по первому найденному изображению из перечисленных в массиве. Второй - по всем найденным изображениям по очереди. Важно, чтобы команда ImageSearch в каждом из сценариев использовалась однократно, т.к. вариант с дублированием команды у меня получается, но выходит громоздким. Возможно ли такое? Если да, то помогите, пожалуйста, правильно воспроизвести. Спасибо!


; нерабочий вариант первого сценария

var := ["img1", "img2", "img3"]

1::
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\%var%.png
if ErrorLevel = 0
		MouseClick, , %FoundX%, %FoundY%, 1 , 0.5
return

2

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

В справке же всё написано:

array := ["one", "two", "three"]

; Iterate from 1 to the end of the array:
Loop % array.Length()
    MsgBox % array[A_Index]

; Enumerate the array's contents:
For index, value in array
    MsgBox % "Item " index " is '" value "'"

https://autohotkey.com/docs/Objects.htm

3

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

Malcev, спасибо! Не получается вставить в строку

ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\v%A_ThisHotkey%%array%.png [A_Index]

Вместо переменных, выходит [A_Index].

4

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

array := ["one", "two", "three"]

msgbox 1 вариант:
msgbox % array[1] ".png"
msgbox % array[2] ".png"
msgbox % array[3] ".png"

msgbox 2 вариант:
Loop % array.Length()
   MsgBox % array[A_Index] ".png"

msgbox 3 вариант:
For index, value in array
   msgbox %value%.png

5 (изменено: becauseim, 2017-01-05 20:05:39)

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

Malcev, Пробовал по-разному использовать знаки, но не получается.  Должно выйти сообщение: "v1one.png" и т.д.


1::
array := ["one", "two", "three"]

Loop % array.Length()
   MsgBox v%A_ThisHotkey% %array% [A_Index] ".png"

6 (изменено: svoboden, 2017-01-05 20:36:29)

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

   1::
   array := ["one", "two", "three"]

   Loop % array.Length()
   MsgBox, % "v" A_ThisHotkey array[A_Index ]".png"
   return

7

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

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

This parameter contains a variable name missing its ending percent sign.

8 (изменено: svoboden, 2017-01-05 21:45:03)

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

ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, % A_ScriptDir "v" A_ThisHotkey array[A_Index ]".png"

9

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

becauseim
У вас путанница с переменными.
Так неправильно:

a := 1
b := 2
msgbox %a% "+" % b

Правильно так:

a := 1
b := 2
msgbox % a "+" b

Либо так:

a := 1
b := 2
msgbox %a%+%b%

10 (изменено: becauseim, 2017-01-05 22:30:39)

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

Malcev, спасибо! В общем, с MsgBox все заработало, но в самом сценарии, по всей видимости, кроются другие ошибки. Сценарий должен блокировать дорожки в Premiere Pro, соответствующие горячим клавишам. Пока тестирую только на первой видеодорожке. Надеюсь, Вы мне поможете. Иконки во вложении.

Так не работает:

1::
2::
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
return

Так работает:

1::
MouseGetPos, xPosCursor, yPosCursor
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\v%A_ThisHotkey%unlocked.png
if ErrorLevel = 1
		goto try2
if ErrorLevel = 0
		MouseClick, , %FoundX%, %FoundY%, 1 , 0.5
		MouseMove, xPosCursor, yPosCursor, 0.5
return

try2:
ImageSearch, FoundX_LOCK, FoundY_LOCK, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\v%A_ThisHotkey%unlocked2.png
if ErrorLevel = 1
		goto try3
if ErrorLevel = 0
	MouseClick, , %FoundX_LOCK%, %FoundY_LOCK%, 1 ,0.5
	MouseMove, xPosCursor, yPosCursor, 0.5
return

try3:
ImageSearch, FoundX_LOCK, FoundY_LOCK, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\v%A_ThisHotkey%locked.png
if ErrorLevel = 1
		goto try4
if ErrorLevel = 0
	MouseClick, , %FoundX_LOCK%, %FoundY_LOCK%, 1 ,0.5
	MouseMove, xPosCursor, yPosCursor, 0.5
return

try4:
ImageSearch, FoundX_LOCK, FoundY_LOCK, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\v%A_ThisHotkey%locked2.png
if ErrorLevel = 0
	MouseClick, , %FoundX_LOCK%, %FoundY_LOCK%, 1 ,0.5
	MouseMove, xPosCursor, yPosCursor, 0.5
return
Post's attachments

lock.zip 2.1 kb, 5 downloads since 2017-01-05 

You don't have the permssions to download the attachments of this post.

11 (изменено: Malcev, 2017-01-05 23:22:48)

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

У вас в цикле крутится только 1 комманда:

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

12 (изменено: svoboden, 2017-06-02 05:28:59)

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

Я бы вместо "unlocked, unlocked2", прописал бы полные пути к картинкам, удалил бы "A_ScriptDir "\v" A_ThisHotkey", оставил бы "% lock[A_Index]" или "array[A_Index]", вместо "MouseClick", прописал бы "ControlClick". А зачем столько переменных разных? И удалил бы еще "Loop % lock.Length()", оставил бы "Loop 6".

13

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

Malcev, спасибо! Включил все в фигурные скобки, теперь работает, но конкретно этот вариант проходит по всем значениям массива, т.е. по факту дважды переключает текущее положение. Я, наверное, не заметил в предлагаемых вариантах второго, необходимого для клика только по первому найденному изображению. Укажите на него, пожалуйста, отдельно.
svoboden, имя горячей клавиши фигурирует в пути для соответствия горячих клавиш номерам дорожек (отдельным группам изображений), которые я позже добавлю. А по поводу ControlClick - правы, так будет лаконичнее.

14

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

Чтобы завершить цикл после клика вставьте после этого клика break.

15 (изменено: becauseim, 2017-01-06 00:45:51)

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

Malcev, так сценарий ищет только первое изображение. Хотя горячая клавиша должна работать как переключатель. Т.е. клик совершается только по изображению v1unlocked.png, остальные изображения при повторном нажатии уже не находятся.

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
}
return

16

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

После

if ErrorLevel = 0

тоже скобки нужны.

17

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

Malcev, спасибо! Работает!

18

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

Malcev, при добавлении ErrorLevel, окно всплывает несколько раз, а именно столько, сколько переменных в массиве, а если добавить break, то перебор переменных уже не работает. Т.е. в данном случае, сообщение об ошибке вставить невозможно?

if ErrorLevel = 1
{
	msgbox, image could not be found on the screen
	break
}

19

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

Не понимаю, что вы хотите добиться.

20 (изменено: becauseim, 2017-01-06 01:50:27)

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

Malcev, чтобы в случае ошибки, выходило одно сообщение. Но при этом, не мешало работе сценария.

Tippy(tipsHere, wait:=2000)
{
	ToolTip % tipsHere
	Sleep % wait
	ToolTip
}

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 = 2
	{
		tippy("Could not conduct the search")
		break
	}
if ErrorLevel = 1
	{
		tippy("image could not be found on the screen")
		break
	}
if ErrorLevel = 0
	{
		MouseClick, , %FoundX%, %FoundY%, 1 , 0.5
		MouseMove, xPosCursor, yPosCursor, 0.5
		break
	}
}
return

21

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

Всё-равно не понимаю. Но чтобы сообщение выскакивало только один раз, можно сделать так:

loop 4
{
   if !message
   {
      msgbox
      message := !message
   }
}

22

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

Malcev, не знаю, правильно ли я использовал этот метод, но теперь действительно сообщение выходит единожды. Но только при первом нажатии на горячую клавишу. При последующих нажатиях, сообщение об ошибке уже не работает. Сообщение должно выходить тогда, когда сценарий не может найти изображений из массива.

if ErrorLevel = 1
	if !message
	{
		tippy("image could not be found on the screen")
		message := !message
	}

23 (изменено: Malcev, 2017-01-06 02:16:07)

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

1::
message := 0
loop 4
{
   if !message
   {
      msgbox
      message := !message
   }
}

24

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

Malcev, теперь же, сообщение об ошибке выходит перед каждым кликом, если найденное изображение соответствует любой переменной, кроме первой.


Tippy(tipsHere, wait:=2000)
{
	ToolTip % tipsHere
	Sleep % wait
	ToolTip
}

1::
lock := ["unlocked", "unlocked2", "locked", "locked2"]
MouseGetPos, xPosCursor, yPosCursor
message := 0
Loop % lock.Length(){
ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, % A_ScriptDir "\v" A_ThisHotkey lock[A_Index]".png"
if ErrorLevel = 2
	if !message
	{
		tippy("Could not conduct the search")
		message := !message
	}
if ErrorLevel = 1
	if !message
	{
		tippy("image could not be found on the screen")
		message := !message
	}
if ErrorLevel = 0
	{
		MouseClick, , %FoundX%, %FoundY%, 1 , 0.5
		MouseMove, xPosCursor, yPosCursor, 0.5
		break
	}
}
return

25 (изменено: Malcev, 2017-01-06 02:47:29)

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

Объясните словами, что вы хотите.

26

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

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

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, то, что нужно. Спасибо!

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 и выполнения. Но дело в том, что при повторном выполнении скрипта, он запоминает координаты картинки, которая была найдена изначально и кликает по этим координатам, хотя картинки там уже нет.

51

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

А как вы обычно очищаете переменные?

52 (изменено: Vicoriyan, 2017-09-25 14:49:32)

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

Malcev Если числовая переменная, то просто ставлю := 0. Если текстовая - понятия не имею. В грубой форме - просто перезапуск скрипта. В этом варианте не прокатит поставить нули. Скрипт воспримет нули как координаты.

53

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

a := "test"
msgbox % a
a := ""
msgbox % a

Но переменная List при повтороном вызове и ненахождении совпадений должна возвращаться пустая и без этого.

54 (изменено: Vicoriyan, 2017-09-25 14:57:33)

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

Malcev Нет, не возвращается пустым. Проверил много раз. Ищу картинку - кликнул по ней. Перетащил эту же картинку в другое место - нашел, но кликнул по координатам, где картинка находилась при первом поиске.