Author Topic: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Read 334146 times)

0 Members and 1 Guest are viewing this topic.

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
« Last Edit: May 29, 2023, 09:48:01 AM by Vint »

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Типовые алгоритмы
« Reply #1 on: October 26, 2012, 10:00:25 AM »
Поиск пикселя определенного цвета и щелчок по нему мышью

Использованные инструкции (ознакомьтесь с ними в справке по языку):
  • getscreen
  • if_pixel_in .. end_if
  • print
  • lclick
  • else
  • halt

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

Code: (clickermann) [Select]
// помещение текущего снимка экрана в буфер программы
// это необходимо для работы всех графических функций и процедур
getscreen

// --- конструкция поиска пикселя в буфере экрана ---
// координаты 0, 0, $_xmax, $_ymax описывают прямоугольную область, в которой будет осуществлен поиск. при этом $_xmax и $_ymax содержат максимально возможные значения для текущего разрешения экрана. 255 это код цвета, он соответствует красному. код цвета можно узнать в редакторе, наведя курсор на нужного цвета пиксель
// сама инструкция поиска if_pixel_in по сути представляет собой условие, то есть выполнение кода, который описан внутри условия, зависит от результата проверки самого условия (если пиксель найден) с учетом всех вышеописанных параметров.
if_pixel_in(0, 0, $_xmax, $_ymax, 255)
   
   // если пиксель заданного цвета найден, его координаты будут помещены в системные переменные $_return1 и $_return2. можно их распечатать в лог ...
   print("Цвет обнаружен в координатах: ", $_return1, ,":", $_return2)
   
   // ... а можно сразу кликнуть по нему левой кнопкой мыши
   lclick($_return1, $_return2)

else   // блок else (вместе с кодом) не обязателен, но он обеспечивает обработку ситуации, когда условие вернуло отрицательный результат
   
   // если ничего не найдено, выводим сообщение
   print("ничего не найдено")

end_if   // конец условия

halt   // остановка скрипта, обеспечивает однократное выполнение

« Last Edit: November 05, 2012, 06:43:04 PM by Johnny »

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Типовые алгоритмы
« Reply #2 on: October 26, 2012, 04:53:11 PM »
Запуск блокнота и запись в нем произвольного текста.

Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."
Code: (javascript) [Select]
#name "Запись в блокнот"//Имя нашего скрипта

EXECUTE("notepad.exe")//Запускаем программу notepad.exe. Команда EXECUTE равносильна окну "Выполнить" в Виндовс (Win+R).
WNDSTATE(WNDFIND("Блокнот"), 1)//Разворачиваем окно в заголовке которого есть строка "Блокнот". 1 - означает развернуть, 0 - свернуть.   
WAITMS(500)//Ждем чтобы блокнот окончательно запустился. 500 мс достаточно

FOR($i, $i < 5)//Начало цикла. Цифра 5 означает что цикл повторится 5 раз
   KEYSTRING("The quick brown fox jumps over the lazy dog.", 20)//Вводим текст. 20 означает задержку в 20 мс между вводом каждой буквы
   KEYPRESS(#ENTER)//Нажимаем Enter чтобы перевести строку. #ENTER - код клавиши Enter
END_CYC//Заканчиваем цикл

HALT//Останавливаем скрипт

Коды всех клавиш можно посмотреть в help.chm, в разделе "Коды клавиш".
Обратите внимание, что у вас должна быть включена английская раскладка в окне кликермана и в окне блокнота.

Используемые команды:
  • EXECUTE - Выполнение программ
  • WNDSTATE - Сворачивание/разворачивание окна
  • WNDFIND - Нахождение окна по заголовку
  • WAITMS - Остановка скрипта на заданное кол-во миллисекунд
  • FOR - Цикл
  • KEYSTRING - Печать текста
  • KEYPRESS - Нажатие клавиш
  • HALT - Остановка программы
« Last Edit: October 27, 2012, 10:46:17 AM by Сергей »
Отсутствую.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Типовые алгоритмы
« Reply #3 on: October 26, 2012, 05:30:14 PM »
Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."

Заметь, что должна быть включена английская раскладка.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы
« Reply #4 on: October 26, 2012, 08:58:48 PM »
Заметь, что должна быть включена английская раскладка.
Нельзя ли   процедуру  переключения раскладки  поручить  самой программе, или хотя бы дать понять пользователю , что  у него раскладка не та? 
Это я к чему?
Попробовал  воспользоваться примером .
НО!
 В моей ноуте никакие команды ( в языковой панели)  по изменению раскладки  так и не смогли "убедить" стандартный блокнот писать по английски. Хотя вручную все делаю  исправно.
  Если переключено на русский то  получаю пустой лист с  5 точками
 Если переключаю на англ , то печатается текст, но русскими буквами.
« Last Edit: October 26, 2012, 10:12:13 PM by ЦИТРИН »
Бабочки полёт будит тихую поляну в солнечном свету...

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
внимание!
« Reply #5 on: October 26, 2012, 10:21:09 PM »
В переключении языка есть особенность.
Для корректного вывода раскладка должна быть одинакова и в кликере в поле ввода.
добрый смех равняет всех

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: внимание!
« Reply #6 on: October 26, 2012, 10:50:03 PM »
раскладка должна быть одинакова и в кликере в поле ввода.
Тут непонятный баг. Изначально у меня стоит англ и печатаю от руки в блокноте англ.
Но в момент запуска кликера визуально наблюдается самопроизвольный переход на  русскую раскладку  в языковой панели.
Бабочки полёт будит тихую поляну в солнечном свету...

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Re: Типовые алгоритмы
« Reply #7 on: October 27, 2012, 07:47:53 AM »
1. Отследи постянно ли происходит этот переход.
2. Воспользуйся кодом:
Code: [Select]
KEYDOWN (#ALT)  // меняем на русскую раскладку
waitms(100)
KEYPRESS (#SHIFT)
 waitms(100)
 KEYUP (#ALT)
 waitms(100)
 KEYSTRING ("")
KEYDOWN (#ALT)  // меняем обратно
waitms(100)
KEYPRESS (#SHIFT)
waitms(100)
KEYUP (#ALT)

В моём случае замечено что команда KEYSTRING некорректно работает с раскладкой на русском языке. Мне пришлось писать по русски через KEYPRESS (#z).
добрый смех равняет всех

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: внимание!
« Reply #8 on: October 27, 2012, 10:03:24 AM »
Тут непонятный баг. Изначально у меня стоит англ и печатаю от руки в блокноте англ.
Но в момент запуска кликера визуально наблюдается самопроизвольный переход на  русскую раскладку  в языковой панели.
просто винда запоминает для каждого приложения раскладку. даже если это калькулятор и вводить ему нечего. насколько я помню за это отвечает процесс ctfmon.exe
можете поэкспериментировать.
вообще с нелатиницей у кейстринга всегда проблемы. поэтому обычно я рекомендую писать "привет мир" как "ghbdtn vbh"

но если кто-то разберется с непонятным багом и сделает его понятным, думаю я смогу его исправить :)
« Last Edit: October 27, 2012, 10:07:02 AM by Johnny »

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Типовые алгоритмы
« Reply #9 on: October 27, 2012, 11:17:49 AM »
Нафлудили тут.
Заметь, что должна быть включена английская раскладка.
Поправил.

вообще с нелатиницей у кейстринга всегда проблемы. поэтому обычно я рекомендую писать "привет мир" как "ghbdtn vbh"
Почему бы кликерману самому, автоматически не конвертировать русский текст в лытдыбру и сразу печатать? А то сейчас поведение KEYSTRING очень странное.
Вот методом тыка я вывел:
Если в кликермане раскладка русская, то русские строки KEYSTRING понимает, но английские нет. Если раскладка английская, то наоборот.
От этого большая путаница, ведь за раскладкой нужно следить ещё и в целевом окне.

И ещё ввести бы функцию KEYLAYOUT($hwnd) которая возвращает текущую раскладку в заданном hwnd. Ну или хотя бы раскладку активного окна.

2. Воспользуйся кодом

Вариант чуть по-проще:
Code: [Select]
SUB(CHANGE_LAYOUT)
   KEYDOWN(#CTRL)
   KEYPRESS(#SHIFT)
   KEYUP(#CTRL)
   
   KEYDOWN(#ALT)
   KEYPRESS(#SHIFT)
   KEYUP(#ALT)
END_SUB
Отсутствую.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы
« Reply #10 on: October 27, 2012, 12:06:55 PM »
Нафлудили тут.
Вариант чуть по-проще:
Корифеям большое спасибо!
Если не затруднит , пишите полностью рабочие скрипты. Вам не трудно сделать  копипаст в скрипт ( туда куда нужно) зато  у нуба одним ступором меньше.
Бабочки полёт будит тихую поляну в солнечном свету...

Полуночник

  • Активный участник
  • ***
  • Posts: 157
  • Умный не пошлёт на... он скажет -вы далеко пойдёте
    • View Profile
Re: Типовые алгоритмы
« Reply #11 on: October 31, 2012, 05:54:25 PM »
Решил небольшую лепту внести...
Переменные.[/size]
 Что это и зачем? Допустим Вы пишете скрипт на 500 строк и нём есть много одинаковых действий, например одни и теже координаты для клика:
Code: [Select]
LCLICK(695,336)
WAITMS(500)           //Задержка выполнение следующей строки скрипта в милисекундах
LCLICK(728,375)
WAIT(5,8)             //Таже задержка, но в секундах

LCLICK(695,386)
WAIT(RND(3,5))  //А вот так далаем рандомную задержку от 3 до 5 секунд
LCLICK(728,375)
WAIT(RND(5,8))

LCLICK(695,433)
WAITMS(RND(300,500))
LCLICK(728,375)
WAIT(RND(5,8)) и т.д.
Вместо того, что бы каждый раз вписывать одни и теже координаты, можно "обьявить переменную" - $
Прописывается так: $(название переменной) = её значение(число или слово)... Например:
$x = 695
$y = 728
$z = 375
В результате мы в скрипт можем вместо точек координат вставлять переменные и у нас получится следующее:
Code: [Select]
$x = 695
$y = 728
$z = 375
LCLICK($x,336)       //заменили координату 695 на переменную $x
WAITMS(500)
LCLICK($y,$z)         //дальше по аналогии, меняем координаты на нужные нам переменные
WAIT(RND(5,8))

LCLICK($x,386)
WAIT(RND(3,5))
LCLICK($y,$z)
WAIT(RND(5,8))

LCLICK($x,433)
WAITMS(RND(300,500))
LCLICK($y,$z)
WAIT(RND(5,8))
Цикличность действий.
Автоматизация ведь у нас всё таки? ))) И так. За цикличность у нас отвечает параметр FOR и
WHILE.
Сначала  WHILE... Пример приведённый в справочнике вводит в ступор. Попробую обьяснить языком более понятным.
Code: [Select]
$a =0
   WHILE ($a = 0) //вот мы начинаем цикл
      WAITMS(100)     //задержка в милисекуднах (если просто WAIT то в секундах)
      GETSCREEN       //делаем снимок экрана
      IF(PXL(100, 100) = 255)//если нужный пиксел(100,100 - координаты поиска пиксела, 255 - номер цвета пиксела который нам нужен)тут  не находится, то
                         //цикл начинается заного, а если нашли то что нам надо, то в следующей строке
        $a = 1        // меняем переменную
      END_IF          //заканчиваем сравнение
   END_CYC            //заканчиваем цикл
То есть, поиск нужного пиксела или картинки будет проходить бесконечно, пока не появится то что нам надо и только тогда сценарий будет продолжать работать дальше.
FOR ($var, expression, [step]) - организует цикл с параметром. Для корифеев всё понятно, а я например дня три смотрел на функцию как баран на новые ворота. Но в принципе понять что написано в Help можно. Правда я смог понять только после того как разобрался с WHILE функцией.  Если что то не правильно написал, поправьте - исправлю.
« Last Edit: November 01, 2012, 12:11:57 PM by prapor »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Типовые алгоритмы
« Reply #12 on: October 31, 2012, 08:39:37 PM »
prapor, вариант цикла с WHILE можно написать куда кароче!
Code: [Select]
// если по координатам 100,100 цвет пиксела НЕ 255, то цикл будет работать

GETSCREEN // снимок в буфер кликера


// условие цикла: если функция PXL находит по координатам 100,100 пиксел любого цвета кроме 255
// цикл будет продолжаться, а как найдет цвет 255 то прервется, и скрипт продолжится дальше после END_CYC

WHILE(PXL(100, 100) ! 255)
   WAITMS(100) // задержка
   GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
« Last Edit: November 01, 2012, 04:56:40 PM by Oraven »

Полуночник

  • Активный участник
  • ***
  • Posts: 157
  • Умный не пошлёт на... он скажет -вы далеко пойдёте
    • View Profile
Re: Типовые алгоритмы
« Reply #13 on: November 01, 2012, 11:57:58 AM »
Мне как обьяснили, так я и раскоментировал. Спс, что показали другой способ. Как уже писал из вас умельцев всё клещами надо вытягивать.
Только раскоментируйте свой вариант. Не всё понятно.
« Last Edit: November 01, 2012, 12:08:33 PM by prapor »

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Типовые алгоритмы
« Reply #14 on: November 03, 2012, 12:36:55 PM »
л из вас умельцев всё клещами надо вытягивать.
Только раскоментируйте свой вариант. Не всё понятно.
Проблема умельцев в том, что они  не понимают, чего  там такого не понимают нубы.  Сытый - голодного....
Нубам эту  особенность психологии  нужно понимать  и принимать спокойно.
Главное,  чтобы у обеих сторон  хватало выдержки )
 
Бабочки полёт будит тихую поляну в солнечном свету...