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
Win10x64, AHK v1.1.25

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].

Win10x64, AHK v1.1.25

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"
Win10x64, AHK v1.1.25

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.

Win10x64, AHK v1.1.25

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, 2 downloads since 2017-01-05 

You don't have the permssions to download the attachments of this post.
Win10x64, AHK v1.1.25

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-01-06 20:09:13)

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 - правы, так будет лаконичнее.

Win10x64, AHK v1.1.25

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
Win10x64, AHK v1.1.25

16

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

После

if ErrorLevel = 0

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

17

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

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

Win10x64, AHK v1.1.25

18

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

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

if ErrorLevel = 1
{
	msgbox, image could not be found on the screen
	break
}
Win10x64, AHK v1.1.25

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
Win10x64, AHK v1.1.25

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
	}
Win10x64, AHK v1.1.25

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
Win10x64, AHK v1.1.25

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

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

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