Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: -ELRO- on July 30, 2017, 03:08:40 PM

Title: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 03:08:40 PM
Добрый день товарищи!
У меня к вам вопрос с вытекающей просьбой)
Думаю по названию темы уже должно быть понятно о чем пойдет речь.
Имеется некое окно на рабочем столе, в этом окне нужно найти некоторые картинки по которым далее нужно совершить клик. Я написал скрипт и он находит все картинки, кроме тех которые повторяются. Т.е. если одинаковых картинок одного типа несколько, клик происходит только по одной картинке для каждого типа. А мне нужно чтобы клик происходил по всем картинкам всех типов независимо от их количества. Обычно на экране картинок каждого типа не более 5.
Прошу подсказать решение....

[spoiler]
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5))) // клик со смещением  по всем координатам
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
[/spoiler]

P.S. забыл добавить, а как правильно сделать нажатие на кнопку после выполнения всего цикла. Не важно нашел он картинки или нет...

[spoiler]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4)
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
KEYPRESS(#PAGEDOWN) // переход ниже, верно ли установлено?!?!!?!?!?!

[/spoiler]
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Oraven on July 30, 2017, 03:20:21 PM
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))

Для поиска всех картинок у нас есть функция SCANPICTURE
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
         $n=9999
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 03:34:13 PM
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))

Для поиска всех картинок у нас есть функция SCANPICTURE
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
         $n=9999
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

Да, согласен. С рандомом я что то намудрил... Скобку убрал.
Запустил скрипт и вот что вышло.
PICTURE_1.BMP находит все что были
PICTURE_2.BMP нашел только 2, хотя в окне их было 4. Причем эти картинки находятся на одной линии по координате Х, но имеют разный Y. Те две что нашло имели одну координату  Y.
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 03:53:19 PM
Проблему с поиском 2-го типа картинки решил. При проверки более доскональна она оказалось отличается на 8 пикселей от другой, которая обычным глазом точно такая)))
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Qwerry on July 30, 2017, 03:55:41 PM
Как раз хотела написать про то, что если скрипт не нашел, значит не совпадают.
Можете уменьшить процент совпадения (число перед закрывающей скобкой в SCANPICTURE), поставив не 100, а 95, 90, 85  - сами подберете оптимальный баланс между быстродействием и эффективностью.
Про вариант "заменить картинку на более мелкий кусочек из ее серединки (ту часть, которая точно ничем не будет ничем перекрываться), тоже помните. Но это уже на крайний случай.

Если проблема не исчезнет, тогда возможной причиной является несовпадение оттенков,  и решать ее нужно будет через COLORMODE.
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 04:07:39 PM
P.S. забыл добавить, а как правильно сделать нажатие на кнопку после выполнения всего цикла. Не важно нашел он картинки или нет... Ну и так по кругу.....

[spoiler]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4)
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
KEYPRESS(#PAGEDOWN) // переход ниже, верно ли установлено?!?!!?!?!?!

[/spoiler]

А вот с этим пока не получается.....
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Oraven on July 30, 2017, 04:37:51 PM
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 05:05:11 PM
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.

Да, но при таком раскладе получается, что он находит первую попавшеюся картинку и переходит далее. А другие картинки которые были в окне игнорирует.
Вот в этом и проблема что он должен найти все картинки из списка (либо только те которые есть в окне)и только потом перейти далее. Если нет картинок, то также переходим далее.
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Oraven on July 30, 2017, 05:23:44 PM
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1     
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on July 30, 2017, 10:48:31 PM
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.


Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1     
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)

Весело получается, с этой проблемой решили. Но при тесте выскочила новая.
Если во время работы скрипта попадается окно в котором нет ни одной картинки, то весь процесс просто напросто зависает.
Полагаю что можно использовать условие else которое будет выполняться  именно в той случае когда нет картинок.
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
ELSE
   SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
   FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
      LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
      WAITMS(100)
      $check = 0
   END_CYC
   UNDEFINE($ARR_SCAN)
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
HINTPOPUP("начинаю процесс", "Идем далее")
WAITMS(100)



Имхо?
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Oraven on July 31, 2017, 07:37:25 AM
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.

Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
Code: (clickermann) [Select]
$time = $_time_t + 20 // таймер на 20 секунд
WHILE($time > $_time_t)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $time = 0
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: -ELRO- on August 01, 2017, 11:16:03 PM
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.

Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
Code: (clickermann) [Select]
$time = $_time_t + 20 // таймер на 20 секунд
WHILE($time > $_time_t)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $time = 0
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
Спасибо. Одну часть решил
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Иллидан on August 12, 2021, 12:22:23 PM
для скана, поиска и клика по куче копий одной и той же картинки, разбросанных по экрану, у меня такой код
Code: [Select]
$time = $_time_t + 1
      WHILE($time > $_time_t)
         GETSCREEN(0,10, 1200,900)
         COLORMODE(6)
         SCANPICTURE($ARR_SCAN, 0,10, 1200,900, "Поиск звёзд.bmp", -1, 60)
         $time = 0
         $ARR_NUM = 0
         WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
            $X = $ARR_SCAN [$ARR_NUM]
            INC($ARR_NUM,1)
            $Y = $ARR_SCAN [$ARR_NUM]
            INC($ARR_NUM,1)
            LCLICK($X,$Y)
            END_CYC
         UNDEFINE($ARR_SCAN)
      END_CYC
а как добавить в поиск, требование минимального расстояния, между найденными одинаковыми картинками - для исключения лишних кликов по соседним пикселям тела найденной картинки и кликать следующую картинку, если размер картинки 5х5 и она разбросана по экрану копиями?
Title: Re: IF_PICTURE_IN поиск нескольких картинок
Post by: Vint on August 12, 2021, 01:37:44 PM
а как добавить в поиск, требование минимального расстояния, между найденными одинаковыми картинками - для исключения лишних кликов по соседним пикселям тела найденной картинки и кликать следующую картинку, если размер картинки 5х5 и она разбросана по экрану копиями?
Примерно так:
Code: (clickermann) [Select]
$shift_X = 5  // минимальный отступ по x
$shift_Y = 5  // минимальный отступ по y

GETSCREEN(0,10, 1200,900)
COLORMODE(6)
SCANPICTURE($ARR_SCAN, 0,10, 1200,900, "Поиск звёзд.bmp", -1, 60)
$safe_X = -2000
$safe_Y = -2000
$ARR_NUM = 0
WHILE($ARR_NUM < ARRSIZE($ARR_SCAN))
    $X = $ARR_SCAN[$ARR_NUM]
    $Y = $ARR_SCAN[$ARR_NUM+1]
    INC($ARR_NUM, 2)
    IF(($X >= $safe_X) | ($Y >= $safe_Y))
        $safe_X = $X + $shift_X
        $safe_Y = $Y + $shift_Y
        LCLICK($X, $Y)
        WAITMS(100)
    END_IF
END_CYC
UNDEFINE($ARR_SCAN)