1 (изменено: Malcev, 2012-01-17 07:04:23)

Тема: AHK: ImageSearch не всегда срабатывает

Имеется n-ое количество одинаковых кнопок.
Некоторые подсвечены, некоторые нет
Если кликнуть по какой-либо из них мышкой то она поменяет своё состояние из подсвеченного в неподсвеченный или наоборот из неподсвеченного в подсвеченный.
Задача такая - запомнить какие-из них подсвечены, так как будет применяться комманда (в самой программе без AHK) которая их всех делает неподсвеченными, после чего нужно вернуть подсветку в первоначальное положение.
Всю ночь создавал скрипт пока для 3ёх кнопок, который в итоге не всегда работает,

PgDn::

ImageSearch, x1, y1, 410, 590, 600, 1050, C:\video1.png  ; ищем заранее сохранённый кусочек подсвеченной кнопки
if ErrorLevel = 1 ; если не нашли , то выполняем комманду 
{
Send, ^!1^!2{PgDn}!0!9   ;     Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off  выключаем у всех кнопок посветку
return
}
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro    ; если одну нашли, то по ней кликаем, чтобы в следующем поиске на неё не натыкаться
ImageSearch,x2, y2, 410, 590, 600, 1050, C:\video1.png   ; ищем следующую
if ErrorLevel = 1    ;  если не нашли , то выполняем комманду
{
Send, ^!1^!2{PgDn}!0!9   ;   Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off  выключаем у всех кнопок посветку
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro  ; включаем подсветку кликом у той кнопки, которая была подсвечена изначально
return
}
ControlClick, % "x" x2 " y" y2, ahk_class Premiere Pro   ;   если нашли вторую, то по ней кликаем, чтобы в следующем поиске на неё не натыкаться
ImageSearch,x3, y3, 410, 590, 600, 1050, C:\video1.png    ; ищем следующую
if ErrorLevel = 1    ;  если не нашли , то выполняем комманду
{
Send, ^!1^!2{PgDn}!0!9   ;     Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off    выключаем у всех кнопок посветку
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro   ;  включаем подсветку кликом у той кнопки, которая была подсвечена изначально
ControlClick, % "x" x2 " y" y2, ahk_class Premiere Pro   ;  включаем подсветку кликом у той кнопки, которая была подсвечена изначально
return
}

2 (изменено: Malcev, 2012-01-17 18:52:10)

Re: AHK: ImageSearch не всегда срабатывает

Модернизировал скрипт. (расставил слипы и убрал лишние клики, заменив их на изменённые координаты поиска)
Так всё работает.

PgDn::
{
ImageSearch, x1, y1, 410, 590, 600, 1050, C:\video1.png
If ErrorLevel   
{
Send, ^!1^!2{PgDn}!0!9   ;     Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off 
Return
}
ImageSearch, x2, y2, 410, y1+10, 600, 1050, C:\video1.png
If ErrorLevel
{
Send, ^!1^!2{PgDn}!0!9   ;     Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off 
sleep, 100
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro        
Return
}    
ImageSearch, x3, y3, 410, y2+10, 600, 1050, C:\video1.png
If ErrorLevel
{
Send, ^!1^!2{PgDn}!0!9   ;   Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off 
sleep, 100
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro
sleep, 100
ControlClick, % "x" x2 " y" y2, ahk_class Premiere Pro  
Return
}    
Send, ^!1^!2{PgDn}!0!9   ;   Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off 
sleep, 100
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro
sleep, 100
ControlClick, % "x" x2 " y" y2, ahk_class Premiere Pro 
sleep, 100
ControlClick, % "x" x3 " y" y3, ahk_class Premiere Pro
}

Вопрос.
1) Как его можно ускорить?
2) Возможно ли передать одной командой сразу несколько кликов в разные координаты, типа

ControlClick, % "x" x1 " y" y1, % "x" x2 " y" y2, % "x" x3 " y" y3, ahk_class Premiere Pro

3) И как это всё включить в цикл, чтобы не прописывать одно и то же, например для 10 картинок?

3

Re: AHK: ImageSearch не всегда срабатывает

Наверно стоит разбить поставленную задачу на отдельные части и задавать вопросы более конкретно.

4

Re: AHK: ImageSearch не всегда срабатывает

А на что разбивать?
Алгоритм такой, находим подсвеченную картинку, запоминаем её координаты.
Потом следующую и так до конца всех картинок.
После этого убираем подсветку без помощи AHK.
После чего посылаем клики на запомненные координаты.

5

Re: AHK: ImageSearch не всегда срабатывает

1) Как его можно ускорить?

Убрать задержки sleep.

6

Re: AHK: ImageSearch не всегда срабатывает

К сожалению это невозможно, так как компьютер не успевает выделять.
Так как вы считаете, возможно ли этот скрипт переделать в зацикливаемый и главное нужно ли?
И по поводу третьего вопроса.
Может ли ControlClick посылаться сразу в несколько точек одновременно?

7

Re: AHK: ImageSearch не всегда срабатывает

Если не успевает компьютер, не понятно, зачем ускорять скрипт.
ControlClick нельзя посылать в несколько точек одновременно, хотя можно поочерёдно с очень коротким промежутком (в справке сказано как именно).

Так как вы считаете, возможно ли этот скрипт переделать в зацикливаемый и главное нужно ли?

Это наверно вопрос самому себе. Мне лично не очень понятно, что у Вас на компьютере происходит, и какие преследуются цели. Если хочется за счёт цикла сделать код скрипта более компактным, почитайте про встроенную переменную A_Index. Она содержит номер итерации.

8 (изменено: Александр_, 2012-01-18 00:25:59)

Re: AHK: ImageSearch не всегда срабатывает

Malcev пишет:

3) И как это всё включить в цикл, чтобы не прописывать одно и то же, например для 10 картинок?

как-то так:

ErrorLevel := 0
n := 1
t := 590
while((!ErrorLevel)&&(n<=10))
{
   ImageSearch, x%n%, y%n%, 410, t, 600, 1050, C:\video1.png
   t := y%n% + 10
   n++
}
Send, ^!1^!2{PgDn}!0!9
while(a_index<n)
{
   Sleep 100
   ControlClick, % "x" x%a_index% " y" y%a_index%, ahk_class Premiere Pro
}
Malcev пишет:

2) Возможно ли передать одной командой сразу несколько кликов в разные координаты, типа

ControlClick, % "x" x1 " y" y1, % "x" x2 " y" y2, % "x" x3 " y" y3, ahk_class Premiere Pro

Можно свою функцию написать.

Malcev пишет:

1) Как его можно ускорить?

Найти способ определять состояние кнопок без ImageSearch.
И для улучшения читабельности кода нужно оставлять отступы(три пробела или одна табуляция) перед вложенными конструкциями(см. мой код). Желательно также включать подсветку синтаксиса, для этого в теге нужно указать язык:

[cоde=ahk][/cоde]
вместо
[cоde][/cоde]

9 (изменено: Malcev, 2012-01-18 03:06:30)

Re: AHK: ImageSearch не всегда срабатывает

Александр_, я искренне удивляюсь, как вы всю мою простыню уместили в пару строк /
И что самое главное работает!
Код я ваш понял, но сам не знаю, когда смогу вот так написать

Найти способ определять состояние кнопок без ImageSearch.

К сожалению нету такого способа.
Я уже ломал над этим голову.
ImageSearch - единственно возможный, так как эти кнопки вообще никак не определяются в window spy.
Для наглядности - вот эти кнопки Video1 Video2 Video3
http://www.efxi.ru/file/premiere_cs55_timeline.files/image005.gif
Я сделал принтскрин буковки "d", так как под этими кнопками располагаются ещё Audio1 Audio2 Audio3.
А сама проблема с которой я борюсь описана тут под пунктом 2
http://www.efxi.ru/more/premiere_cs55_timeline.html
Попробывал убрать

Sleep 100

Если часто {PgDn} не нажимать, то работает.
Опять же надо проверить в деле.
Зато стало значительно быстрее.
Казалось бы для 5 кнопок - пол-секунды экономия, а заметно, так как после этого шортката {PgDN} моментально выполняются другие действия и тут пол-секунды сбивают с ритма.

Можно свою функцию написать.

Это как?

для улучшения читабельности кода нужно оставлять отступы

Буду знать.
Спасибо!

ControlClick нельзя посылать в несколько точек одновременно, хотя можно поочерёдно с очень коротким промежутком (в справке сказано как именно).

Что-то я не нашёл
http://script-coding.com/AutoHotkey/ControlClick.html

10

Re: AHK: ImageSearch не всегда срабатывает

http://script-coding.com/AutoHotkey/ControlClick.html пишет:

Для улучшения надежности после каждого использования этой команды автоматически делается короткая задержка. Эта задержка может быть изменена заданием параметра SetControlDelay.

С появлением картинки кажется понял, чего Вы добиваетесь.

11

Re: AHK: ImageSearch не всегда срабатывает

Спасибо.
Всё-таки после тестирования без sleep, 100 часто глючит.
Без него, видимо, никак.

12

Re: AHK: ImageSearch не всегда срабатывает

Malcev пишет:

Можно свою функцию написать.

Это как?

На этом примере проще всего создать функцию с заведомо бОльшим числом параметров чем необходимо, например функция:

MyControlClick(ClassName, x1=-1, y1=-1, x2=-1, y2=-1, x3=-1, y3=-1, x4=-1, y4=-1, x5=-1, y5=-1)
{
   while((a_index<=5)&&(x%a_index%!=-1))
   {
      Sleep, 100
      ControlClick,  x%x1% y%y1%, ahk_class%ClassName%
   }
}

отправляет до пяти сообщений окну с указанным классом. Например вместо

sleep, 100
ControlClick, % "x" x1 " y" y1, ahk_class Premiere Pro
sleep, 100
ControlClick, % "x" x2 " y" y2, ahk_class Premiere Pro 
sleep, 100
ControlClick, % "x" x3 " y" y3, ahk_class Premiere Pro

можно будет писать

MyControlClick("Premiere Pro", x1, y1, x2, y2, x3, y3)
Malcev пишет:

К сожалению нету такого способа.

Можно отслеживать состояние кнопок постоянно(т.е. узнать их состояние один раз и следить за действиями пользователя, способными изменить его), тогда в нужный момент не нужно будет ничего искать.

Malcev пишет:

Попробывал убрать
...
Если часто {PgDn} не нажимать, то работает.
Опять же надо проверить в деле.
Зато стало значительно быстрее.

А если задержку поставить только в конец обработчика(возможно, чуть больше 100мс)?

13 (изменено: Malcev, 2012-01-21 23:45:19)

Re: AHK: ImageSearch не всегда срабатывает

а этом примере проще всего создать функцию с заведомо бОльшим числом параметров чем необходимо, например функция:

А разве это ускорит отправку?

А если задержку поставить только в конец обработчика(возможно, чуть больше 100мс)?

Поставил 100 и 100 - всё работат, видно нужна была пауза не между кликаньем по контролам, а между повторным нажатием PgDn и между выделением всех контролов.
Спасибо за наводку!

Можно отслеживать состояние кнопок постоянно(т.е. узнать их состояние один раз и следить за действиями пользователя, способными изменить его), тогда в нужный момент не нужно будет ничего искать.

Это как?
Пока скрипт такой

PgDn::
ErrorLevel := 0
n := 1
t := 590
while((!ErrorLevel)&&(n<=10))
{
   ImageSearch, x%n%, y%n%, 410, t, 600, 1050, D:\video1.png
   t := y%n% + 10
   n++
}
Send, ^!1^!2{PgDn}!0!9   ;     Toggle video all on Toggle audio all on PgDn Toggle video all off Toggle audio all off Toggle target video 1  Toggle target audio 1
sleep, 100
while(a_index<n)
{
   ControlClick, % "x" x%a_index% " y" y%a_index%, ahk_class Premiere Pro
}
sleep, 100
return

14

Re: AHK: ImageSearch не всегда срабатывает

Malcev пишет:

А разве это ускорит отправку?

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

Malcev пишет:

Это как?

Если у нас есть три кнопки, то при запуске скрипта определяем их состояние и сохраняем в переменную. В дальнейшем проверяем все щелчки мышью в этом окне и корректируем значение переменных, если был клик по кнопке.

15

Re: AHK: ImageSearch не всегда срабатывает

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

Да, но я хотел это сделать для того, чтобы передать сразу несколько кликов без задержек.

Если у нас есть три кнопки, то при запуске скрипта определяем их состояние и сохраняем в переменную. В дальнейшем проверяем все щелчки мышью в этом окне и корректируем значение переменных, если был клик по кнопке.

Их там примерно 10 и они могут добавляться, убираться, становиться невидимыми на экране, так что наверное такое не прокатит

16

Re: AHK: ImageSearch не всегда срабатывает

Malcev пишет:

Да, но я хотел это сделать для того, чтобы передать сразу несколько кликов без задержек.

Не имеет смысла, всё равно обработка этих кликов целевой программой займёт больше времени.