Автор Тема: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Прочитано 167654 раз)

0 Пользователей и 1 Гость просматривают эту тему.


Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 588
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #1 : Октябрь 26, 2012, 10:00:25 am »
Поиск пикселя определенного цвета и щелчок по нему мышью

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

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

Код: Clickermann
  1. // помещение текущего снимка экрана в буфер программы
  2. // это необходимо для работы всех графических функций и процедур
  3. getscreen
  4.  
  5. // --- конструкция поиска пикселя в буфере экрана ---
  6. // координаты 0, 0, $_xmax, $_ymax описывают прямоугольную область, в которой будет осуществлен поиск. при этом $_xmax и $_ymax содержат максимально возможные значения для текущего разрешения экрана. 255 это код цвета, он соответствует красному. код цвета можно узнать в редакторе, наведя курсор на нужного цвета пиксель
  7. // сама инструкция поиска if_pixel_in по сути представляет собой условие, то есть выполнение кода, который описан внутри условия, зависит от результата проверки самого условия (если пиксель найден) с учетом всех вышеописанных параметров.
  8. if_pixel_in(0, 0, $_xmax, $_ymax, 255)
  9.  
  10.   // если пиксель заданного цвета найден, его координаты будут помещены в системные переменные $_return1 и $_return2. можно их распечатать в лог ...
  11.   print("Цвет обнаружен в координатах: ", $_return1, ,":", $_return2)
  12.  
  13.   // ... а можно сразу кликнуть по нему левой кнопкой мыши
  14.   lclick($_return1, $_return2)
  15.  
  16. else   // блок else (вместе с кодом) не обязателен, но он обеспечивает обработку ситуации, когда условие вернуло отрицательный результат
  17.  
  18.   // если ничего не найдено, выводим сообщение
  19.   print("ничего не найдено")
  20.  
  21. end_if   // конец условия
  22.  
  23. halt   // остановка скрипта, обеспечивает однократное выполнение
  24.  
  25.  
« Последнее редактирование: Ноябрь 05, 2012, 06:43:04 pm от Johnny »

Сергей

  • Активный участник
  • ***
  • Сообщений: 159
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #2 : Октябрь 26, 2012, 04:53:11 pm »
Запуск блокнота и запись в нем произвольного текста.

Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."
Код: Javascript
  1. #name "Запись в блокнот"//Имя нашего скрипта
  2.  
  3. EXECUTE("notepad.exe")//Запускаем программу notepad.exe. Команда EXECUTE равносильна окну "Выполнить" в Виндовс (Win+R).
  4. WNDSTATE(WNDFIND("Блокнот"), 1)//Разворачиваем окно в заголовке которого есть строка "Блокнот". 1 - означает развернуть, 0 - свернуть.  
  5. WAITMS(500)//Ждем чтобы блокнот окончательно запустился. 500 мс достаточно
  6.  
  7. FOR($i, $i < 5)//Начало цикла. Цифра 5 означает что цикл повторится 5 раз
  8.   KEYSTRING("The quick brown fox jumps over the lazy dog.", 20)//Вводим текст. 20 означает задержку в 20 мс между вводом каждой буквы
  9.   KEYPRESS(#ENTER)//Нажимаем Enter чтобы перевести строку. #ENTER - код клавиши Enter
  10. END_CYC//Заканчиваем цикл
  11.  
  12. HALT//Останавливаем скрипт

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

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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3610
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #3 : Октябрь 26, 2012, 05:30:14 pm »
Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."

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

ЦИТРИН

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

СлавьЯнИнъ

  • Активный участник
  • ***
  • Сообщений: 179
    • Просмотр профиля
внимание!
« Ответ #5 : Октябрь 26, 2012, 10:21:09 pm »
В переключении языка есть особенность.
Для корректного вывода раскладка должна быть одинакова и в кликере в поле ввода.
добрый смех равняет всех

ЦИТРИН

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

СлавьЯнИнъ

  • Активный участник
  • ***
  • Сообщений: 179
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #7 : Октябрь 27, 2012, 07:47:53 am »
1. Отследи постянно ли происходит этот переход.
2. Воспользуйся кодом:
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

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

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

Сергей

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

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

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

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

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

ЦИТРИН

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

Полуночник

  • Активный участник
  • ***
  • Сообщений: 157
  • Умный не пошлёт на... он скажет -вы далеко пойдёте
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #11 : Октябрь 31, 2012, 05:54:25 pm »
Решил небольшую лепту внести...
Переменные.[/size]
 Что это и зачем? Допустим Вы пишете скрипт на 500 строк и нём есть много одинаковых действий, например одни и теже координаты для клика:
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
В результате мы в скрипт можем вместо точек координат вставлять переменные и у нас получится следующее:
$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... Пример приведённый в справочнике вводит в ступор. Попробую обьяснить языком более понятным.
$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 функцией.  Если что то не правильно написал, поправьте - исправлю.
« Последнее редактирование: Ноябрь 01, 2012, 12:11:57 pm от prapor »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3610
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #12 : Октябрь 31, 2012, 08:39:37 pm »
prapor, вариант цикла с WHILE можно написать куда кароче!
// если по координатам 100,100 цвет пиксела НЕ 255, то цикл будет работать

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


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

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

Полуночник

  • Активный участник
  • ***
  • Сообщений: 157
  • Умный не пошлёт на... он скажет -вы далеко пойдёте
    • Просмотр профиля
Re: Типовые алгоритмы
« Ответ #13 : Ноябрь 01, 2012, 11:57:58 am »
Мне как обьяснили, так я и раскоментировал. Спс, что показали другой способ. Как уже писал из вас умельцев всё клещами надо вытягивать.
Только раскоментируйте свой вариант. Не всё понятно.
« Последнее редактирование: Ноябрь 01, 2012, 12:08:33 pm от prapor »

ЦИТРИН

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