1

Тема: AHK: Клик по правому верхнему пикселю найденого изображения

Так совершается клик в верхний левый пиксель найденного изображения:


ImageSearch, PicX, PicY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic.png
If ErrorLevel = 0
	MouseClick, , %PicX%, %PicY%, 1 ,0.5

Как совершить клик в правый верхний пиксель найденного изображения?
Как совершить клик в нескольких пикселях правее/левее/выше/ниже от найденного изображения?

2

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Нужно узнать ширину изображения.

ImageSearch, PicX, PicY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic.png
If ErrorLevel = 0
	MouseClick, , % PicX + ImageWidth - 1, %PicY%, 1 ,0.5

3

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, спасибо!

Небольшой смежный вопрос: как задать условие, что найдено оба изображения?
Т.е. если найдена Pic1.png и Pic2.png, то вывести сообщение.

f1::
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic1.png
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic2.png
; ...
MsgBox, Найдено оба изображения
return

4

Re: AHK: Клик по правому верхнему пикселю найденого изображения

f1::
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic1.png
If ErrorLevel = 0
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic2.png
   If ErrorLevel = 0
   {
      MsgBox, Найдено оба изображения
      return
   }
}

5

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, Спасибо! Этот сценарий выделяет все видеотреки в Premiere Pro при их видимости. Можно ли его как-то упростить? Или, может, оформить лаконичнее с помощью регулярных выражений? Изображения здесь.

+1::
SelectAllVideoTracks:
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
If ErrorLevel = 0
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectVideoWithLock.png
   If ErrorLevel = 0
		SendInput ^{0 2}
}
else
	SendInput ^{0}

ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
If ErrorLevel = 0
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectAudioWithLock.png
   If ErrorLevel = 0
		SendInput ^{9}
   else
		SendInput ^{9}
}
else
	SendInput ^{9 2}
return

6

Re: AHK: Клик по правому верхнему пикселю найденого изображения

А чего тут сложного чтобы упрощать?
Единственное, тут непонятно:

   If ErrorLevel = 0
		SendInput ^{9}
   else
		SendInput ^{9}

7

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, упростить - т.е. сократить.
Если удалить

   else
		SendInput ^{9}

, то при всех выделенных аудиотреках, с них не снимается выделение.

8

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Зачем тогда вообще картинку искать если при любом расскладе нужно будет посылать ^{9}?
И зачем вообще надо выделять  все видеотреки в Premiere Pro при их видимости?

9

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, действительно, незачем. А выделять все треки для тоо, чтобы следом выделять область видеоклипа под курсором.

10

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Если задача состоит в том, чтобы выделить верхний клип под курсором, то надо перед этим выделить все дорожки.
Алгоритм может быть такой:
1) Посылаем ^0
2) Ищем картинку неподсвеченной буквы V
3) Если находим, то посылаем еще раз ^0

11

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, может, я где-то ошибся, но работает через раз. Т.е. иногда срабатывает как переключатель всех видеотреков.


+f1::
SendInput ^{0}
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectVideoWithLock.png
If ErrorLevel = 0
	SendInput ^{0}
return

12 (изменено: Malcev, 2016-06-01 11:33:44)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Если существует вероятность, что в зоне видимости присутствуют только залоченные треки, то можно так:

+f1::
SendInput ^{0}
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\PodsvechennajaV.png
If ErrorLevel
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\PodsvechennajaVLock.png
   If ErrorLevel
      SendInput ^{0}
}
return

http://savepic.ru/9939652.jpg
http://savepic.ru/9944772.png

13 (изменено: becauseim, 2016-06-01 12:55:14)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, слово Lock, фигурирующее в названии сделанного мной скриншота, говорит лишь о том, что буква V изображена вместе с замочком, т.к. если сама по себе буква V не подсвечена, то путается с буквой V в названиях вкладок и прочих местах. И в целом, необходимо также снять выделение с аудиотреков для перехода клавишами Up/Down по стыкам только видеоклипов. Поэтому, итоговый вариант работает корректно. Я лишь хотел получить с Вашей или чьей-либо помощью лаконичный вариант, т.к. команды в основном повторяются, меняются лишь их параметры.

+ Итоговый вариант

+f1::
SelectAllVideoTracks:
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
If ErrorLevel = 0
	SendInput ^{0 2}
else
	SendInput ^{0}

ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
If ErrorLevel = 0
	SendInput ^{9}
else
	SendInput ^{9 2}
return
+ Пример сокращения

1::
2::
3::
if (A_ThisHotkey = "1")
	SendInput +1

if (A_ThisHotkey = "2")
	SendInput +2

if (A_ThisHotkey = "3")
	SendInput +3
return

1::
2::
3::
SendInput % {1:"+1",2:"+2",3:"+3"}[A_ThisHotkey] 
return

14

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Можно в функцию обернуть:

+f1::
ImageSearch("SelectVideo1WithLock.png", "^{0 2}", "^{0}")
return


ImageSearch(a, b, c)
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\%a%
   If ErrorLevel = 0
      SendInput % b
   else
      SendInput % c
   return
}

15

Re: AHK: Клик по правому верхнему пикселю найденого изображения

SendInput, % ErrorLevel = 0 ? b : c
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Правильно ли записал? Или можно еще короче? По крайней мере, кажется, работает корректно.

+f1::
SelectAllVideoTracks("SelectVideo1WithLock.png", "^{0 2}", "^{0}", "SelectAudio1WithLock.png", "^{9}", "^{9 2}")
return

SelectAllVideoTracks(a, b, c, d, e, f)
{
	ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\%a%
	SendInput, % ErrorLevel = 0 ? b : c
	ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\%d%
	SendInput, % ErrorLevel = 0 ? e : f
	return
}

17

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, т.к. после выделения всех видеотреков в моем сценарии следуют дальнейшие действия, необходима проверка на коректность выделения, а именно, находятся ли треки А1 и V1 в видимой области вне зависимости от их состояния.

Сценарий привязан к проверке именно первых треков, а не любых подсвеченных, потому, что стандартные клавиши, в зависимости от того, какие именно треки выделены, ведут себя по-разному.

Т.е. сейчас скрипт проверяет наличие изображения, соответсвующего, например, подсвеченному треку V1, а необходима также проверка наличия неподсвеченного трека V1, чтобы убедиться в том, что он не скрыт за пределы видимости таймлайна. Проще говоря, приостанавливать действие сценария с выводом соответствующего сообщения в случае, если трек V1 не видим, то же самое с А1.

Я попробовал установить условие на основе Вашего примера проверки наличия двух изображений, но не получилось. Помогите, пожалуйста!

18

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Не понимаю, что вы хотите добиться.
Алгоритм же простой - ищете изображение, если не находите  - ищите другое, не находите другое - делаете то-то, находите другое - делаете то-то.

19

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, нужна клавиша, которая бы оставляла выделенными все видеотреки. Сейчас, если таймлайн выглядит следующим образом, сценарий срабатывает некорректно, т.к. трек А1 скрыт.

http://puu.sh/pcIZX/8ab830b605.png

В таком случае, добавьте, пожалуйста, в этот пример дополнительные условия, а именно "Не найдено ни одного изображения", "Найдено только первое изображение", и "Найдено только второе изображение".

f1::
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic1.png
If ErrorLevel = 0
{
   ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic2.png
   If ErrorLevel = 0
   {
      MsgBox, Найдено оба изображения
      return
   }
}

20 (изменено: Malcev, 2016-06-01 17:31:00)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

f1::
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic1.png
a1 := ErrorLevel
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Pic2.png
a2 := ErrorLevel
if (a1 = 0) and (a2 = 0)
   MsgBox, Найдено оба изображения
else if (a1 = 0)
   MsgBox, Найдено только первое изображение
else if (a2 = 0)
   MsgBox, Найдено только второе изображение
else
   MsgBox, Не найдено ни одного изображения

21 (изменено: serzh82saratov, 2016-06-01 19:48:07)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Если покороче:

ImageSearch, m1, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
ImageSearch, m2, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
MsgBox % {"00":"не найдено","10":"первое","01":"второе","11":"первое и второе"}[(m1 != "") "" (m2 != "")]

то тут можно заменить слова на кнопки, MsgBox на Send. Если предназначение ключей с нулями и единицами интуитивно понятны, то будет просто добавить ещё картинок.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22 (изменено: becauseim, 2016-06-01 19:57:32)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Malcev, спасибо! Теперь скрипт определяет состояние видимости первых треков. Однако возник вопрос, как в случае, если не найдено ни одного изображения (из любой заданной пары изображений), прервать работу сценария перед "продолжением действия"?


+f1::
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
a1 := ErrorLevel
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectAudio1WithLock.png
a2 := ErrorLevel

if (a1 = 0)
	SendInput ^{9}
else if (a2 = 0)
	SendInput ^{9 2}
else
	MsgBox, Не найдено ни одного изображения (Аудио)

ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
v1 := ErrorLevel
ImageSearch, , , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectVideo1WithLock.png
v2 := ErrorLevel

if (v1 = 0)
	SendInput ^{0 2}
else if (v2 = 0)
	SendInput ^{0}
else
   MsgBox, Не найдено ни одного изображения (Видео)

; продолжение действия сценария, если не было результата "Не найдено ни одного изображения".
Send 123
return

23

Re: AHK: Клик по правому верхнему пикселю найденого изображения

serzh82saratov, спасибо! То, что нужно! Попробую использовать предложенную Вами форму, но только необходимо сначала уточнить вопрос из 22-го поста.

24

Re: AHK: Клик по правому верхнему пикселю найденого изображения

ImageSearch, m1, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
ImageSearch, m2, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectAudio1WithLock.png
state := (m1 != "") "" (m2 != "") 
if state = 00
	Goto NotFound
MsgBox, , Audio, % {"10":"первое","01":"второе","11":"первое и второе"}["" state]

ImageSearch, m1, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
ImageSearch, m2, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectVideo1WithLock.png
state := (m1 != "") "" (m2 != "")
if state = 00
	Goto NotFound
MsgBox, , Video, % {"10":"первое","01":"второе","11":"первое и второе"}["" state] 
Return

NotFound:
	MsgBox продолжение действия сценария, если не было результата "Не найдено ни одного изображения".
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: becauseim, 2016-06-02 00:19:21)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

serzh82saratov, Спасибо! Только действие сценария продолжается лишь тогда, когда не было найдено какое-либо изображение из заданных, а необходимо наоборот, чтобы в этом случае сценарий не продолжал свою работу.
Так вроде-бы работает, как задумано:

Label:
ImageSearch, m1, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectAudio1WithLock.png
ImageSearch, m2, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectAudio1WithLock.png
state := (m1 != "") "" (m2 != "") 
if state = 00
	Exit
SendInput, % {"10":"^{9}","01":"^{9 2}"}["" state]
ImageSearch, m1, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\SelectVideo1WithLock.png
ImageSearch, m2, , 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\NoSelectVideo1WithLock.png
state := (m1 != "") "" (m2 != "")
if state = 00
	Exit
SendInput, % {"10":"^{0 2}","01":"^{0}"}["" state]
Return

1::
gosub Label
Send {vk58} ; клавиша не отправится, если if state = 00
return

Можно ли этот вариант еще сократить? Например, записать параметры state := и SendInput одной строкой.

26 (изменено: Malcev, 2016-06-02 14:12:13)

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Оффтоп: А для чего вы  хотите сократить? Вам в сокращенном варианте проще читать, понимать и изменять код?

27

Re: AHK: Клик по правому верхнему пикселю найденого изображения

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

Иными словами, получив сокращенную версию сценария, например, из 25-го поста, я буду удовлетворен ее формой, а также, вероятно, смогу использовать его в качестве шаблона для написания новых сценариев или изменения старых.

28

Re: AHK: Клик по правому верхнему пикселю найденого изображения

http://s20.rimg.info/aeffded5eb4742e5d28bd67fcb1f1f94.gif

29

Re: AHK: Клик по правому верхнему пикселю найденого изображения

becauseim пишет:

Можно ли этот вариант еще сократить? Например, записать параметры state := и SendInput одной строкой.

Вообще так и сделано в 21, только куда в таком случае Exit "пихать"? Делать для этого ещё одну функцию, и вызывать её по условию в выражении SendInput, это изврат в случае с парой - тройкой блоков.

becauseim пишет:

Изменять сложнее в силу отсутствия умения написания даже простых сценариев в такой форме.

Сокращать конечно хорошо, можно "умело" всё и в одну километровую строку загнать, только завтра уже сам "умелец" в ней неразберётся, к чему такой огород?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Клик по правому верхнему пикселю найденого изображения

serzh82saratov, спасибо за разъяснение!
Чтобы быть понятым правильно, я не прошу невозможного или нецелесообразного, но прошу разработчиков дать мне понять, если желаемое таковым является, т.к. не имею представления о всей методике написания сценариев.

31

Re: AHK: Клик по правому верхнему пикселю найденого изображения

becauseim пишет:

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

Для написания программы (скрипта, сценария) сначала нужно чётко сформулироватьт задачу и составить алгоритм. Наиболее удобно нарисовать его на бумажке в виде блок-схемы.

32

Re: AHK: Клик по правому верхнему пикселю найденого изображения

ypppu, спасибо за совет! В данной теме проблем с формулировкой описания желаемых действий в работе сценария не возникало. Malcev и serzh82saratov оперативно помогли с реализацией задуманного. Я понял, что до определенного набора условий скрипт можно было сокращать, а после его "додумывания" сокращение стало нецелесообразным.

33

Re: AHK: Клик по правому верхнему пикселю найденого изображения

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

34

Re: AHK: Клик по правому верхнему пикселю найденого изображения

ypppu, подразумевается форма, при которой повторяющиеся команды сокращаются в минимальное допустимое количество строк.

+ Пример сокращения

1::
2::
3::
if (A_ThisHotkey = "1")
	SendInput +1

if (A_ThisHotkey = "2")
	SendInput +2

if (A_ThisHotkey = "3")
	SendInput +3
return

1::
2::
3::
SendInput % {1:"+1",2:"+2",3:"+3"}[A_ThisHotkey] 
return

В редакторе SciTE есть возможность сворачивания, но это другое. Хотя даже эта функция там теряет актуальность, если сценарий постоянно сам себя перезаписывает командой IniWrite, как это происходит у меня. Т.е. после каждой перезаписи в редакторе все свернутые блоки разворачиваются.

35

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Главное чтобы лет через 5 можно было прочитать код скрипта и понять как он работает. Сегодня вроде всё помнишь, а потом глаза на лоб лезут: "Как я это написал?".

36

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Ну и если когда-либо придется модернезировать код, например, при нажатии 2 вставить серию посылаемых клавиш с задержкой, а при нажатии 3 вообще убрать sendinput, то придется сокращенный вариант переписывать полностью.

37

Re: AHK: Клик по правому верхнему пикселю найденого изображения

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

38

Re: AHK: Клик по правому верхнему пикселю найденого изображения

Пользуясь справкой, можно научиться в сто раз быстрее, чем на голых примерах. Тем более, что примеры уже даны в справке. Частая ошибка в учёбе, когда человек пытается браться за сложное, минуя простое. Разберёшься с простым - и сложное пойдёт легко.