Author Topic: Складывание координат в массив и их нажатие  (Read 5736 times)

0 Members and 1 Guest are viewing this topic.

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Долго думал как сделать чтобы при нажатии, например, пробела, записывались координаты мыши и нажимались через 2 секунды. Казалось бы, всё просто, но нет, мне нужно чтобы все нажатые координаты складывались в массив, или ещё куда, и каждая по очереди нажималась через 2 секунды. Добавление координат и нажатие должны происходить одновременно. Буду благодарен, если кто поможет.
« Last Edit: September 01, 2017, 11:39:10 PM by Fugger »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Действительно это не сложно

Code: (clickermann) [Select]
IF(ISKEYDOWN(#SPACE)=1)
   WHILE(ISKEYDOWN(#SPACE)=1)
      WAITMS(5)
   END_CYC
   ARRPUSH($aCor, $_xmouse)
   ARRPUSH($aCor, $_ymouse)
ELSE
   WAITMS(20)
END_IF

THREAD(t, 1)
   FOR($a=0,$a<ARRSIZE($aCor),2)
      LCLICK($aCor[$a],$aCor[$a+1])
      WAITMS(50)
   END_CYC
   WAIT(2)
END_THREAD

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Вот другой алгоритм и другое понимание задачи соответственно. Массив тут не нужен, да и второму потоку места не нашлось.
Каждое нажатие пробела на клавиатуре запоминается и ставится в очередь на "превращение" в левый клик мыши. Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек). После выполнения клика, его координаты удаляются из памяти, поэтому кликер не будет повторять клики дважды. Очередь обнуляется полностью, если небыло нажатий пробела в течение двух секунд. Задержки внутри цикла корректируются автоматически, но все равно большой точности учета времени добиться вряд ли получится. Не уверен, что второй поток даст бОльшую точность.
Результат работы скрипта см. в логе.  Строку 24 , при надобности раскомментировать, строку 25 закомментировать.

Code: (clickermann) [Select]
LOGCLEAR
$delay = 2000 // через сколько миллисекунд кликер превратит нажатие пробела в левый клик
$step = 5 // как часто кликер будет проверять, что нажат пробел (в миллисекундах)
//--------------------------------
$str = ""
FOR($n = 0, $n < $delay / $step)
   $str = STRCONCAT($str, ",;")
END_CYC
//--------------------------------
WHILE(1)
   $t = $_ms
   IF(ISKEYDOWN(#SPACE) = 1)
      WHILE(ISKEYDOWN(#SPACE) = 1)
         WAITMS(1)
      END_CYC
      $str = STRCONCAT($str, $_xmouse, ",", $_ymouse, ";")
   ELSE
      $str = STRCONCAT($str, ",;")
   END_IF
   //--------------------------------
   $x = STRCUT2($str, 1, STRPOS($str, ",") - 1)
   IF($x ! "")
      $y = STRCUT2($str, STRPOS($str, ",") + 1, STRPOS($str, ";") - 1)
      //    LCLICK($x,$y)
      LOGWRITE (STRCONCAT($x, ",", $y))
   END_IF
   //--------------------------------
   $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str))
   WAITMS($step - ($_ms - $t)) // коррекция времени (вычитаем из задержки "step" время, затраченное на выполнение действий в цикле)
END_CYC



UPD: От нефиг-далать решил проверить насколько будет сбиваться время между пробелом и кликом при длительной работе скрипта.
Включил в свой скрипт вывод в лог, после строки 28 - $str = STRCUT2($str, STRPOS($str, ";") + 1, STRLEN($str)).
Code: (clickermann) [Select]
   $loss_time = $_ms - $t 
   $actual_waiting = $step - ($_ms - $t)
   LOGWRITE ("Потери - ", $loss_time, "ms")
   LOGWRITE ("Задержка после коррекции - ", $actual_waiting, "ms")
   LOGWRITE ("")
   
В логе:
Quote
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 0ms
22:25:33 Задержка после коррекции - 5ms
22:25:33
22:25:33 Потери - 1ms
22:25:33 Задержка после коррекции - 4ms

Пауза в цикле четко удерживается равной заданному значению $step=5. Получается, что разбежка во времени, между нажатием пробела и левым кликом, для любой пары координат - в пределах 1 миллисекунды. Погрешность тут-же учитывается коррекцией времени и компенсируется для следующей итерации. Нормально так, учитывая что миллисекунда - атомарная единица возвращаемая системной переменной $_ms. Жаль что само нажатие паузы может быть довольно продолжительным и портит картину.
« Last Edit: September 02, 2017, 11:00:00 PM by tmp~1 »

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Всё равно задержки между нажатиями нет. Не понимаю, в чём дело
Quote
Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия пробела (а не так, что первый клик через 2 секунды, а все остальные скопом, без задержек).
Именно так, но наоборот. У вас так же или я что-то не то сделал?
« Last Edit: September 02, 2017, 11:48:23 PM by Fugger »

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Если не работает мой скрипт, то возможно поможет перезагрузка компа, чтобы сбросить системный таймер. Скрипт его использует.
Такое бывает, если например ноутбук не выключают полностью, а отправляют в спящий режим.

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Хорошо, сейчас попробую

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Всё равно то же самое. Может быть дело в версии кликера? У меня последняя(4.12)

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
У меня сделано так как я написал - Время клика определяется для каждого нажатия отдельно и регулируется временем постановки в очередь. Т.е. каждый клик будет сделан именно через 2 секунды после нажатия того пробела, который ставит его в очередь.

Еще там в скрипте закомментирована строка №24. Чтобы были клики нужно убрать комментарий "//". А сейчас просто пишутся в лог координаты, это для тестов, чтоб не кликало зря. Нужно открыть лог и будет видна работа скрипта.

Версия у меня 4.12.001, вроде такая как лежит здесь - http://crapware.aidf.org/page/clickermann
« Last Edit: September 03, 2017, 12:08:50 AM by tmp~1 »

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
У меня точно такая же. Странно. Строку я раскомментировал. У меня первый клик идёт с задержкой, а остальные - с той задержкой, какой я их кликал изначально

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Похоже всё правильно. Если сделать три нажатия на пробел с интервалами в 0.5 секунды, то кликер через 2 секунды сделает 3 клика, между кликами будут задержки по 0.5 сек.
А как должно быть?
« Last Edit: September 03, 2017, 12:26:21 AM by tmp~1 »

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Должно быть, чтобы задержки между каждым нажатием были 2 секунды. Это и была моя изначальная цель

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А в задании сказано по другому.
Тогда ещё проще.


tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
А если быстро нажать пробел 3 раза (1 раз в секунду), то кликер сделает 3 клика, между которыми будет по 2 секунды? Это не смотря на то что между пробелами было по 1 секунде?
« Last Edit: September 03, 2017, 12:44:43 AM by tmp~1 »

Fugger

  • Освоившийся
  • **
  • Posts: 20
    • View Profile
Да, верно. Вот представьте. На сайте есть определённый лимит времени между одним кликом и другим. Мне нужно ставить точки, но чтобы не кликать самому каждый раз эти точки, ожидая 2 секунды, я кликаю быстро и даю кликеру на обработку.

tmp~1

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Понятно, теперь вроде, тогда две части надо делать.
1) Запись сценария - сохранение координат.
2) Воспроизведение - клики по сохраненным координатам, с частотой 2 секунды.