Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: -ELRO- on July 30, 2017, 03:08:40 PM
-
Добрый день товарищи!
У меня к вам вопрос с вытекающей просьбой)
Думаю по названию темы уже должно быть понятно о чем пойдет речь.
Имеется некое окно на рабочем столе, в этом окне нужно найти некоторые картинки по которым далее нужно совершить клик. Я написал скрипт и он находит все картинки, кроме тех которые повторяются. Т.е. если одинаковых картинок одного типа несколько, клик происходит только по одной картинке для каждого типа. А мне нужно чтобы клик происходил по всем картинкам всех типов независимо от их количества. Обычно на экране картинок каждого типа не более 5.
Прошу подсказать решение....
[spoiler]
$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]
-
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
Для поиска всех картинок у нас есть функция SCANPICTURE
$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
-
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
Для поиска всех картинок у нас есть функция SCANPICTURE
$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.
-
Проблему с поиском 2-го типа картинки решил. При проверки более доскональна она оказалось отличается на 8 пикселей от другой, которая обычным глазом точно такая)))
-
Как раз хотела написать про то, что если скрипт не нашел, значит не совпадают.
Можете уменьшить процент совпадения (число перед закрывающей скобкой в SCANPICTURE), поставив не 100, а 95, 90, 85 - сами подберете оптимальный баланс между быстродействием и эффективностью.
Про вариант "заменить картинку на более мелкий кусочек из ее серединки (ту часть, которая точно ничем не будет ничем перекрываться), тоже помните. Но это уже на крайний случай.
Если проблема не исчезнет, тогда возможной причиной является несовпадение оттенков, и решать ее нужно будет через COLORMODE.
-
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]
А вот с этим пока не получается.....
-
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.
-
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.
Да, но при таком раскладе получается, что он находит первую попавшеюся картинку и переходит далее. А другие картинки которые были в окне игнорирует.
Вот в этом и проблема что он должен найти все картинки из списка (либо только те которые есть в окне)и только потом перейти далее. Если нет картинок, то также переходим далее.
-
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.
$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)
-
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.
$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 которое будет выполняться именно в той случае когда нет картинок.
$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)
Имхо?
-
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.
Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
$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)
-
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.
Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
$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)
Спасибо. Одну часть решил
-
для скана, поиска и клика по куче копий одной и той же картинки, разбросанных по экрану, у меня такой код
$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 и она разбросана по экрану копиями?
-
а как добавить в поиск, требование минимального расстояния, между найденными одинаковыми картинками - для исключения лишних кликов по соседним пикселям тела найденной картинки и кликать следующую картинку, если размер картинки 5х5 и она разбросана по экрану копиями?
Примерно так:
$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)