Основной раздел > Общие вопросы
Реалистичное передвижение курсора
Bereza:
Всем привет!
Похоже самая первая версия наиболее удачна.
Только припаять сверху чутоку рамдомного алгоритма от dramster-а
и включить мышиные функции в конечной точки траектории и все вполне пригодно.
Наглядная прогонка паинтом тоже идея отличная !
Подпрограмма правда разбухает до пяти параметров, но зато, по моему, пока на все случаи жизни.
Скрин:
https://ibb.co/mH9nFTD
Винда 11-я, а в десятой кнопки паинта вроде другие, если в ней закоментить 130 строчку то вдруг не дай бог чего...
--- Code: (clickermann) ---// подпрограмма обязательно выше вызова
SUB(mouse_move,$IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse)
$MOVE_SPEED = 1 // множитель скорости
$MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
$MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
$rnd_x= $x + rnd(rnd(-100, 0),rnd(0, 100))
$MOVE_Start_X = $_xmouse
$MOVE_Start_Y = $_ymouse
$MOVE_X = $MOVE_Start_X
$MOVE_Y = $MOVE_Start_Y
$dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
$MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
IF($MOVE_SPEEDVAR < 1)
$MOVE_SPEEDVAR = 1
END_IF
$MOVE_step=($dist-1)/$MOVE_SPEEDVAR
$MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
$MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
$MOVE_X = $MOVE_X + $MOVE_X_step
$MOVE_Y = $MOVE_Y + $MOVE_Y_step
MOVE(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
WAITMS(1)
END_CYC
MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
//Проверка действия мышиных клавиш
WAITMS(50)
IF($mouse=0 )
GOTO(mouse)
END_IF
IF($mouse=1 )
LCLICK($MOVE_END_X, $MOVE_END_Y) // Левый клик
GOTO(mouse)
END_IF
IF($mouse=2 )
RCLICK($MOVE_END_X, $MOVE_END_Y) // Правый клик
GOTO(mouse)
END_IF
IF($mouse=3 )
MCLICK($MOVE_END_X, $MOVE_END_Y) // Средний клик
GOTO(mouse)
END_IF
IF($mouse=4 )
DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
GOTO(mouse)
END_IF
IF($mouse=5 )
LDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать левую
GOTO(mouse)
END_IF
IF($mouse=6 )
LUP($MOVE_END_X, $MOVE_END_Y) // Отпустить левую
GOTO(mouse)
END_IF
IF($mouse=7 )
RDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать правую
GOTO(mouse)
END_IF
IF($mouse=8 )
RUP($MOVE_END_X, $MOVE_END_Y) // Отпустить правую
GOTO(mouse)
END_IF
IF($mouse=9 )
MDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать среднюю
GOTO(mouse)
END_IF
IF($mouse=10 )
MUP($MOVE_END_X, $MOVE_END_Y) // Отпустить среднюю
GOTO(mouse)
END_IF
IF($mouse=11 )
WHEELDOWN // Колесико вниз
GOTO(mouse)
END_IF
IF($mouse=12 )
WHEELUP // Колесико вверх
GOTO(mouse)
END_IF
$mouse=0
mouse:
END_SUB
// образец
// mouse_move($IN_X,$Razb_X,$IN_Y,$Razb_Y,$mouse) - 5 параметров
// 1: $IN_X - координата х
// 2: $Razb_X - разброс х
// 3: $IN_Y - координата Y
// 4: $Razb_Y - разброс Y
// 5: $mouse - код действия мыши -
// - в конечной точке траектории
// $mouse = 0 нет действия
// $mouse = 1 LCLICK (Левый клик)
// $mouse = 2 RCLICK (Правый клик)
// $mouse = 3 MCLICK (Средний клик)
// $mouse = 4 DBLCLICK (Двойной левый клик)
// $mouse = 5 LDOWN (Зажать левую)
// $mouse = 6 LUP (Отпустить левую)
// $mouse = 7 RDOWN (Зажать правую)
// $mouse = 8 RUP (Отпустить правую)
// $mouse = 9 MDOWN (Зажать среднюю)
// $mouse = 10 MUP (Отпустить среднюю)
// $mouse = 11 WHEELDOWN (Колесико вниз)
// $mouse = 12 WHEELUP (Колесико вверх)
//Подготовка паинта
GOTO(mouse2) // Пропускаем зачистку холста
// Очищаем холст паинта
mouse_move(140,8,110,8,1) // кликаем на выделение
WAITMS(50)
mouse_move(10,0,220,0,5) // Верхний угол рамки выделения
WAITMS(50)
mouse_move(1000,0,970,0,6) // Нижний угол рамки выделения
WAITMS(50)
RCLICK(500,250) // стираем все старое
WAITMS(500)
LCLICK(550,262) // стираем все старое
WAITMS(500)
mouse2:
mouse_move(300,5,100,5,4) // включаем карандаш
// рисуем треугольник
mouse_move(100,5,300,8,5) // точка 1 c зажимом
WAITMS(50)
mouse_move(920,5,300,8,0) // точка 2
WAITMS(50)
mouse_move(510,100,900,5,0) // точка 3
WAITMS(150)
mouse_move(100,5,300,8,6) // точка 1 c отпуском
WAITMS(50)
// рисуем прямоугольник
mouse_move(300,5,350,8,5) // точка 4 c зажимом
WAITMS(50)
mouse_move(720,5,350,8,0) // точка 5
WAITMS(50)
mouse_move(720,5,530,8,0) // точка 6
WAITMS(50)
mouse_move(300,5,530,8,0) // точка 7
WAITMS(150)
mouse_move(300,5,350,8,6) // точка 4 c отпуском
WAITMS(50)
HALT // стоп
--- End code ---
Паинт лучше приклеить в левый верхний, нулевой угол и до тысячной координаты Х включительно, тогда в 11-той все кнопки совпадут с тестовым скриптом.
Bereza:
Переписал скрипт, оказывается в кликермане свищ есть, оператор - недоглядел.
Поменял у подпрограммы порядок чередования параметров, с целю сделать обязательными только два первых, добавляя по одному по необходимости. Но так с подпрограммами ничего не работает - ошибка РОР. Есть ли способ как нибудь извернуться, например инклюдить как нить, вместо подпрограмм?
--- Code: (clickermann) ---// подпрограмма обязательно выше вызова
SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)
$MOVE_SPEED = 1 // множитель скорости
IF(($mouse = 11) or ($mouse = 12))
$MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
$MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
ELSE
$MOVE_END_X=$IN_X + rnd(rnd(-1*$Razb_X, 0),rnd(0, $Razb_X))
$MOVE_END_Y=$IN_Y + rnd(rnd(-1*$Razb_Y, 0),rnd(0, $Razb_Y))
END_IF
//-------------------------------------------------------
$MOVE_Start_X = $_xmouse
$MOVE_Start_Y = $_ymouse
$MOVE_X = $MOVE_Start_X
$MOVE_Y = $MOVE_Start_Y
$dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
$MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
IF($MOVE_SPEEDVAR < 1)
$MOVE_SPEEDVAR = 1
END_IF
$MOVE_step=($dist-1)/$MOVE_SPEEDVAR
$MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
$MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
$MOVE_X = $MOVE_X + $MOVE_X_step
$MOVE_Y = $MOVE_Y + $MOVE_Y_step
MOVE(ROUND($MOVE_X,0)+RND(-5,5), ROUND($MOVE_Y,0)+RND(-5,5)) // добавляем рандом
WAITMS(1)
END_CYC
MOVE($MOVE_END_X, $MOVE_END_Y) //Передвинуть окончательно в заданную точку
//-------------------------------------------------------
SWITCH($mouse)
CASE(0)
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(1)
LCLICK($MOVE_END_X, $MOVE_END_Y) // Левый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(2)
RCLICK($MOVE_END_X, $MOVE_END_Y) // Правый клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(3)
MCLICK($MOVE_END_X, $MOVE_END_Y) // Средний клик
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(4)
DBLCLICK($MOVE_END_X, $MOVE_END_Y) // Двойной левый
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(5)
LDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(6)
LUP($MOVE_END_X, $MOVE_END_Y) // Отпустить левую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(7)
RDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(8)
RUP($MOVE_END_X, $MOVE_END_Y) // Отпустить правую
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(9)
MDOWN($MOVE_END_X, $MOVE_END_Y) // Зажать среднюю
WAITMS(50+rnd(rnd(-9,0),rnd(0,23)))
CASE(10)
MUP($MOVE_END_X, $MOVE_END_Y) // Отпустить среднюю
CASE(11)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELDOWN // Колесико вниз
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
CASE(12)
FOR($i=0, $i < $Razb_X)
print("- ",$i," -")
WHEELUP // Колесико вверх
WAITMS(200+rnd(rnd(-47,0),rnd(0,37)))
END_CYC
END_SWITCH
$mouse=0
$Razb_X=0
$Razb_Y=0
END_SUB
//-------------------------------------------------------
// SUB(mouse, $IN_X, $IN_Y, $mouse, $Razb_X, $Razb_Y)
// 1: $IN_X - координата х
// 2: $IN_Y - координата Y
// 3: $mouse - действия мыши в конечной точке
// $mouse = 0 нет действия
// $mouse = 1 LCLICK (Левый клик)
// $mouse = 2 RCLICK (Правый клик)
// $mouse = 3 MCLICK (Средний клик)
// $mouse = 4 DBLCLICK (Двойной левый клик)
// $mouse = 5 LDOWN (Зажать левую)
// $mouse = 6 LUP (Отпустить левую)
// $mouse = 7 RDOWN (Зажать правую)
// $mouse = 8 RUP (Отпустить правую)
// $mouse = 9 MDOWN (Зажать среднюю)
// $mouse = 10 MUP (Отпустить среднюю)
// $mouse = 11 WHEELDOWN (Колесико вниз)
// $mouse = 12 WHEELUP (Колесико вверх)
// Функции при $mouse от 1 до 10
// 4: $Razb_X - разброс х
// 5: $Razb_Y - разброс Y
// Функции при $mouse = 11 или 12
// 4: $Razb_X - число строк колесиком
// 5: $Razb_Y - разброс х и разброс Y
// Рисуем В паинте
GOTO(mous) // Пропускаем зачистку холста
// Очищаем холст паинта
mouse(140,110,1,8,8) // кликаем на выделение
mouse(10,200,5,0,0) // Верхний угол рамки выделения
mouse(1000,970,6,0,0) // Нижний угол рамки выделения
mouse(500,250,2,0,0) // Открываем меню
WAITMS(100)
mouse(560,267,1,0,0) // стираем старое
WAITMS(100)
mous:
mouse(290,96,1,5,5) // включаем карандаш
// рисуем треугольник
mouse(100,300,5,5,8) // точка 1 c зажимом
mouse(920,300,0,5,8) // точка 2
mouse(510,900,0,100,5) // точка 3
mouse(100,300,6,5,8) // точка 1 c отпуском
// рисуем прямоугольник
mouse(300,350,5,5,8) // точка 4 c зажимом
mouse(720,350,0,5,8) // точка 5
mouse(720,530,0,5,8) // точка 6
mouse(300,530,0,5,8) // точка 7
mouse(300,350,6,5,8) // точка 4 c отпуском
HALT
--- End code ---
200 прогонов вроде неплохо: https://i.ibb.co/NF31nW6/2.png
Navigation
[0] Message Index
[*] Previous page
Go to full version