Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Johnny on October 26, 2012, 08:57:41 AM
-
В данной теме предлагается размещать примеры простейших алгоритмов для конкретных задач. Тема призвана облегчить освоение программы новичками
Содержание:
- Поиск пикселя определенного цвета и щелчок по нему мышью (http://crapware.aidf.org/forum/index.php?topic=33.msg224#msg224)
- Запуск блокнота и запись в нем произвольного текста (http://crapware.aidf.org/forum/index.php?topic=33.msg229#msg229)
- WinAPI, работа с окнами через PostMessage (http://crapware.aidf.org/forum/index.php?topic=33.msg562#msg562)
- Привязка к окну (+ красивое рисование в Paint) (http://crapware.aidf.org/forum/index.php?topic=33.msg637#msg637)
- Написание подпрограммы для вычисления даты (http://crapware.aidf.org/forum/index.php?topic=33.msg708#msg708)
- Выполнение действия в разные промежутки времени (http://crapware.aidf.org/forum/index.php?topic=33.msg810#msg810)
- Пример использования функций работы с txt файлами (http://crapware.aidf.org/forum/index.php?topic=33.msg972#msg972)
- Сортировка массива (http://crapware.aidf.org/forum/index.php?topic=33.msg12641#msg12641)
- Распознавание чисел (http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571) Распознавание текста (http://crapware.aidf.org/forum/index.php?topic=88.msg16221#msg16221)
- Развернуть окно на весь экран (http://crapware.aidf.org/forum/index.php?topic=33.msg17626#msg17626)
- Простое создание снимков c цветокоррекцией COLORMODE (http://crapware.aidf.org/forum/index.php?topic=2778.msg17791#msg17791)
- Ближайшая к заданным координатам/центру картинка/пиксель (http://crapware.aidf.org/forum/index.php?topic=33.msg20114#msg20114)
- /New/ ШИКАРНЫЙ симулятор человеческого движения мыши 'WindMouse' (http://crapware.aidf.org/forum/index.php?topic=33.msg37137#msg37137)
-
Поиск пикселя определенного цвета и щелчок по нему мышью
Использованные инструкции (ознакомьтесь с ними в справке по языку):
- getscreen
- if_pixel_in .. end_if
- print
- lclick
- else
- halt
Приведенный ниже код ищет на экране пиксель красного цвета, начиная с левого верхнего угла. Как только пиксель будет найден, поиск окончится. В данном примере обрабатываются как успешный поиск, так и неуспешный.
// помещение текущего снимка экрана в буфер программы
// это необходимо для работы всех графических функций и процедур
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 // остановка скрипта, обеспечивает однократное выполнение
-
Запуск блокнота и запись в нем произвольного текста.
Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."
#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 - Остановка программы
-
Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."
Заметь, что должна быть включена английская раскладка.
-
Заметь, что должна быть включена английская раскладка.
Нельзя ли процедуру переключения раскладки поручить самой программе, или хотя бы дать понять пользователю , что у него раскладка не та?
Это я к чему?
Попробовал воспользоваться примером .
НО!
В моей ноуте никакие команды ( в языковой панели) по изменению раскладки так и не смогли "убедить" стандартный блокнот писать по английски. Хотя вручную все делаю исправно.
Если переключено на русский то получаю пустой лист с 5 точками
Если переключаю на англ , то печатается текст, но русскими буквами.
-
В переключении языка есть особенность.
Для корректного вывода раскладка должна быть одинакова и в кликере в поле ввода.
-
раскладка должна быть одинакова и в кликере в поле ввода.
Тут непонятный баг. Изначально у меня стоит англ и печатаю от руки в блокноте англ.
Но в момент запуска кликера визуально наблюдается самопроизвольный переход на русскую раскладку в языковой панели.
-
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).
-
Тут непонятный баг. Изначально у меня стоит англ и печатаю от руки в блокноте англ.
Но в момент запуска кликера визуально наблюдается самопроизвольный переход на русскую раскладку в языковой панели.
просто винда запоминает для каждого приложения раскладку. даже если это калькулятор и вводить ему нечего. насколько я помню за это отвечает процесс ctfmon.exe
можете поэкспериментировать.
вообще с нелатиницей у кейстринга всегда проблемы. поэтому обычно я рекомендую писать "привет мир" как "ghbdtn vbh"
но если кто-то разберется с непонятным багом и сделает его понятным, думаю я смогу его исправить :)
-
Нафлудили тут.
Заметь, что должна быть включена английская раскладка.
Поправил.
вообще с нелатиницей у кейстринга всегда проблемы. поэтому обычно я рекомендую писать "привет мир" как "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
-
Нафлудили тут.
Вариант чуть по-проще:
Корифеям большое спасибо!
Если не затруднит , пишите полностью рабочие скрипты. Вам не трудно сделать копипаст в скрипт ( туда куда нужно) зато у нуба одним ступором меньше.
-
Решил небольшую лепту внести...
Переменные.[/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 функцией. Если что то не правильно написал, поправьте - исправлю.
-
prapor, вариант цикла с WHILE можно написать куда кароче!
// если по координатам 100,100 цвет пиксела НЕ 255, то цикл будет работать
GETSCREEN // снимок в буфер кликера
// условие цикла: если функция PXL находит по координатам 100,100 пиксел любого цвета кроме 255
// цикл будет продолжаться, а как найдет цвет 255 то прервется, и скрипт продолжится дальше после END_CYC
WHILE(PXL(100, 100) ! 255)
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
-
Мне как обьяснили, так я и раскоментировал. Спс, что показали другой способ. Как уже писал из вас умельцев всё клещами надо вытягивать.
Только раскоментируйте свой вариант. Не всё понятно.
-
л из вас умельцев всё клещами надо вытягивать.
Только раскоментируйте свой вариант. Не всё понятно.
Проблема умельцев в том, что они не понимают, чего там такого не понимают нубы. Сытый - голодного....
Нубам эту особенность психологии нужно понимать и принимать спокойно.
Главное, чтобы у обеих сторон хватало выдержки )
-
Доброго времени суток!
Решил показать, как пользоваться WinAPI функцией
POSTMESSAGE (hwnd, message, wParam, lParam)
Что это такое?
Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows. Или по простому - базовый язык наших любимых окошек(Windows). Остальные языки программирования делают свои функции и процедуры из WinAPI или используют его на прямую.
POSTMESSAGE — функция помещает сообщение в очередь.
Зачем нам оно?
Количество функций Clickermann`а неуклонно продолжает расти, но необходимо очень много времени, чтоб можно было сделать свои обертки на все функции Windows. А теперь, когда появилась эта функция мы можем на прямую работать с интерфейсами окошек. И использовать максимум функционала.
Ставим задачу
Нужно написать код, чтоб можно было кликать в окошке, которое находится позади других.
Невозможно, скажете вы и ошибетесь ;D . Потому, как мы не будем эмулировать клик мыши, а станем посылать сообщение окну, в котором должен быть произведен клик. Нужно это для разных случаев, но мне пригодилось во флеш игре, в которой необходимо кликать мышкой каждую минуту(даже сейчас она кликает, нервно помигивая кнопкой на панели задач, пока я пишу эту статью).
Что нам понадобится
нам понадобится сама функция
PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
hWnd - Дескриптор окна(грубо говоря - адрес), оконная процедура которого должна принять сообщение.
Если подробнее, то кнопки, поля для ввода текста, раскрывающиеся списки, меню и т.д. - это и есть окна(с точки зрения Микрософт), а не только прямоугольная форма с крестиком, квадратиком и палочкой в правом верхнем углу(как думают большинство). И у каждого этого элемента есть свой hWnd. Означает, что нам нужно мышкой указывать не на форму, в которой находится кнопка, а именно на кнопку, у которой пытаемся узнать hWnd.
Msg - Сообщение, которое должно быть поставлено в очередь. Сообщение цифровое и писать мы будем его цифрами. Есть куча сообщений, которые могут приходить окну. Вот небольшой список:
wm_LButtonDblClk, wm_LButtonDown, wm_LButtonUp, wm_MButtonDblClk, wm_MButtonDown, wm_MButtonUp, wm_MouseMove, wm_NCLButtonDown, wm_NCLButtonUp, wm_NCLButtonDblClk, wm_NCMButtonDown, wm_NCMButtonDblClk, wm_NCMouseMove, wm_NCRButtonDown, wm_NCRButtonUp, wm_NCRButtonDblClk, wm_RButtonDown, wm_RButtonUp, wm_RButtonDblClk и т.п.
И каждому такому сообщению выдан свой код(0x0201 — означает шестнадцатиричный вид, например 0x0201 = 513):
WM_LBUTTONDOWN = 0x0201 // Левая кнопка мыши нажата.
WM_LBUTTONUP = 0x0202 // Левая кнопка мыши отпущена.
WM_RBUTTONDOWN = 0x0204 // Правая кнопка мыши нажата.
WM_RBUTTONUP = 0x0205 // Правая кнопка мыши отпущена.
WM_MOUSEMOVE = 0x0200 // Мышь передвинута.
WM_MOUSEWHEEL = 0x020A // Кручение колесика мыши.
wParam и lParam - Это 32-битовые парaметры. Для каждого случая свои. Но в нашем случае в первом параметре задается нажатые кнопки(если нажато несколько кнопок то они складываются, например нажаты вместе SHIFT и левая кнопка мыши — 0x0004 + 0x0001 = 0x0005):
MK_LBUTTON = 0x0001 // Левая кнопка мыши находится в нажатом состоянии.
MK_RBUTTON = 0x0002 // Правая кнопка мыши находится в нажатом состоянии.
MK_SHIFT = 0x0004 // Клавиша SHIFT находится в нажатом состоянии.
MK_CONTROL = 0x0008 // Клавиша CTRL находится в нажатом состоянии.
MK_MBUTTON = 0x0010 // Средняя кнопка мыши находится в нажатом состоянии.
MK_XBUTTON1 = 0x0020 // Windows 2000/XP: Первая X-кнопка находится в нажатом состоянии.
MK_XBUTTON2 = 0x0040 // Windows 2000/XP: Вторая X-кнопка находится в нажатом состоянии.
Мышкины события и их коды описаны в MSDN(en)
http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v=vs.85).aspx)
Клавиатурные события и их коды описаны в MSDN(en)
http://msdn.microsoft.com/en-us/library/windows/desktop/ff468861(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ff468861(v=vs.85).aspx)
А во втором параметре координаты курсора мыши. Как же можно в одном числе записать 2 значения X и Y? Давольно просто: используя 32 битную операционную систему можно в первых 16 битах передавать Y, а во второй части — X. Например координаты (123 , 456) в шестнадцатиричнном виде будут выглядеть как (0x007B , 0x01C8) и мы получим параметер lParam = 0x01C8007B или в десятичном будет непойми что 29 884 539 = 123 + 456 * 65536. Откуда взялась цифра 65536 оставлю на домашнее задание(подсказка: 256*256=65536, 256 — BYTE, 65536 — WORD)
Практика
Вы дочитали до этих строк и не бросили это нудное дело? Тогда хвала Вам и почет, о любимый мой читатель. А еще лэвэл ап и новый скилл. Копируем и вставляем в Clickermann следующее:
$WM_LBUTTONDOWN = 0x0201 // Левая кнопка мыши нажата.
$WM_LBUTTONUP = 0x0202 // Левая кнопка мыши отпущена.
$MK_LBUTTON = 0x0001 // Левая кнопка мыши находится в нажатом состоянии.
$HWND = 16515858 // изменяется при каждом запуске целевой программы,
// нужно каждый раз вписывать заного
$x = 100 // Координата по X
$y = 100 // Координата по Y
//Отправляем сообщение окну о нажатой левой кнопке мыши
postmessage($HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x + ($y*65536))
//Мало-мало ждем, а можно и вообще не ждать,
// т.к. сообщения уходят в список и выполняются по порядку
waitms(50)
//Отправляем сообщение окну, что левую кнопку мыши отпустили
postmessage($HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x + ($y*65536))
// Завершаем программу
halt
Запускаем mspaint — стандартную рисовалку Windows, наводим мышь на белый холст и наблюдаем в редакторе кода за hWND. Пишем свое число вместо моего $HWND = и запускаем скрипт(Clickermann). Все. Теперь на холсте паинта стоит точка на расстоянии 100 пикселей от левого края холста(а не экрана!!!) и 100 пикселей от правого.
Эпилог
В браузерах обычно сам сайт и все, что в нем есть имеет один hWND. И высчитав количество пикселей сверху, которое занимает панели браузера можно к Y дописать $y = 100-61 (61 - высота панели хрома) и задавать координаты без вычислений, но при условии, что форма развернута на весь экран. Если двигать форму по всему экрану то прийдется каждый раз пересчитывать координаты. Т.к. все элементы будут содержать собственные координаты. И угол (0,0) - это не угол экрана в данном случае, а верхний левый угол элемента(будь то кнопка, или поле для ввода текста, или страница в браузере - прокручивание не влияет на координаты на экране монитора).
Удачи!
-
молодец. добавил в оп-пост. учитесь, господа
можно еще добавить ссылки на MSDN, там есть все коды событий и флагов
-
Доброго времени суток!
Сегодня поговорим о привязке к окну. В предыдущей статье шла речь о WinApi, но не о привязке к окнам. Хотя можно использовать и WinApi, но есть ряд существенных недостатков. Реализация(написание) скриптов при помощи привязки гораздо проще, т.к. достаточно вставить lclick(x, y) (можно это сделать даже при помощи сочетания ALT+Q) и не нужно громоздить остального кода, включая расчет координат.
Зачем нам оно?
Привязка к окну помогает кликать в окно, даже когда оно свернуто. Также можно свернуть и clickermann. Это значит, что нам можно заниматься своими делами, пока работает кликер. И он нам не будет мешаться.
Ставим задачу
Будем учиться на простом примере: кликать в свернутый Paint(он у каждого в системе есть, стандартная программа). Делать будем не одиночный клик, а нам надо занять рисовалку, пока мы будем проделывать различные действия с окнами. Т.к. тут необходимо уяснить принцип действия, а написание дальнейшего скрипта не будет отличаться от нормального режима.
Что нам понадобится
1. Clickermann 4.7
2. Paint(можно запустить нажав на клавиатуре WIN+R и введя в появившееся окно mspaint, а затем Enter)
3. Скрипт(можно будет скопировать мой Цветок.cms, для примера работы)
Скрипт небольшой, можно и продублировать:
#name "Цветок"
// Скрипт, рисующий(в паинте) цветок
$r = 100 // Радиус
$f = 24 // Форм фактор
$i = 0.3 // Смещение начала
while(($i*100) < 1640) // Начало цикла.
// Заглушка для проверки дробей
$x = cos($i*$f) // переход от полярных координат
$y = sin($i*$f) // к декартовым
$x = $x *($r-$i*$f/2) // Придание формы спирали
$y = $y *($r-$i*$f/2) // и задание размера
$x = $x + 100 + $r // Центрование
$y = $y + 100 + $r // на холсте
$x = round($x, 0) // Округление координат
$y = round($y, 0) // Иначе клика не получим
lclick($x, $y) // Сам клик
waitms(50) // Пауза: разгружает процессор
$i = $i + 0.02 // следующая полярная координата
end_cyc // Окончание цикла
halt // Точка выхода из скрипта
Практика
Все достаточно просто, можно разбить всю задачу на 4 пункта:
1. Открываем Paint
2. Открываем фаил Цветок.cms(либо жмем на кнопочку РЕДАКТОР туда вставляем, нажимаем применить и закрываем редактор)
3. В программе Paint мышкой наводим на белый холст будущего рисунка и нажимаем на клавиатуре ALT+W. При этом в окне Clickermann`a должна появиться надпись вкл напротив строчки Статус: в группе Привязка к окну.
4. Запускаем Clickermann, нажав на зеленую кнопочку, или на клавиатуре ALT+A
Все, теперь программа работает и мы можем перекрыть окно паинта другим окном или вовсе свернуть. Скрипт продолжит работу в любом случае.
Эпилог
Теперь Вы можете не загораживать экран окном, в котором работает Clickermann. Достаточно просто свернуть их и делать любые другие действия, кроме нажатия на горячие клавиши старта/стопа(ALT+A / ALT+S). Также не забываем отлаживать скрипты, прежде чем их помещать на задний план. Они должны отработать стабильно(без ошибок) несколько десятков раз на Ваших глазах.
-
Хе-хе, красиво получилось!
-
Хе-хе, красиво получилось!
Красиво )
Пара вопросов от нуба.
Нельзя ли из самого скрипта пейнт вызвать , плюс растянуть его холст на нужный размер?
Как сделать например цветные спирали ?
-
Статья была предназначена для разрешения вопросов по привязке к окну и работе в фоновом режиме. Если заинтересовал рисованием тригонометрических графиков то можно погуглить на слова: циклоида, эпициклоида, гипоциклоида, фрактал
http://www.delphigfx.narod.ru/2d/009/2d_9.htm
http://www.megabook.ru/MediaViewer.asp?RNode=4024&MID=453982
2 ЦИТРИН:
Попробуй сам реализовать - это же интересно ;)
Можно использовать следующие функции:
EXECUTE ("filename", ["param"]) - вызывает внешний файл
Параметры
filename - имя файла
param - необязательный параметр; строка параметров
WNDFIND ("title", [begin]) - числовая функция; возвращает HWND окна с заданным заголовком
Параметры
title - заголовок окна либо его часть
begin - необязательный параметр; флаг сообщает о том что строка title может находиться ТОЛЬКО в начале заголовка
WNDPOS (hwnd, x, y) - помещает окно на экране в указанные координаты
Параметры
hwnd - HWND окна
x,y - экранные координаты
WNDSIZE (hwnd, w, h) - задает размер окна
Параметры
hwnd - HWND окна
w,h - ширина, высота окна
А также можно сказать, что элементы там не передвигаются и статично стоят на своих местах. Остается только найти их координаты при помощи положения и размеров окна.
-
2 ЦИТРИН:
Попробуй сам реализовать - это же интересно ;)
Можно использовать следующие функции:
WNDFIND
WNDPOS
WNDSIZE (hwnd, w, h)[/b] - задает размер окна
Вы полагаете я не пробовал играть в эти команды?
Пробовал.
Ничего не вышло.
Если не затруднит, покажите алгоритм их использования , в 100% рабочем скрипте, с подробными пошаговыми комментариями . Тогда в аналогичной задаче ( скажем с фотошопом ) новичкам будет легче.
Заранее благодарен )
-
WNDFIND/POS/SIZE - это хорошо, а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?
-
Написал небольшой скриптик, который реализует запуск, перемещение, изменение размеров окна и его кнопок, за испытуемого был выбран калькулятор.
#name "Windows change"
$HWnd = 0 // Дескриптор окна(указатель на окно)
execute("calc") // Запускаем калькулятор
wait(1) // Ждем 1 сек.
// Если калькулятор запускается первый раз,
// то немного надо подождать. Последующие разы будет
// Запускаться мгновенно (так реализована память Windows)
$HWnd = WNDFIND ("Калькулятор Плюс") // Пытаемся найти окно(в Windows XP)
// Если не найдет то ошибки не покажет.
// Но $HWnd будет равна нулю
if ($HWnd > 0) // Проверяем нашлось ли окно
WndPos ($HWnd, 200, 200) // Двигаем окно
WaitMS(500)
lClick(265,236) // Кликаем в меню "ВИД"
WaitMS(500)
lClick(288,257) // Кликаем в меню "ОБЫЧНЫЙ"
WaitMS(500)
// Еще раз повторюсь: любой элемент формы - это окно
// Значит мы можем двигать и менять размер не только формы,
// но и кнопок на ней
$HWnd = hGet (270,300) // Находим дескриптор кнопки "Backspace" в глобальных координатах 270,300
WndSize ($HWnd, 36, 29) // Меняем ее размер в локальных координатах
WaitMS(500)
$HWnd = hGet (340,300) // Находим дескриптор кнопки "CE" в глобальных координатах 340,300
WndSize ($HWnd, 36, 29) // Меняем ее размер в локальных координатах
WaitMS(500)
WndPos($HWnd, 93, 37) // и местоположение в локальных координатах
WaitMS(500)
$HWnd = hGet (400,300) // Находим дескриптор кнопки "C" в глобальных координатах
WndSize ($HWnd, 36, 29) // Меняем ее размер в локальных координатах
WaitMS(500)
WndPos($HWnd, 132, 37) // и местоположение в локальных координатах
WaitMS(500)
halt // Точка выхода из скрипта
end_if
$HWnd = WNDFIND ("Калькулятор") // Окно не нашлось... Мб у Вас Win7 ?
if ($HWnd > 0) // Проверяем нашлось ли окно
WndPos ($HWnd, 200, 200) // Двигаем окно
WaitMS(500)
$HWnd = hGet (250,280) // Находим дескриптор поля ввода текста в глобальных координатах
WndSize ($HWnd, 100, 50) // Меняем его размер в локальных координатах
WaitMS(500)
WndPos($HWnd, 60, 33) // и местоположение в локальных координатах
WaitMS(500)
end_if
halt // Точка выхода из скрипта
а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?
Стандартными средствами только анализировав картинку и сохранением в переменную смещения ползунка. Или в Photoshop`e посчитав, на сколько пикселей сместился ползунок, а затем при помощи связки LDOWN (x, y) -> MOVE (x, y) -> LUP (x, y) передвинуть его. Либо посылать ему сообщение SendMessage(hwnd, WM_HSCROLL, SB_THUMBPOSITION, 0) подробнее тут: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787575(v=vs.85).aspx
Не стандартными - писать отдельную DLL и с помощью ее это проделывать.
Других вариантов не придумал.
-
Спасибо Dr_midon)
Скрипт 100% рабочий. Очень толково все разъясняющий.
Интересно получилось. Вы не зря потратили свое время.
Добавлю в твиттер . https://twitter.com/ClickerForum
-
Есть небольшая утилитка(Spy32 for windows) очень бородатого года, которая поможет разобраться в элементах форм запущенных приложений. Вчера пытался похожие найти, но более свежие. ХЗ как спросить у гугла. Нашел только платную.
Использовать оч просто: запустил и перетягиваешь(Drag`n`Drop) крестик с первой вкладки на нужный тебе элемент. Программка показывает довольно много информации об целевом окне(кнопке/поле/элементе интерфейса). Можно некоторые свойства менять.
-
Есть небольшая утилитка(Spy32 for windows) очень бородатого года, которая поможет разобраться в элементах форм запущенных приложений. Вчера пытался похожие найти, но более свежие. ХЗ как спросить у гугла. Нашел только платную.
Использовать оч просто: запустил и перетягиваешь(Drag`n`Drop) крестик с первой вкладки на нужный тебе элемент. Программка показывает довольно много информации об целевом окне(кнопке/поле/элементе интерфейса). Можно некоторые свойства менять.
InqSoft Window Scanner 1.7
http://clickermann.tk/forum/index.php?topic=42.msg572#msg572
-
InqSoft Window Scanner 1.7 поинтереснее будет, побольше функционала, спс ;)
Но она тож довольно-таки старенькая, хотя и помоложе того, что я выложил.
-
а есть возможность сохранить и воспроизвести положение ползунков вертикальной и горизонтальной прокрутки содержимого окна?
Стандартными средствами только анализировав картинку и сохранением в переменную смещения ползунка. Или в Photoshop`e посчитав, на сколько пикселей сместился ползунок, а затем при помощи связки LDOWN (x, y) -> MOVE (x, y) -> LUP (x, y) передвинуть его. Либо посылать ему сообщение SendMessage(hwnd, WM_HSCROLL, SB_THUMBPOSITION, 0) подробнее тут: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787575(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/bb787575(v=vs.85).aspx)
Не стандартными - писать отдельную DLL и с помощью ее это проделывать.
Других вариантов не придумал.
Хотел попробовать SendMessage(hwnd, WM_HSCROLL, SB_THUMBPOSITION, 0). В справке кмана написано:
Поскольку у нас нет всех констант "WM_", то параметр message необходимо задавать десятичным числом.
на чём собственно все мои потуги и закончились. Не нашел справочника где даются числовые значения констант "WM_", если я правильно всё понял.
-
Жаль нет у форума сворачивающихся блоков, так бы туда все переписал.
Нашел следующее на японском сайте, но думаю проблем с языком не возникнет ;D
messages: http://www1.u-netsurf.ne.jp/~ozawa/prog/event/message.html
Еще нужны запросы пользователя (wParam):
WM_VSCROLL WM_HSCROLL
--------------------------------------------------------
SB_LINEUP = 0 SB_LINELEFT = 0
SB_LINEDOWN = 1 SB_LINERIGHT = 1
SB_PAGEUP = 2 SB_PAGELEFT = 2
SB_PAGEDOWN = 3 SB_PAGERIGHT = 3
SB_THUMBPOSITION = 4 SB_THUMBPOSITION = 4
SB_THUMBTRACK = 5 SB_THUMBTRACK = 5
SB_TOP = 6 SB_LEFT = 6
SB_BOTTOM = 7 SB_RIGHT = 7
SB_ENDSCROLL = 8 SB_ENDSCROLL = 8
Кроме того не стоит забывать, что
http://msdn.microsoft.com/ru-ru/library/windows/desktop/bb787575(v=vs.85).aspx
The WM_HSCROLL message is sent to a window when a scroll event occurs in the window's standard horizontal scroll bar. This message is also sent to the owner of a horizontal scroll bar control when a scroll event occurs in the control.
wParam
The HIWORD specifies the current position of the scroll box if the LOWORD is SB_THUMBPOSITION or SB_THUMBTRACK; otherwise, this word is not used.
The LOWORD specifies a scroll bar value that indicates the user's scrolling request. This word can be one of the following values.
SB_ENDSCROLL
SB_LEFT
SB_RIGHT
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_THUMBTRACK
lParam
If the message is sent by a scroll bar control, this parameter is the handle to the scroll bar control. If the message is sent by a standard scroll bar, this parameter is NULL.
Вольный перевод:
WM_HSCROLL сообщение отправляется в окно, когда событие scroll происходит в горизонтальной полосе прокрутки окна. Это сообщение также отправляется владельцу горизонтальной полосы прокрутки при возникновении события scroll в элементе управления.
WPARAM
HIWORD определяет положение полосы прокрутки, если LOWORD берется значение SB_THUMBPOSITION или SB_THUMBTRACK, в противном случае это слово не используется.
LOWORD указывает запрос пользователя. Это слово может быть одним из следующих значений.
SB_ENDSCROLL
SB_LEFT
SB_RIGHT
SB_LINELEFT
SB_LINERIGHT
SB_PAGELEFT
SB_PAGERIGHT
SB_THUMBPOSITION
SB_THUMBTRACK
lParam
Если сообщение отправляется и полосе прокрутки, lParam является дескриптором управления полосы прокрутки. Если сообщение не отправляется полосе прокрутки, lParam имеет значение NULL
-
В теме "Предложения по применению от новичков." Сергей написал интересный скрипт, который позволяет ставить дату и время в удобочитаемом формате. http://clickermann.tk/forum/index.php?topic=36.msg373#msg373
Нельзя ли его перенести сюда , в шапку примеров?
На этом примере новичкам можно показать, как работает функция инклуд.
-
Скрипт включает действия в определенное время.
IF_TIME("*:*:*"). Звездочка означает любой час, любую минуту и секунду.
IF_TIME("12:00:00") // сработает в 12:00:00
END_IF
Пример:
IF_TIME("12:10:*") // Включаем в 12.10
$t1 = 1
END_IF
IF_TIME("16:10:*") // Отключаем в 16.10
$t1 = 0
END_IF
IF_TIME("16:10:*") // Включаем в 16.10
$t2 = 1
END_IF
IF_TIME("12:10:*") // Отключаем в 12.10
$t2 = 0
END_IF
IF($t1 = 1) // 12.10
// здесь Действие
// Будет выполняться с 12.10 по 16.10
LOGWRITE("Задание в 12.10")
END_IF
IF($t2 = 1) // 16.10
// здесь Действие
// Будет выполняться с 16.10 по 12.10
LOGWRITE("Задание в 16.10")
END_IF
WAITMS (500)
-
Написание подпрограммы для вычисления даты
Пример создания пользовательских подпрограмм и их подключения через директиву include
Оригинальный пост пользователя Сергей: http://clickermann.tk/forum/index.php?topic=36.msg373#msg373
Данный пример раскрывает возможность "прятать от глаз" большой громоздкий код в программные библиотеки.
Имеется задача: вычислить текущую дату на основании системной переменной $_time_t
Для этого была написана следующая подпрограмма, для удобства вынесенная в отдельный файл date.cms
date.cms
// Day, Month, Year from $_time_t
// Author: Sergey
// Version: 1.0 (30.10.2012)
SUB(UPDATE_DATE)
$_date_y = 1970
$_date_m = 1
$_date_d = ROUND(($_time_t / (3600 * 24)) - $voi, 0) + 1//floor
$voi = 0.499999999999
$break = 0
WHILE($break = 0)
$arg1 = $_date_y-1968
$arg2 = 4
IF($arg1-(ROUND(($arg1/$arg2)-$voi,0)*$arg2) = 0)//mod($_date_y-1968, 4) = 0
$nd = 366
ELSE
$nd = 365
END_IF
if($_date_d > $nd)
INC($_date_d, 0-$nd)
INC($_date_y, 1)
ELSE
$break = 1
END_IF
END_CYC
$break = 0
WHILE($break = 0)
$arg1 = $_date_y-1968
$arg2 = 4
IF( ($arg1-(ROUND(($arg1/$arg2)-$voi,0)*$arg2) = 0) & ($_date_m = 2) )//(mod($_date_y-1968, 4) = 0) & ($_date_m = 2)
$nd = 29
ELSE
$nd = STRCUT("31,28,31,30,31,30,31,31,30,31,30,31", (($_date_m-1) * 3) + 1, 2)
END_IF
IF($_date_d > $nd)
INC($_date_d, 0-$nd)
INC($_date_m, 1)
ELSE
$break = 1
END_IF
END_CYC
END_SUB
GOSUB(UPDATE_DATE)
После вызова эта подпрограмма создает следующие переменные, которые могут использоваться в вашей программе
- $_date_d - День
- $_date_m - Месяц
- $_date_y - Год
Пример использования подпрограммы
// Подключаем файл, содержащий подпрограмму UPDATE_DATE, это работает так же, как если бы вы просто скопировали все содержимое файла date.cms за место этой строчки
#include "date.cms"
print($_date_d,".",$_date_m,".",$_date_y) // Выводим "старую" дату
GOSUB(UPDATE_DATE) // Вызов подпрограммы (напоминаю что ее "тело" находится в подключенном файле date.cms), обновление переменных
print($_date_d,".",$_date_m,".",$_date_y) // Выводим актуальную дату
HALT
Этот пример вы можете скачать из вложения
Ах да, скрипт не будет работать если вы изобрели машину времени и переместились раньше 1970 года.
Отдельное спасибо Ляпису за идею с обходом отсутствия массивов.
-
Хм, а почему в справке о условии IF_TIME нигде не написано?
-
Хм, а почему в справке о условии IF_TIME нигде не написано?
потому что я думал что удалил его уже давно. очередной костыль из серии if_что-то. неправильно все это.
пользуйтесь переменными
кто спойлеры просил.
[spoiler=вот есть пока такие]
потом может доработаю
сейчас надо другие дела поделать
[/spoiler]
-
Скрипт выполняет действия в разные промежутки времени
1 действие 1 раз в 30 секунд
2 действие 1 раз в 1 минуту
3 действие 1 раз в 2 минуты
$_time_t - это системная переменная. При каждом обращении к ней возвращает текущее время в формате Unix-систем
Отсчет времени идет в секундах. А если нужно использовать миллисекунды то в место $_time_t пишем $_ms - Системный таймер Windows.
Имя переменных $time1, $time2 и тд. может быть любым.
// ПЕРВОЕ ДЕЙСТВИЕ РАЗ В 30 СЕКУНД
IF($time1 < $_time_t) // условие сработает если переменная $time1 меньше $_time_t
$time1 = $_time_t + 30 // записываем в переменную $time1 текущее время + 30 секунд
// Здесь пишутся необходимые действия
END_IF // конец первого условия
// ВТОРОЕ ДЕЙСТВИЕ РАЗ В 1 МИНУТУ
IF($time2 < $_time_t)
$time2 = $_time_t + 60
// Здесь пишутся необходимые действия
END_IF // конец второго условия
// ТРЕТЬЕ ДЕЙСТВИЕ РАЗ В 2 МИНУТЫ
IF($time3 < $_time_t)
$time3 = $_time_t + 120
// Здесь пишутся необходимые действия
END_IF // конец третьего условия
// вне условий можно написать действия которые должны выполняться постоянно
WAITMS (500) // задержка скрипта 500 мс для разгрузки процессора
Также, время следующего срабатывания может записываться в файл ini.
Это важно если действия выполняются, например, раз в час или еще дольше, можно остановить кликер, и таймеры не собьются.
INT и STRCONCAT я использовал чтобы кликер при отсутствии файла time.ini не выдавал ошибок (вернет 0 если строки или файла не существует)
// Эти строки выполняются при запуске 1 раз
$time1 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time1", "TIME")))
$time2 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time2", "TIME")))
$time3 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time3", "TIME")))
go: // далее произойдет зацикливание до метки GO
IF($time1 < $_time_t)
$time1 = $_time_t + 30
INIWRITE ("time.ini", "Time1", $time1, "TIME") // запись в файл time.ini времени следующего срабатывания условия
// Здесь пишутся необходимые действия
END_IF
IF($time2 < $_time_t)
$time2 = $_time_t + 60
INIWRITE ("time.ini", "Time2", $time2, "TIME")
// Здесь пишутся необходимые действия
END_IF
IF($time3 < $_time_t)
$time3 = $_time_t + 120
INIWRITE ("time.ini", "Time3", $time3, "TIME")
// Здесь пишутся необходимые действия
END_IF
WAITMS (500)
goto(go) // переход к метке GO
-
Перезагрузить или выключить компьютер.
Для этого пишем такие строки
Отключение компьютера
EXECUTE ("shutdown.exe", "/s /t 00")
HALT
Отключение компьютера с принудительным завершением приложений без предварительного предупреждения
EXECUTE ("shutdown.exe", "/s /f /t 00")
HALT
Перезагрузка компьютера
EXECUTE ("shutdown.exe", "/r /t 00")
HALT
Обозначения:
/l Выход (Log off)
/s Завершение работы компьютера
/r Перезагрузка компьютера
/a Прекращение завершения работы системы
/t xx Таймаут завершения работы - xx сек.
/f Принудительное завершение приложений без предварительного предупреждения
-
Как нажать Ctrl+V в оконном режиме?
Вариант 1
TOCLIP ("Тест") // отправляем текст в буфер
SENDMESSAGE ($_hwnd, 0x0302, 0, 0) //Посылаем окну команду "Вставить из буфера"
halt // стоп
Если не работает используем другой способ.
Вариант 2
TOCLIP ("Тест") // отправляем текст в буфер
WAITMS (50)
$hwnd = $_hwnd // записываем в переменную $hwnd текущий HWND окна
HSET ($hwnd,0) // отключаем оконный режим
KEYDOWN (#CTRL) // зажимаем Ctrl
HSET ($hwnd,1) // снова включаем оконный режим
WAITMS (20)
KEYPRESS (#V) // отправляем окну нажатие клавиши V
HSET ($hwnd,0) // отключаем оконный режим
KEYUP (#CTRL) // отпускаем Ctrl
HSET ($hwnd,1) // снова включаем оконный режим
halt // стоп
-
Люди, товарищи, граждане, господа...
Есть ли у кого решение известного языкового бага/особенности. Надоело следить за раскладкой в самом Кликермэне. Да и не всегда это возможно, если кровь из носа, а нужно использовать оба языка в одном скрипте.
Ситуацию бы спасло исправление работы программы или хотя бы костыли для этого + (как здесь предлагали) функция (переменная?) для определения раскладки в целевом окне.
Если кто-то решил проблему, поделитесь пожалуйста.
-
Да проблему сейчас твердо никак не решить, только если при включении скрипта следить за раскладкой. Нужно конечно переменную в которой находится текущая раскладка, по другому никак.
-
Джонни, а нельзя по аналогии POSTMESSAGE на WinAPI ввести функцию
LoadKeyboardLayout - загрузить новую раскладку
достаточно будет её одной, ну для полной нирваны можно ещё
GetKeyboardLayout - определить текущую раскладку
Заранее извиняюсь если сморозил чушь, в WinAPI ничего не понимаю, просто искал информацию по POSTMESSAGE и обратил внимание.
-
Да надо просто ввести системную переменную $_kblayout и помещать в нее раскладку текущего окна при обращении к ней.
-
Друзья, всем привет ))
Возникает вопрос по посту - Написание подпрограммы для вычисления даты (http://clickermann.tk/forum/index.php?topic=33.msg708#msg708)
У меня в данный момент вычисляет 7.12.2012.
Как вылечить, где править, может корректировку GMT поставить?
Но не в одной корректировке пояса дело.
-
СлавьЯнИнъ, а какое у тебя время?
Он по идее должен выдавать дату которая стоит у тебя на компьютере. В $_time_t кладется время прошедшее с 1 января 1970 года без поправок на часовой пояс, т.е. время когда этот момент настал именно в твоем часовом поясе.
Так выдает виндовс, и так выдает и кликерман.
Хотя велика вероятность что проблема в алгоритме, мог где-нибудь ошибиться.
-
Применено:
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)
получено:
1. Если время с 00:00 до 12:59 то
оба принта с правильным числом
2. Если время с 13:00 до 23:59 то
первый принт показывает число на 1 больше, а второй нормальное.
Вот и гадать теперь где там эта ошибка ?? ((
-
Сергей
Как тебе помочь в поиске ошибки?
-
Уважаемый Сергей написал новую версию скрипта для даты. http://goo.gl/02CY7
Вероятно есть смысл её обновить и в "типовых алгоритмах".http://goo.gl/MdZSS
-
Применено:
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)
получено:
1. Если время с 00:00 до 12:59 то
оба принта с правильным числом
2. Если время с 13:00 до 23:59 то
первый принт показывает число на 1 больше, а второй нормальное.
Вот и гадать теперь где там эта ошибка ?? ((
Попробуй на новом скрипте, я как раз отловил там этот баг.
-
Пример использования функций работы с файлами (TFREAD, TFWRITE и т.п.)
Данный скрипт удаляет из произвольного файла строчные комментарии.
#name "Delete comments"
// Инициализируем переменные
$filename = "test.txt"//Имя файла
$i = 1//Индекс строки
WHILE( $i < TFCOUNT($filename) + 1 ) // Выполняем до тех пор, пока не кончатся строки
$string = TFREAD($filename, $i) // Читаем строку $i из файла
$pos = STRPOS($string, "//") // Ищем в строке "//"
IF($pos ! 0) // Если "//" в строке есть
TFDELETE($filename, $i) // Удаляем эту строку
IF($pos ! 1) // Если до "//" вообще есть какой-то текст
TFWRITE($filename, STRCUT2($string, 1, $pos - 1), $i) // То пишем его в файл, на ту же строку, которую удалили.
END_IF
ELSE
INC($i, 1) // Если никаких комментариев в строке нету, то переходим к другой строке
END_IF
END_CYC
HALT // Останавливаем скрипт
Используемые команды:
- TFREAD - Чтение строки из файла
- TFWRITE - Запись строки в файл
- TFDELETE - Удаление строки из файла
- TFCOUNT - Количество строк в файле
- STRPOS - Нахождение строки
- STRCUT2 - Обрезание строки
- INC - Увеличение значения переменной
- WHILE - Цикл
Пояснение некоторых моментов:
WHILE( $i < TFCOUNT($filename) + 1 ) // Выполняем до тех пор, пока не кончатся строки
"+ 1" является заменой выражения меньше-равно. Счет строк в Кликермане начинается с 1 и просто выражение "меньше" обработает все строки кроме последней.
IF($pos ! 0) // Если "//" в строке есть
В Кликермане функция STRPOS возвращает ноль, если ничего не найдено. Счет тут так же начинается с 1.
TFWRITE($filename, STRCUT2($string, 1, $pos - 1), $i) // То пишем его в файл, на ту же строку, которую удалили.
Синтаксис функции STRCUT2 - STRCUT2($string, $begin, $end)
Эта функция в качестве третьего аргумента ($end) принимает номер символа считая с нуля. При этом второй аргумент ($begin) считает от 1.
Т.е. функция STRCUT2("test", 1, 1) вернет "t". Поэтому в данном случае от переменной $pos отнимается 1.
Пример файла test.txt:
tesst
te//
te
te//
//
//
//
foo
foo//
//
bar
ba
//
//
test
bar//foo
foo
Результат работы скрипта:
tesst
te
te
te
foo
foo
bar
ba
test
bar
foo
-
Данный скрипт удаляет из произвольного файла строчные комментарии.
Речь идет о удалении всего, что за косыми //.
Вероятно это полезно, особенно корифеям.
А вот нельзя ли написать скрипт, для удаления из текста строчек с матюками ?
( или как-то мат метить красным цветом, вырезать и записывать в отдельный файл итп)
Страна просыпается. Начнет помаленьку отряхиваться от демократических нечистот.
Такой скрипт был своевременным.
п.с.
Скачать в сети матфильтр пока не удалось. Нарвался на вирусню [spoiler]C:\PROGRA~1\Matfiltr\mtfltr.dll --> Подозрение на Keylogger или троянскую DLL [/spoiler] и успокоился.
-
Для матфильтра нужен, собственно, матлист и синтаксический анализатор русского языка. Первый, если составлять самому, будет далеко не полон.
А для реализации второго, нужен язык немного другой направленности, нежели Кликерман.
-
Типовой Сниматель Скришотов SSWL
Работает в двух режимах. Первый для сравнения колормода, второй для покадровой съёмки.
// ScreenShot WireLess
// including Getcreen Colormode Screenshot
// значения задаваемые вручную для работы программы
$Nameobj = "GlazBuri" // имя объекта сканирования
$Mode = 10
$Mwait = 250
// Варианты работы:
// 1) $mode = 1. делает 8 скриншотов, по 1 на каждую опцию колормода
// 2) $mode = >1. любое значение больше единицы приводит к изготовлению этого кол-ва скриншотов c паузами в $Mwait миллисекунд
If ($mode > 1)
$m2cycle = 0
WHILE ( $mode > $m2cycle )
screenshot($nameobj)
waitms($Mwait)
inc($m2cycle)
end_cyc
end_if
if ($mode = 1)
getscreen
screenshot(strconcat("SSWL. ",$nameobj," clear "))
COLORMODE(1)
screenshot(strconcat("SSWL. ",$nameobj," colormode1 "))
getscreen
COLORMODE(2)
screenshot(strconcat("SSWL. ",$nameobj," colormode2 "))
getscreen
COLORMODE(3)
screenshot(strconcat("SSWL. ",$nameobj," colormode3 "))
getscreen
COLORMODE(4)
screenshot(strconcat("SSWL. ",$nameobj," colormode4 "))
getscreen
COLORMODE(5)
screenshot(strconcat("SSWL. ",$nameobj," colormode5 "))
getscreen
COLORMODE(6)
screenshot(strconcat("SSWL. ",$nameobj," colormode6 "))
getscreen
COLORMODE(7)
screenshot(strconcat("SSWL. ",$nameobj," colormode7 "))
End_if
halt
кодировку исправил, благодарю Oraven, Сергей
-
Типовой Сниматель Скришотов
Спасибо)
Будет намного удобнее.
Попутно вопрос. А нельзя ли сделать так, чтобы на выходе скрипта у нас получались не полные снимки экрана, а прямоугольные зоны по указанным границам Х_У. (готовые картинки искомой цели в колормодах). Можно ли как-то автоматизировать работу в стандартном пейнте в продолжении данного скрипта.
-
У тебя какая то не та кодировка
-
СлавьЯнИнъ, сохрани скрипт кликерманом и открой каким-нибудь другим редактором. И из него уже копипасть.
-
Благодарю, Друзья!
В принципе после перезагрузки всё стало в норму. Видимо несколько открытых программ с разной кодировкой повлияли на буфер обмена.
-
Сморя для какой задачи. Можно и в одном скрипте.
Используя команды HGET, HSET, WNDFIND и системную переменную $_hwnd можно сделать с любым количеством окон.
Если по WNDFIND будет определяться не тот hwnd, можно сделать чтоб скрипт при запуске поочерёдно делал окна активными и HGET-ом брал нужные hwnd. Таким образом вначале "пристреливаемся", потом работаем.
Пока писал ответ удалили вопрос :)
-
Винт, сори, я просто не очень корректно его сформулировал. Я понял, что можно, используя WinApi кликать в свернутые 10 окон браузера. Но пока не понял, можно ли это делать, используя "оконный режим" кликера или этот режим подходит только для одного свернутого окна.
-
Данный скрипт запускает блокнот и 5 раз записывает в него строку "The quick brown fox jumps over the lazy dog."
Заметь, что должна быть включена английская раскладка.
Кликер 4.7 SE, винда7, записываю свой англ.текст в игровое окно в браузер, раскладка включена англ. - KEYSTRING (с включенным временем задержки) записывает все заглавные английские прописными английскими .... прописные - прописными...
пичалька ((
нашел свою ошибку - на самом деле - кликер 4.3 и в справке показано - заглавные запишет прописными ... :-р-р-р-р...
-
[spoiler]
Кому то может понадобиться перезагрузить или выключить компьютер.
Для этого пишем такие строки
Отключение компьютера
EXECUTE ("shutdown.exe", "/s /t 00")
HALT
Отключение компьютера с принудительным завершением приложений без предварительного предупреждения
EXECUTE ("shutdown.exe", "/s /f /t 00")
HALT
Перезагрузка компьютера
EXECUTE ("shutdown.exe", "/r /t 00")
HALT
Обозначения:
/l Выход (Log off)
/s Завершение работы компьютера
/r Перезагрузка компьютера
/a Прекращение завершения работы системы
/t xx Таймаут завершения работы - xx сек.
/f Принудительное завершение приложений без предварительного предупреждения
[/spoiler]
угу, вин+К "shutdown -s -f -t 6000" энтер, и кликерман не нужен
А мне посоветуйте пожалуйста вот что...
Таким скриптом ищу картинки for($scrn, $find < 1)
GETSCREEN
if_picture_in (200, 200, 450, 400, "sher1.bmp")
print("Cîâïàäåíèå ñ 1. Ñêðèí # ", $scrn)
inc($find, 1)
end_if
if_picture_in (200, 200, 450, 400, "sher2.bmp")
print("Cîâïàäåíèå ñ 2. Ñêðèí # ", $scrn)
inc($find, 1)
end_if
if_picture_in (230, 230, 450, 400, "sher3.bmp")
print("Cîâïàäåíèå ñ 3. Ñêðèí # ", $scrn)
inc($find, 1)
end_if
if_picture_in (230, 230, 450, 400, "sher4.bmp")
print("Cîâïàäåíèå ñ 4. Ñêðèí # ", $scrn)
inc($find, 1)
end_if
end_cyc
Картинок всегда 4 но что бы изменить назначение скрипта нужно изменить названия картинок, так вот нельзя ли как-то названия картинок задавать строковой переменной?
-
Просто привели пример выключения ПК из командной строки. Не все же посетители продвинутые пользователи.
При чём здесь нужен кликер или нет? Бывает спрашивают "как автоматически выключить комп после отработки скрипта?". Вот это и был ответ.
По вопросу "нельзя ли как-то названия картинок задавать строковой переменной". Можно.
Можно даже так перебирать
$prefix="sher"
...
...
$i=0
FOR ($i, $i<4)
IF_PICTURE_IN (200, 200, 450, 400, STRCONCAT($prefix,$i,".bmp"))
// обработка
END_IF
END_CYC
-
GETSCREEN забыл
-
Так это же общий пример... Намётки так сказать... Ну да, и GETSCREEN забыл до кучи :) :D
-
Делать фор на 4 скрина не пойдет, потому как их порой делается несколько сотен, думаю решать это ожиданием, однако на мой вопрос вы ответили сполна, спасибо.
-
Доброго времени суток.
Есть такая конструкция:
$time = $_time_t + 30
GETSCREEN
WHILE((PXL (100, 100) ! 255) & ($time > $_time_t))
WAITMS (100)
GETSCREEN
END_CYC
Возможно ли в данной конструкции использовать IF_PIXEL_IN вместо PXL.
Если да, то как будет выглядеть код?
Спасибо.
-
Доброго времени суток.
Есть такая конструкция:
$time = $_time_t + 30
GETSCREEN
WHILE((PXL (100, 100) ! 255) & ($time > $_time_t))
WAITMS (100)
GETSCREEN
END_CYC
Возможно ли в данной конструкции использовать IF_PIXEL_IN вместо PXL.
Если да, то как будет выглядеть код?
Спасибо.
while((pxlcount(0, 0, $_xmax, $_ymax, 255)<1) & ($time > $_time_t))
waitms(100)
getscreen
end_cyc
Будет ждать, пока на экране не появится пиксель 255 цвета и не истекло время
Чуть более длинный, но куда более продуктивный вариант
$flag=0
while ($flag=0)
if_pixel_in(0, 0, $_xmax, $_ymax, 255, 256, 257, ...) //все необходимые цвета
$flag=1
end_if
waitms(100)
getscreen
end_cyc
-
Доброго времени суток.
Есть такая конструкция:
$time = $_time_t + 30
GETSCREEN
WHILE((PXL (100, 100) ! 255) & ($time > $_time_t))
WAITMS (100)
GETSCREEN
END_CYC
Возможно ли в данной конструкции использовать IF_PIXEL_IN вместо PXL.
Если да, то как будет выглядеть код?
Спасибо.
Если прям аналог, то можно так:
$time = $_time_t + 30
WHILE($time > $_time_t)
GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
$time = $_time_t - 1
ELSE
WAITMS (100)
END_IF
END_CYC
-
ivanuskov, Vint
Спасибо за содержательный и быстрый ответ ;D
-
День добрый!
Почему-то программа не обрабатывает нажатие клавиши "Prt Sc". Вообще изначально задача очистить буфер, эта кнопка избрана для легкого выполнения это задачи. Может быть есть возможность очистить буфер иначе, либо сделать что-то чтобы программа обрабатывала указанную клавишу.
-
День добрый!
Почему-то программа не обрабатывает нажатие клавиши "Prt Sc". Вообще изначально задача очистить буфер, эта кнопка избрана для легкого выполнения это задачи. Может быть есть возможность очистить буфер иначе, либо сделать что-то чтобы программа обрабатывала указанную клавишу.
Очистить буфер?
TOCLIP("")
Если, конечно не используются спец проги для увеличения числа запоминаемых фрагментов.
-
День добрый!
Почему-то программа не обрабатывает нажатие клавиши "Prt Sc".
благодаря новому механизму записи удалось выяснить что код этой кнопки внезапно оказался 44 а не тот что по документам. с остальными клавишами боюсь та же беда.
запись внезапно стала полезной.
-
Здравствуйте. Подскажите как можно задать в макросе на определенные строки длительность по времени выполнения. Ну то есть он дошел до определенной строки и начинает выполнять определенные действия определенное время, а после окончания отведенного времени макрос дальше продолжал выполняться? Возможно не внятно объяснил, приведу пример.
LCLICK(1245,180)
WAITMS(500)
LDOWN(917,175)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("574")
WAITMS(100)
LDOWN(988,174)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("609")
WAITMS(100)
LCLICK(1025,177)
WAIT(40)
LCLICK(646,515)
WAITMS(500)
LCLICK(657,507)
WAITMS(1500)
LCLICK(618,534)
WAIT(40)
LCLICK(846,981)
WAITMS(500)
LCLICK(1245,180)
WAITMS(900)
LDOWN(917,175)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("433")
WAITMS(100)
LDOWN(988,174)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("190")
WAITMS(100)
LCLICK(1025,177)
WAIT(40)
LCLICK(646,515)
WAITMS(5000)
LCLICK(657,507)
WAITMS(500)
LCLICK(618,534)
LCLICK(1245,180)
WAITMS(500)
LDOWN(917,175)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("453")
WAITMS(100)
LDOWN(988,174)
WAITMS(100)
LUP(881,176)
WAITMS(100)
KEYSTRING("270")
WAITMS(100)
LCLICK(1025,177)
WAIT(6)
LCLICK(385,976) //
WAITMS(100) //
LCLICK(433,979) //
WAITMS(100) //
LCLICK(478,977) //
WAITMS(100) // Нужно чтобы этот цикл длился на протяжении 20 минут
LCLICK(307,416)
WAITMS(700)
LCLICK(646,478)
WAIT(40)
LCLICK(561,528)
WAIT(5)
-
while
for
операторы цикла описаны в инструкции к программе
-
Ну хорошо. А как сделать то что бы он 20 минут подряд работал то?Тут нашел только функцию чтоб включался он раз в 20 минут, это немного не то.
-
Ну хорошо. А как сделать то что бы он 20 минут подряд работал то?Тут нашел только функцию чтоб включался он раз в 20 минут, это немного не то.
Ну и в чём разница то? Знак "меньше" на "больше" поменять?...
$end = $_time_t + 1200
WHILE($end > $_time_t)
// Здесь твой код
END_CYC
-
Туплю. ))) Только взялся изучать прогу. ))) Примного благодарен.
-
Ггг... итак, скачал, воткнул, наскриптил в виде левый клац туда, туда, туда и т.д., даже работает ! Однако вопросы остались, вот у меня одинаковые циклы, то есть разумно было бы написать клацни туда то, потом выполни цикл и вернись, клацни еще куда то, выполни цикл и т.д., а вот хрен там был, команды цикла, не for-while, а goto-return, этой супер проге незнакомы, итак ЧТО ЗА ЯЗЫК ПРОГРАММИРОВАНИЯ в этом боту ???
-
Ггг... итак, скачал, воткнул, наскриптил в виде левый клац туда, туда, туда и т.д., даже работает ! Однако вопросы остались, вот у меня одинаковые циклы, то есть разумно было бы написать клацни туда то, потом выполни цикл и вернись, клацни еще куда то, выполни цикл и т.д., а вот хрен там был, команды цикла, не for-while, а goto-return, этой супер проге незнакомы, итак ЧТО ЗА ЯЗЫК ПРОГРАММИРОВАНИЯ в этом боту ???
Видимо тебе нужны подпрограммы
SUB(подпрограмма)
// здесь цикл
END_SUB
LCLICK(100,100)
подпрограмма()
LCLICK(200,200)
подпрограмма()
LCLICK(300,300)
подпрограмма()
LCLICK(400,400)
подпрограмма()
-
Ггг... итак, скачал, воткнул, наскриптил в виде левый клац туда, туда, туда и т.д., даже работает ! Однако вопросы остались, вот у меня одинаковые циклы, то есть разумно было бы написать клацни туда то, потом выполни цикл и вернись, клацни еще куда то, выполни цикл и т.д., а вот хрен там был, команды цикла, не for-while, а goto-return, этой супер проге незнакомы, итак ЧТО ЗА ЯЗЫК ПРОГРАММИРОВАНИЯ в этом боту ???
Видимо тебе нужны подпрограммы
SUB(подпрограмма)
// здесь цикл
END_SUB
LCLICK(100,100)
подпрограмма()
LCLICK(200,200)
подпрограмма()
LCLICK(300,300)
подпрограмма()
LCLICK(400,400)
подпрограмма()
Не осилил... именно в коду можно ? Не по русски, а именно кодом с русскими комментариями, сорри за тупизну ! И главное - как из подпрограммы вернуться к продолжению выполнения скрипта и еще момент есть команда goto (прям бейсик), а return нету ???
-
А это и есть код. Да назвать твою подпрограмму можно прямо по русски, например назовем её Моя_прога. И да, когда дойдет до вызова Моя_прога() выполнение скаканет в подпрограмму SUB(Моя_прога), выполнит все что там написано и вернется на следующую строку после Моя_прога() и тд.
SUB(Моя_прога) // эта часть кода отрабатывает ТОЛЬКО ПО ВЫЗОВУ
// здесь часто повторяемый код
END_SUB // конец подпрограммы
LCLICK(100,100)
Моя_прога() // вызов подпрограммы
LCLICK(200,200)
Моя_прога()
-
Ещё раз привет) Извините конечно, но мозги мои совсем закостенели уже(((( Читал справку, облазил весь форум, но так и не врубился как написать скрипт.
Знатоки, будьте так любезны нарисуйте тут образец со следующими пояснениями:
1)запуск скрипта с привязкой к окну(видел описание, но для кучи ещё разок)
2) определение размеров окна ($_xmax,$_ymax)
3) вывод инфы размеров ($_xmax,$_ymax) в лог или трей
Разжуйте пожалуйста, а то пока мои мозги расшевелятся и впитают в себя то что написано в справке пройдёт года полтора)))
-
Нет в кликере функций определения размера окна.
-
Нет в кликере функций определения размера окна.
Понял :(
-
Подскажите пожалуйста.
Написал скрипт, без привязки к окну пашет как часы. Но хотелось бы с привязкой и свернуть эти окна что бы не мешались.
Но дело в том что в скрипте используется функция GETSCREEN и она снимает снимок текущего окна. А мне нужно снять экран привязанного окна и использовать PXLCRC
Спасибо.
P.S. Даже не так немного. Если делать привязку к окну, то скрипт неправильно работает.
23:16:35 Hash: 800543756 //Без привязки
23:16:35 800543756 //Без привязки
23:16:37 STOP: 3851769229 //Без привязки
23:16:37 3851769229 //Без привязки
23:17:26 Hash: 0 //С привязкой
23:17:26 0 //С привязкой
23:17:28 STOP: 0 //С привязкой
-
Окно сворачивать нельзя, в свернутом окне ничего не отображается. Но окно можно например задвинуть за экран или оставить на фоне.
-
Окно сворачивать нельзя, в свернутом окне ничего не отображается. Но окно можно например задвинуть за экран или оставить на фоне.
Спасибо за ответ. Но даже при активном окне скрипт неправильно срабатывает при привязке к окну.
PXLCRC всегда возвращает 0
P.S.
Извиняюсь, нашел проблему. Решения нету :(
"Касательно приложения - таки да - это эмулятор андроида и при старте приложения запущенная "apk'шка" действительно оборачивается отдельным процессом"
Всё зависит от приложения + проблема с x64.
-
используй виртуальную машину
http://rutracker.org/forum/viewtopic.php?t=4578599 (http://rutracker.org/forum/viewtopic.php?t=4578599)
Лучше скачать портативную. Создаешь расширяемый образ диска на 7-10 гигов, выделяешь 512 мг оперативы и одно ядро процессора ставишь туда XP.
-
Надеюсь, не буду сильно не в тему, если чуть-чуть попытаюсь вспомнить про оптимизацию...
Если счётчик цикла внутри него используется несколько раз, то можно сделать следующим образом:
Задан массив(например, координаты по икс и игрек)
$arr[0]=123
$arr[1]=111
.
.
.
$arr[39]=321
$arr[39]=222
For($i, $i<40)
$new_var1=$arr[2*$i] //тут респект автору, напомнил азы программирования :)
$new_var2=$arr[2*$i+1] //оригинал - в теме "Массивы"
move($new_var1,$new_var2)
ldown($new_var1,$new_var2)
lup($new_var1,$new_var2)
end_cyc
Таким образом процесс "поиск значения массива по индексу" каждый раз при обращении к хранящимся в нём значениям
меняется на "однократное обращение к элементу массива на каждом шаге, далее - обращение к переменной".
Если мне не изменяет память, работает чуть быстрей.
Эффективность увеличивается с ростом количества обращений к элементу массива на каждом шаге
Если честно, на работоспособность не проверял в контексте скриптов, но, надеюсь, работает
-
раскладка должна быть одинакова и в кликере в поле ввода.
Тут непонятный баг. Изначально у меня стоит англ и печатаю от руки в блокноте англ.
Но в момент запуска кликера визуально наблюдается самопроизвольный переход на русскую раскладку в языковой панели.
Если не ошибаюсь, по правилам Win при запуске проги какАя бы раскладка ни была, она переключается на раскладку по умолчания
-
prapor, вариант цикла с WHILE можно написать куда кароче!
// если по координатам 100,100 цвет пиксела НЕ 255, то цикл будет работать
GETSCREEN // снимок в буфер кликера
// условие цикла: если функция PXL находит по координатам 100,100 пиксел любого цвета кроме 255
// цикл будет продолжаться, а как найдет цвет 255 то прервется, и скрипт продолжится дальше после END_CYC
WHILE(PXL(100, 100) ! 255)
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
У нуба возникло 3 вопроса )) 1 - первый GETSCREEN (тот, что выше "// условие цикла: если функция" находится) тоже надо прописывать? То есть - GETSCREEN 2 раза надо писать? (К слову - я попробовал и у меня это условие искало и находило пиксель ВООБЩЕ без обоих GETSCREEN... ???) 2 - Между какими строчками нужно прописывать команды в теле условия, которые будут выполняться, если пиксель НЕ найден? Между "WAITMS(100) // задержка" и "GETSCREEN", или Между "GETSCREEN" и "END_CYC"? И 3 - Как написать такое же условие, но для IF_PICTURE_IN?
-
У нуба возникло 3 вопроса )) 1 - первый GETSCREEN (тот, что выше "// условие цикла: если функция" находится) тоже надо прописывать? То есть - GETSCREEN 2 раза надо писать? (К слову - я попробовал и у меня это условие искало и находило пиксель ВООБЩЕ без обоих GETSCREEN... ???) 2 - Между какими строчками нужно прописывать команды в теле условия, которые будут выполняться, если пиксель НЕ найден? Между "WAITMS(100) // задержка" и "GETSCREEN", или Между "GETSCREEN" и "END_CYC"? И 3 - Как написать такое же условие, но для IF_PICTURE_IN?
1. Тоже, он нужен для первого сравнения PXL. Второй, для последующих в цикле.
(то, что у тебя находило... не запускай для проверки скрипт из открытого редактора. В редакторе GETSCREEN шарашит автоматом всегда - для лупы и показа цвета).
2. перед WAITMS(100).
3. Для IF_PICTURE_IN только раздельно, снаружи искусственный WHILE, внутри IF_PICTURE_IN с флагом :)
-
У нуба возникло 3 вопроса )) 1 - первый GETSCREEN (тот, что выше "// условие цикла: если функция" находится) тоже надо прописывать? То есть - GETSCREEN 2 раза надо писать? (К слову - я попробовал и у меня это условие искало и находило пиксель ВООБЩЕ без обоих GETSCREEN... ???) 2 - Между какими строчками нужно прописывать команды в теле условия, которые будут выполняться, если пиксель НЕ найден? Между "WAITMS(100) // задержка" и "GETSCREEN", или Между "GETSCREEN" и "END_CYC"? И 3 - Как написать такое же условие, но для IF_PICTURE_IN?
3. Для IF_PICTURE_IN только раздельно, снаружи искусственный WHILE, внутри IF_PICTURE_IN с флагом :)
Я чую назревает вопрос еще на пару суток... ) Можно пояснить плиз? ::)
-
Для пиксела
GETSCREEN
WHILE(PXL(100, 100) ! 255)
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
Для картинки
WHILE($repeat_pupkin = 0)
GETSCREEN
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "file.bmp",-1,100)
$repeat_pupkin = 1
ELSE
WAITMS(100)
END_IF
END_CYC
-
Не - про PXL я понял сразу из твоего ответа! :) Мне про "снаружи искусственный WHILE, внутри IF_PICTURE_IN с флагом" было непонятно. Спс за ответ
-
Ребята, подсобите пожалуйста, я уже не понимаю и устал. вот есть простенький код, единственный, который я пока осилил. но он работает только в активном режиме, мне же надо его на задний фон поставить, чтобы он работал параллельно с тем как я творю свои дела на компе.
http://crapware.aidf.org/forum/index.php?topic=33.msg562#msg562 - этот пост таранил несколько раз, но пока безуспешно
http://crapware.aidf.org/forum/index.php?topic=33.msg637#msg637 - здесь проще, но проблема возникает в момент когда надо прокрутить колесико вниз-вверх, я так понял, что в фоновом режиме другие команды
LCLICK(541,512) //
WAITMS(RND(2000,5000)) // 0
WHEELDOWN (30) // тут проблема
WAITMS(RND(3000,5000))
LCLICK(788,858) //
WAITMS(RND(2000,5000)) // 0
LCLICK(732,924) //
WAITMS(RND(2000,5000))
WHEELUP (30) // и тут
WAITMS(RND(3000,5000)) // 0
LCLICK(757,127) //
WAIT(RND(1400,2000)) // 20-30 минут
-
А клавиши "PageUp" "PageDown " вместо колесика не годятся?
-
А клавиши "PageUp" "PageDown " вместо колесика не годятся?
вот спасибо, буду пробовать, совсем отупел. еще такой вопрос - как сделать так чтобы она в лог или в отдельное окошко выводило инфу о том, когда делала последнюю активность (допустим, последний клик мышкой перед долгим делэем) и о том, через какое время этот самый делей кончится? он же у меня рандомно стоит, но я так понимаю, он сразу выбирает число и ставит таймер
-
Вот так
LCLICK(541,512) //
WAITMS(RND(2000,5000)) // 0
KEYPRESS(#PAGEDOWN)
WAITMS(RND(3000,5000))
LCLICK(788,858) //
WAITMS(RND(2000,5000)) // 0
LCLICK(732,924) //
WAITMS(RND(2000,5000))
KEYPRESS(#PAGEUP)
WAITMS(RND(3000,5000)) // 0
LCLICK(757,127) //
$time = $_time_t + RND(1400,2000) // 23-33 минут
WHILE($time > $_time_t)
WAIT(1)
$ts = $time-$_time_t
$th = 0
$tm = 0
while($ts > 3599)
INC($ts,-3600)
INC($th, 1)
end_cyc
while($ts > 59)
INC($ts,-60)
INC($tm, 1)
end_cyc
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
LOGCLEAR
LOGWRITE ("Осталось: ",$th,":",$tm,":",$ts)
END_CYC
-
спасибо огромное, на такое и не расчитывал, но мне очень хочется понять все ето, а с 18 строки для меня полный лес. можно построчное обьяснение? ::)
видно я что-то не так делаю - не хочет оно в фоновом режиме работать, окно вылезает на первый план и тогда уже все происходит
-
видно я что-то не так делаю - не хочет оно в фоновом режиме работать, окно вылезает на первый план и тогда уже все происходит
Если окно становится активным, то это проблемы окна и винды. Скрипт здесь не при чём.
Если это браузер, нужно попробовать сменить браузер.
Если флешь приложение на хроме - отключить встроенный флешь.
Попробовать отключить аппаратное ускорение в браузере/игре.
Попереключать темы win с aero.
В общем поиграться и попрыгать с бубном, попеть песни призывающие духов скриптов.
-
ох уж мне ети танцы с бубном((
браузер не могу сменить, нужен именно хром. ам не флеш, обычная браузерка. аппаратное ускорение выключил, не помогло. про темы с вин и аеро не уловил. у меня 8ка стоит.
еще такой вопросик - есть команда, чтобы вот ето KEYPRESS(#PAGEDOWN) не по одной страничке листало, а сразу в самый низ, до упора?или какую проверку воткнуть, не соображу
-
KEYPRESS(#END)
вы еще не все кнопки на клавиатуре знаете а уже за скрипты писать взялись
-
KEYPRESS(#END)
вы еще не все кнопки на клавиатуре знаете а уже за скрипты писать взялись
извините, я не очень умный уродился, но стараюсь
-
пересел на Мозиллу, все работает как надо, в фоновом режиме. теперь передо мной стоит задача сделать такую штуку: чтобы оно на каждый 2-3 цикл ( цикл длится 20-30 минут) скрипта делало дополнительные действия. я так понимаю, мне надо в основу кода зашить ссылку на доп скрипт и перед ней проверку на время (с прошлого срабатывания прошло не меньше, допустим, одного часа, как раз те самые 2-3 цикла)
вот еще мелочь , которая досаждает. хочу чтобы лог весел всегда поверх всех окон, то есть всегда был доступен взору. Естесьно, нажимаю в нем кнопочку "поверх всех окон", но буквально через несколько переключенй окон о безнадежно теряется в задах. опять глюки системки?
-
Нечего дробить скрипт!
Прописываещь это условие в конец скрипта и в него свои действия.
DEFINE($time, $_time_t + 3600)
IF($time < $_time_t)
// Сюда твои (дополнительные действия)
// Условие сработает через час и будет срабатывать каждый час
$time = $_time_t + 3600
END_IF
-
ок, не буду ничего дробить. проверь пжлст, я прально все понял?
DEFINE($time, $_time_t + 3600) // задаем переменную, называем ее $time и делаем ее равной текущему времени + 1 час.
IF($time < $_time_t) // здесь условие выполниться только в том случае, если наша переменная становится меньше текущего времени, то есть если прошел 1 час и больше
// сюда пропишу все шо хочу
// Условие сработает через час и будет срабатывать каждый час
$time = $_time_t + 3600 // здесь мы задаем нашей переменной новое обновленное значение, чтобы опять пошел отсчет на час и больше
END_IF
если все так, то куда мне лучше засунуть все ето в свой скрипт. и потом, у меня там есть переменная $time, просто дать другое имя?
вот
LCLICK(1009,78) // 1313280
WAITMS(RND(2000,5000)) // 0
KEYPRESS(#END)
WAITMS(RND(3000,5000))
LCLICK(787,850) // 16777215
WAITMS(RND(2000,5000)) // 0
LCLICK(738,917) // 4045725
LCLICK(738,917) // 4045725
WAITMS(RND(3000,5000))
KEYPRESS(#HOME)
WAITMS(RND(3000,5000)) // 0
LCLICK(757,127) //
// так думаю надо засунуть сюда, перед ожиданием (хотел выделить цветом, но внутри кода кликера похоже на работают форумные коды(
$time = $_time_t + RND(1400,2000) // 23-33 минут
WHILE($time > $_time_t)
WAIT(1)
$ts = $time-$_time_t
$th = 0
$tm = 0
while($ts > 3599)
INC($ts,-3600)
INC($th, 1)
end_cyc
while($ts > 59)
INC($ts,-60)
INC($tm, 1)
end_cyc
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
LOGCLEAR
LOGWRITE ("Осталось: ",$th,":",$tm,":",$ts)
END_CYC
-
Да все верно. Назови второй таймер например "$time2" и все будет нормально.
-
Да все верно. Назови второй таймер например "$time2" и все будет нормально.
отлично так и сделал, всю ночь полет нормальный, спасибо большое за разьяснения)) теперь еще вот такой вопрос: как вот ето оформить?
В случае указания директивы #logfile, помимо окна лога, сообщение записывается в файл %папка_проекта%/log.txt
чтобы, значит, сообщение в файл выводилось
-
для этого надо #logfile отдельно прописать в любой строчке до команды print. с этим разобрался, но подскажи можно ли сделать так, чтобы в лог оно записывало только определенную инфу, а не все подряд. то есть надо чтобы в одном месте стоял етот #logfile, а потом вроде как #unlogfile) или так нельзя и тут уж придется дробить скрипт с отдельными подпрограммами?
-
Директивы пишут в начале скрипта и они действуют на весь скрипт, отключить потом их нельзя.
Есть же запись в файл. Вот простой пример.
TFWRITE("Log.txt", "Твое сообщение")
Но тебе может потребоваться также запись времени.
Вот пример посложнее. Подпрограммы обычно прописывают в верхней части скрипта, до основного кода.
SUB(лог,$str) // подпрограмма должна быть выше её вызова
IF($str = "пробел")
LOGWRITE (" ")
TFWRITE("Log.txt", " ")
ELSE
$th = $_time_h
$tm = $_time_m
$ts = $_time_s
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
LOGWRITE ($th,":",$tm,":",$ts, " ",$str)
TFWRITE("Log.txt", STRCONCAT($th,":",$tm,":",$ts, " ",$str))
END_IF
END_SUB
$time = 12345
лог("Мое сообщение") // обычная запись
лог(STRCONCAT("Мое сообщение ",$time)) // комбинированная запись
лог("пробел") // записать в лог отступ
HALT
Все просто ;)
-
ух, полтора часа просидел, разбираясь в твоем примере посложнее) вот что получилось, переработанное под мои потребности
SUB(лог,$str)
$th = $_time_h
$tm = $_time_m
$ts = $_time_s
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
LOGWRITE ($th,":",$tm,":",$ts, " ",$str)
TFWRITE("Log.txt", STRCONCAT($th,":",$tm,":",$ts, " ",$str))
END_SUB
LCLICK(1089,78) // центр деры
WAITMS(RND(3000,5000))
GETSCREEN
IF_PICTURE_IN (1266, 284, 1288, 409, 1.bmp)
лог("время обнаружения напа")
HINTPOPUP("идет нап", "ПИСТЕЕЦЦ")
EXECUTE ("C:\Users\Ил\Desktop\Clickermann v4.10\data\sound\1.wav")
WAITMS(2000)
end_if // конец условия
HALT
хотя сейчас вот понимаю, что ето же самое сделать еще простче, ведь мне не нужно фиксировать альтернативно-отрицательные условия. если да - то записывает, а нет - так и ладно. получится вот так, верно?
LCLICK(1089,78) // центр деры
WAITMS(RND(3000,5000))
GETSCREEN
IF_PICTURE_IN (1266, 284, 1288, 409, 1.bmp)
$th = $_time_h
$tm = $_time_m
$ts = $_time_s
IF(STRLEN($th)<2)
$th = STRCONCAT ("0", $th)
END_IF
IF(STRLEN($tm)<2)
$tm = STRCONCAT ("0", $tm)
END_IF
IF(STRLEN($ts)<2)
$ts = STRCONCAT ("0", $ts)
END_IF
TFWRITE("Log.txt", STRCONCAT("Время обнаружения" $th,":",$tm,":",$ts, " "))
HINTPOPUP("идет нап", "ПИСТЕЕЦЦ")
EXECUTE ("C:\Users\Ил\Desktop\Clickermann v4.10\data\sound\1.wav")
WAITMS(2000)
end_if // конец условия
HALT
остались такие вопросы: как видишь, у меня стоит execute на аудио сигнал, то есть он открывается обычным проигрывателем, потому что обычным SOUND("1.wav") не играет звук. почему?
-
Ошибка, не хватает запятой
TFWRITE("Log.txt", STRCONCAT("Время обнаружения", $th,":",$tm,":",$ts))
Имя файла должно быть в кавычках
IF_PICTURE_IN (1266, 284, 1288, 409, "1.bmp")
Папка где лежит скрипт является корнем. Туда и нужно класть твои файлы.
SOUND("1.wav")
Или для порядка создать в ней еще одну папку, например "Звуки"
Тогда путь будет выглядить так
SOUND("Звуки\1.wav")
-
воо, спасибо, отлично работает! а то я нашел внутри папку Sound, и туда как ишак звуки пихал)
а вот ето у мене отлично и без кавычек имя файла находит))
IF_PICTURE_IN (1266, 284, 1288, 409, "1.bmp")
-
Всем доброго времени суток. Интересует один вопросик. Можно ли как-то проанализировать наличие пикселей в окне (функции PXL, PXLCOUNT), если оно свернуто или закрыто другим окном?
-
Всем доброго времени суток. Интересует один вопросик. Можно ли как-то проанализировать наличие пикселей в окне (функции PXL, PXLCOUNT), если оно свернуто или закрыто другим окном?
только если используется оконный режим в кликере с установкой активного окна через hset(hwnd)
-
скажите, а можно каким либо образом (например EXECUTE) настроить уведомление за рамки компутера - по имейлу или любому мессенджеру (скайп, вибер). вот задался вопрос, но пока очевидного решения не нашел
-
только если используется оконный режим в кликере с установкой активного окна через hset(hwnd)
Спасибо за ответ, но нельзя ли с примером и разъяснениями, а то, если честно, я ничего не понял.
Допустим я открываю этот форум в опере, выставляю положение окна оперы и ее размер, и получаю номер пикселя с координатами 200, 325:
$hwnd = WNDFIND("Типовые алгоритмы")
WNDPOS($hwnd,100,50)
WAITMS(500)
WNDSIZE($hwnd,1200,950)
WAITMS(500)
$pxl = PXL(210,325)
Затем я включаю любую другую вкладку, либо просто сворачиваю оперу, либо открываю например фотошоп, который закрывает окно оперы. Как мне получить номер пикселя со страницы этого форума?
-
Наводишь мышь на окно, нажимаешь Alt+W теперь кликер перешел в оконный режим. Координаты теперь отсчитываются от начала этого окна, смотришь какие координаты и вписываешь в скрипт.
Сворачивать окно нельзя так как при этом винда ничего в нем не отрисовывает.
-
скажите, а можно каким либо образом (например EXECUTE) настроить уведомление за рамки компутера - по имейлу или любому мессенджеру (скайп, вибер). вот задался вопрос, но пока очевидного решения не нашел
У adenа видел скрипт с передачей лога в ICQ как раз через EXECUTE.
-
скажите, а можно каким либо образом (например EXECUTE) настроить уведомление за рамки компутера - по имейлу или любому мессенджеру (скайп, вибер). вот задался вопрос, но пока очевидного решения не нашел
execute + mimcmd.exe + miranda c плагином cmdline
-
ниче не понял, но ладно.
другой вопрос назрел - вот обратил внимание на отсчет количества проигранных циклов в главном окне проги. Подскажите, что надо прописать, чтобы определенные действия оно делало на каждый, например, третий цикл, если такое возможно?
-
ниче не понял, но ладно.
другой вопрос назрел - вот обратил внимание на отсчет количества проигранных циклов в главном окне проги. Подскажите, что надо прописать, чтобы определенные действия оно делало на каждый, например, третий цикл, если такое возможно?
Ну опять все через условия
INC($count,1)
IF($count = 3)
// здесь действия на 3ем цикле
$count = 0 // сброс
END_IF
-
Такое возможно только после прочтения встроенной справки, она компактная и доходчивая.
Встроенная справка не поможет, тут необходимо сторон неё ПО реагирующее на команды из терминала каковым и является приведённая связка
-
Встроенная справка не поможет, тут необходимо сторон неё ПО реагирующее на команды из терминала каковым и является приведённая связка
ответ был на вопрос "... что надо прописать, чтобы определенные действия оно делало на каждый, например, третий цикл..."
-
С телефона не заметил, сори
-
С телефона не заметил, сори
Вот так понравилась идея, ещё когда первый раз обсуждали, всё лень попробовать.
Останавливает то, что мирандой не пользовался ни разу. Что, где, какая версия подходит, какая версия плагина и где искать.
Для новичков или таких ленивых как я не можешь выложить связку в виде ссылок хотя бы? Буду премного благодарен.
-
Наводишь мышь на окно, нажимаешь Alt+W теперь кликер перешел в оконный режим. Координаты теперь отсчитываются от начала этого окна, смотришь какие координаты и вписываешь в скрипт.
Сворачивать окно нельзя так как при этом винда ничего в нем не отрисовывает.
Проблема в том, что когда я нажимаю "Alt+W", то в любом месте окна цвет пикселя становится черным, т.е. проанализировать пиксели невозможно...
-
Проблема в том, что когда я нажимаю "Alt+W", то в любом месте окна цвет пикселя становится черным, т.е. проанализировать пиксели невозможно...
В браузере? Отключи аппаратное ускорение если включено.
Как и сворачивать окно, другую вкладку открывать не катит. Если нужен этот браузер, только новое окно поверх.
-
Ну опять все через условия
INC($count,1)
IF($count = 3)
// здесь действия на 3ем цикле
$count = 0 // сброс
END_IF
то есть нам не надо отдельно обьявлять переменную $count заранее, она создается прямо тут же, в INC? и еще такой вопрос: этот цикл будет происходит независимо от цикла всего скрипта, так? то есть возможно, что в течение одного цикла всего скрипта здесь пройдет 2-3 цикла (при специальной настройки)?
-
Я не знаю куда ты это хочешь засунуть но единовременно может выполняться только одна строка в скрипте, как только выполнение доберется до INC($count,1) тогда и произойдет наращивание.
-
то есть нам не надо отдельно обьявлять переменную $count заранее, она создается прямо тут же, в INC? и еще такой вопрос: этот цикл будет происходит независимо от цикла всего скрипта, так? то есть возможно, что в течение одного цикла всего скрипта здесь пройдет 2-3 цикла (при специальной настройки)?
1) ну, теоретически, так как она не была задана ранее, то по умолчанию она равна 0.
2) этот "цикл" будет происходить в теле основного цикла, так как это не цикл, а проверка условия на равенство $count трем, а будет оно равно трем при третьем прохождении основного цикла и обнулится
3) при специальной настройке (добавлении цикла внутри цикла при помощи FOR, WHILE) можно сколько хочешь выполнений условий.
-
$HWND = 16515858 // изменяется при каждом запуске целевой программы,
// нужно каждый раз вписывать заного
Как можно еще привязать к окну например по запущенному процессу в системе или...?
-
Окно можно привязать по координате, командой HGET.
можно через поиск текста заголовка командой WNDFIND
Пример
HSET(HGET(100,100),1) // привязываем окно по координате 100 100 (координаты всегда абсолютные)
HSET(WNDFIND("Заголовок окна", 0),1) // привязываем окно с заданным заголовком
-
Распознавание чисел
Скрипт переделан под версии 4.10+
Источник (http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571)
Вот набросал распознавалку чисел. В основном для использования в играх, т.к. есть ограничения...
Старался сделать универсальным и настраиваемым. Не важно выравнивание идёт по первому или последнему разряду.
Вариант скрипта с последовательным перебором разрядов.
Хотел обойтись без текстовых файлов, только переменные. Использование текстовых файлов уменьшило бы размер скрипта, но я думаю сказалось бы незначительно на скорости работы и удобстве настройки.
Скрипт при внедрении лучше организовать как подпрограмму.
О ограничениях.
- Только целые положительные числа. Думаю для игр этого хватит, здоровье там всякое, сила и т.п.
- Максимум 10 разрядов. Если кровь из носа - можно переписать скрипт на другое кол-во :)
- Расположение цифр равномерное. Что это значит: разряды должны идти через равный промежуток
299000, а не 299 000 и т.п. - Определение конца числа по маркеру (картинке) либо по отсутствию найденных цифр. Файл *11.bmp должен быть всё равно, например мой digit_11.bmp
Настройка.
Не пугаться! Письменно выглядит много, но всё на самом деле просто.
- Необходимо заготовить картинки с цифрами 1,2,3,4,5,6,7,8,9,0 дать им соответствующие имена digit_1.bmp-digit_0.bmp
Можно заготовить маркер окончания digit_11.bmp - Замерить шаг разрядов - расстояние в пикселах от начала одной цифры до начала следующей и присвоить переменной $sdvig значение чуть меньше (можно на 1-2 пиксела, для больших шрифтов можно и больше).
- Если в пределах вашего скрипта буде распознаваться несколько шрифтов, при вызове подпрограммы нужно каждый раз задавать $sdvig и префикс имён файлов $pref. Если шрифт один - только один раз.
- При вызове задаём координаты поля в котором будет искаться число
$field_x1, $field_y1, $field_x2=, $field_y2 - Результат возвращается в переменную $res, если не найдено $res=-1.
Скрипт "Распознавание чисел 1.2.cms" подключается к исполняемому скрипту через include.
Открываем "Скрипт.cms"
В вызове подпрограммы указываем область в которой будут распознаваться цифры и сдвиг
распознавание(300,577, 362,597, 6)
В архиве находится пример распознавания числа в поле редактора "Цвет:". или HWND
Если распознаются не все числа, нужно подрегулировать сдвиг (больше/меньше)
-
хочу предложить свой вариант определения чисел. я думаю он немного быстрее и легче в настройке.
данный скрипт в данном виде настроен на определения числа номера цвета в км (естественно на моем пк)
$1 = 2598951422
$2 = 3563910420
$3 = 1725485783
$4 = 2439610189
$5 = 1142298982
$6 = 1619652509
$7 = 1251613421
$8 = 3997989515
$9 = 228076718
$0 = 1886634037
$x1 = 813 //координаты первой цифры, необязательно чтобы цифра полностью влазила в эти координаты
$y1 = 621
$x2 = 818
$y2 = 630
GETSCREEN
//$n = 1
//WHILE($n ! 9) //определение значений переменных, в км номер цвета 8-значный, поэтому в начале определяем от 1 до 8, а вторым кругом 9 и 0. естественно выставляем цвет номер 12345678, вторым кругом 90. после определеня их нужно вписать в переменные выше.
//
// $count = PXLCRC ($x1,$y1,$x2,$y2)
// print($n," = ", $count)
// INC($n,1)
// INC($x1,7)//шаг между цифрами
// INC($x2,7)
//END_CYC
//halt
WHILE($n ! 1) //непосредственно определение цифр и запись их в массив
$n = PXLCRC($x1,$y1, $x2,$y2)
switch($n)
case($0)
ARRPUSH ($var, 0)
case($1)
ARRPUSH ($var, 1)
case($2)
ARRPUSH ($var, 2)
case($3)
ARRPUSH ($var, 3)
case($4)
ARRPUSH ($var, 4)
case($5)
ARRPUSH ($var, 5)
case($6)
ARRPUSH ($var, 6)
case($7)
ARRPUSH ($var, 7)
case($8)
ARRPUSH ($var, 8)
case($9)
ARRPUSH ($var, 9)
default
$n = 1
end_switch
INC ($x1,7)
INC ($x2,7)
END_CYC
$num = 0
$r = 1
WHILE(ARRSIZE ($var) ! 0)//с помощью математики собираем всё в единое число
$num = int(arrpop($var))*$r+$num
$r = $r*10
END_CYC
print($num)
halt
-
Здравствуйте только недавно начал разбираться с программой и нужна помощь
// если по координатам 100,100 цвет пиксела НЕ 255, то цикл будет работать
GETSCREEN // снимок в буфер кликера
// условие цикла: если функция PXL находит по координатам 100,100 пиксел любого цвета кроме 255
// цикл будет продолжаться, а как найдет цвет 255 то прервется, и скрипт продолжится дальше после END_CYC
WHILE(PXL(100, 100) ! 255)
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
как сделать такое условие если по координатам 100,100 цвет пиксела НЕ 255 или не 250, то цикл будет работать
чтобы было два условия окончания цикла
-
GETSCREEN
WHILE((PXL(100, 100) ! 255)|(PXL(100, 100) ! 250))
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
-
GETSCREEN
WHILE((PXL(100, 100) ! 255)|(PXL(100, 100) ! 250))
WAITMS(100) // задержка
GETSCREEN // снимок в буфер кликера внутри цикла
END_CYC
уточните пожалуйста цикл закончится если пиксель будет 255 или 250(любого из двух цветов) или должны выполнится оба условия
-
как сделать такое условие если по координатам 100,100 цвет пиксела НЕ 255 или не 250, то цикл будет работать
чтобы было два условия окончания цикла
Ты дал условие.
уточните пожалуйста цикл закончится если пиксель будет 255 или 250(любого из двух цветов) или должны выполнится оба условия
Получил на него точный ответ и спрашиваешь снова то-же самое.
Ты думаешь мы тут собрались чтобы тебя обманывать и радостно хихикать при этом чтоли?
-
уточните пожалуйста цикл закончится если пиксель будет 255 или 250(любого из двух цветов) или должны выполнится оба условия
| - обозначает ИЛИ
& - обозначает И
^ - обозначает ИЛИ то ИЛИ другое но не оба
Да пока оба условия не станут ложными цикл будет крутиться, если одно из них будет верным цикл будет продолжаться.
-
уточните пожалуйста цикл закончится если пиксель будет 255 или 250(любого из двух цветов) или должны выполнится оба условия
| - обозначает ИЛИ
& - обозначает И
^ - обозначает ИЛИ то ИЛИ другое но не оба
спасибо
а теперь объясните мне дураку что у меня неправильно
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
WHILE((PXL(774, 186) ! 4161407)|(PXL(774, 186) ! 4144959))
lclick(530, 335)
WAIT(3)
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
END_CYC
lclick(983, 728)
WAIT(3)
заранее спасибо
-
у меня просто крутит цикл хотя второе условие PXL(774, 186) ! 4144959 выполняется
-
Запись в лог нам все разъяснит
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
WHILE((PXL(774, 186) ! 4161407)|(PXL(774, 186) ! 4144959))
LOGWRITE ("Цвет: ", PXL(774, 186))
lclick(530, 335)
WAIT(3)
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
END_CYC
lclick(983, 728)
WAIT(3)
-
Запись в лог нам все разъяснит
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
WHILE((PXL(774, 186) ! 4161407)|(PXL(774, 186) ! 4144959))
LOGWRITE ("Цвет: ", PXL(774, 186))
lclick(530, 335)
WAIT(3)
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
END_CYC
lclick(983, 728)
WAIT(3)
вот что выдал лог
20:14:22 Цвет: 4144959
20:14:25 Цвет: 4144959
20:14:28 Цвет: 4144959
20:14:32 Цвет: 4144959
20:14:35 Цвет: 4144959
20:14:38 Цвет: 4144959
20:15:03 Цвет: 4144959
20:15:06 Цвет: 4144959
20:15:09 Цвет: 4144959
20:15:12 Цвет: 4144959
20:15:15 Цвет: 4144959
20:15:18 Цвет: 4144959
20:15:21 Цвет: 4144959
-
еще один момент
условие WHILE(PXL(774, 186) ! 4161407) работает
а условие WHILE((PXL(774, 186) ! 4161407)|(PXL(774, 186) ! 4144959)) не работает и для цвета 4144959 и для 4161407
-
А ну да, там же одинаковые координаты, тогда правильно И.
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
WHILE((PXL(774, 186) ! 4161407)&(PXL(774, 186) ! 4144959))
lclick(530, 335)
WAIT(3)
GETSCREEN
COLORMODE(6, 773, 184, 780, 187)
END_CYC
lclick(983, 728)
WAIT(3)
-
еще один момент
условие WHILE(PXL(774, 186) ! 4161407) работает
а условие WHILE((PXL(774, 186) ! 4161407)|(PXL(774, 186) ! 4144959)) не работает и для цвета 4144959 и для 4161407
если проверяется один и тот же пиксель одновременно на отсутствие двух цветов, то почему в условиях "или" должно быть "и", ведь пиксель не может быть одновременно двух цветов.
WHILE((PXL(774, 186) ! 4161407)&(PXL(774, 186) ! 4144959))
и вообще не проще применить COLORMODE и проверять один цвет?
спасибо за совет вроде все работает
а смысл в том что цикл должен повторяться пока пиксель не будет 4161407 цвета но может так случится что во время выполнения цикла битва заканчивается и цикл становится бесконечным для этого тот же пиксель проверяется на другой цвет 4144959
в общем еще раз спасибо всем кто мне помог разобраться
-
хочу предложить свой вариант определения чисел. я думаю он немного быстрее и легче в настройке.
данный скрипт в данном виде настроен на определения числа номера цвета в км (естественно на моем пк)
$1 = 2598951422
$2 = 3563910420
$3 = 1725485783
привет, я недавно стал пользоваться автокликером, возможно я еще далеко не все уловки знаю, заинтересовал твой метод, о котором ты говори в своем посте. Не можешь подсказать что именно ты использовал за основу в своем скрипте. Если можно в общих чертах?
Сейчас пользую алгоритм в котором сравниваются изображения циферок прочел твой пост - зацепило....
-
привет, я недавно стал пользоваться автокликером, возможно я еще далеко не все уловки знаю, заинтересовал твой метод, о котором ты говори в своем посте. Не можешь подсказать что именно ты использовал за основу в своем скрипте. Если можно в общих чертах?
Сейчас пользую алгоритм в котором сравниваются изображения циферок прочел твой пост - зацепило....
Он использует PXLCRC - контрольныю сумму области.
Только вот беда, в большинстве случаев в играх (прозрачный/полупрозрачный фон, градиентный фон, сглаживание, сдвиг числа по полю, рендеринг со сдвигом на пол пикселя) похоронят этот способ в зародыше.
Можно использовать только при абсолютно 100% одинаковом отрисовывании чисел. + прицеливаться в первую цифру нужно до пикселя.
-
Только вот беда, в большинстве случаев в играх (прозрачный/полупрозрачный фон, градиентный фон, сглаживание, сдвиг числа по полю, рендеринг со сдвигом на пол пикселя) похоронят этот способ в зародыше.
все верно. но я думаю плюс этого способа в скорости.возможно я и ошибаюсь, вариант с изображениями циферок не проверял :).
когда мне нужно было считывать четыре семизначных числа (включая знак "-" и ".") из артмани, км с помощью PXLCRC справлялся за 70-90мс. эти числа - координаты. и с такой скоростью у меня в игре автобус ехал как по ниточке. readmem к сожелению нечитает числа с точкой, а в моем случае он вообще нечитает в игре ничего :-\.
во втором случае мне нужно было мониторить цены в магазине в игре, опять же скорость это хороше. но ... полупрозрачное окно. подставил под это окно другое окно с постоянным цветом (белое текстовое поле), и проблем нет.
-
привет, я недавно стал пользоваться автокликером, возможно я еще далеко не все уловки знаю, заинтересовал твой метод, о котором ты говори в своем посте. Не можешь подсказать что именно ты использовал за основу в своем скрипте. Если можно в общих чертах?
Сейчас пользую алгоритм в котором сравниваются изображения циферок прочел твой пост - зацепило....
Он использует PXLCRC - контрольныю сумму области.
Только вот беда, в большинстве случаев в играх (прозрачный/полупрозрачный фон, градиентный фон, сглаживание, сдвиг числа по полю, рендеринг со сдвигом на пол пикселя) похоронят этот способ в зародыше.
Можно использовать только при абсолютно 100% одинаковом отрисовывании чисел. + прицеливаться в первую цифру нужно до пикселя.
Только вот беда, в большинстве случаев в играх (прозрачный/полупрозрачный фон, градиентный фон, сглаживание, сдвиг числа по полю, рендеринг со сдвигом на пол пикселя) похоронят этот способ в зародыше.
все верно. но я думаю плюс этого способа в скорости.возможно я и ошибаюсь, вариант с изображениями циферок не проверял :).
когда мне нужно было считывать четыре семизначных числа (включая знак "-" и ".") из артмани, км с помощью PXLCRC справлялся за 70-90мс. эти числа - координаты. и с такой скоростью у меня в игре автобус ехал как по ниточке. readmem к сожелению нечитает числа с точкой, а в моем случае он вообще нечитает в игре ничего :-\.
во втором случае мне нужно было мониторить цены в магазине в игре, опять же скорость это хороше. но ... полупрозрачное окно. подставил под это окно другое окно с постоянным цветом (белое текстовое поле), и проблем нет.
dramster ,Vint - спасибо за скоростную реакцию, подумал и понял что не подходит, у меня подложка градиентная, придется перебирать картинки, ну это уже не проблема
-
у меня подложка градиентная
я думаю, что если шрифт цифр более менее жирный, то можно использовать подсчет пикселей определенного цвета (цвета цифр), PXLCOUNT (x, y, x2, y2, color) вместо PXLCRC. главное чтобы количество пикселей на каждую цифру было разным.
-
Хе-хе, красиво получилось!
:( В вин8 не получился рисунок
-
А в win 52 вообще не получится...
Вы на дату смотрите? Скрипт под версию наверно 4.5. Кликермэна естественно.
Чтобы заработало нужно переделать под текущую.
-
Привет Всем! Чтоб не создавать тему, может сюда подойдёт, а то нечто схожее есть. Правда вопрос у меня. Про картинки. Есть картинки с числами. Как оказалось, у них меняются пикселя. Т.е. вроде и не видно, число, как число, но при увеличении видно, как меняются пикселя. Я начал использовать 8 колормод. Всего 2 цвета. Вот там то и стало отчётливо видно, что цифра-картинка каждый раз от 2-3 до 7-10 пикселей, как бы смещается, соответственно, картинку уже кликер найти не может. Т.е. в 8ом моде фон весь чёрный, а само число белое. И вот эти белые пикселя съезжают на 1 -2 координаты в разнык стороны. Я пробовал тогда применить процентное соотношение. НО, тоже не помогло. Потому что допустим при 98% многое видит, как надо, а бывает многое, при чём теже цифры и не видит иногда вовсе. Ставишь на 97%, уже начинает путать сами цифры. Может кто-то что-то подобное делал когда-нибудь, есть идея у кого, как можно распознать картинку, чтобы точно знать, что там за цифры? Спасибо!
-
Привет Всем! Чтоб не создавать тему, может сюда подойдёт, а то нечто схожее есть. Правда вопрос у меня. Про картинки. Есть картинки с числами. Как оказалось, у них меняются пикселя. Т.е. вроде и не видно, число, как число, но при увеличении видно, как меняются пикселя. Я начал использовать 8 колормод. Всего 2 цвета. Вот там то и стало отчётливо видно, что цифра-картинка каждый раз от 2-3 до 7-10 пикселей, как бы смещается, соответственно, картинку уже кликер найти не может. Т.е. в 8ом моде фон весь чёрный, а само число белое. И вот эти белые пикселя съезжают на 1 -2 координаты в разнык стороны. Я пробовал тогда применить процентное соотношение. НО, тоже не помогло. Потому что допустим при 98% многое видит, как надо, а бывает многое, при чём теже цифры и не видит иногда вовсе. Ставишь на 97%, уже начинает путать сами цифры. Может кто-то что-то подобное делал когда-нибудь, есть идея у кого, как можно распознать картинку, чтобы точно знать, что там за цифры? Спасибо!
Я делал и не раз. Подбирать режимы нужно. Муторно это.
Всё зависит от шрифта. На мелких вообще тяжело.
Попробуй не 8 режим, а 7. Если в 8 много пикселов меняется тяжело подобрать, чтобы не путал. Особенно 0 и 8, ну и другие похожие.
Выложи скрины шрифта, лучше несколько вариантов. Без коррекции. Может и удастся подобрать.
-
Привет, Игорь! Там не шрифт, а картинки на флэше. Наверное не буду выкладывать. Это действительно муторно, да и затянется. Меняется, да нормально всякого. Я пока нашёл другой способ определить там цифры. Пока всё работает. Поэтому не стоит заморачиваться. Но как всегда, Спасибо за поддержку :)
-
Подскажите пожалуйста, из-за чего нет перехода к след сценарию...
if (strpos(fromclip(),"Надо много денег")>0)
load("babki.cms")
END_IF
В вызываемом файле стоит имя, по отдельности запускается и пашет, но из poiska.cms не переходит в babki.cms может "load" как то не так я указал?
спасибо.
-
load устаревшая функция, грузит скрипт начиная от папки project.
Лучше не дробить скрипт на файлы а использовать циклы.
Выложи оба скрипта.
-
эх ... если сценарий этого файла закончился, мне надо чтоб он перешел в другой, и речь идет не о скрипте, а об сценарии, мне из 1го сценария надо прыгнуть в другой, в 1 фаил столько всего пихать .... имхо не ... подскажите с аналогом LOAD если она устаревшая, то есть что то новое ? или подскажите в какой раздел бежать ...
-
Чем отличается "сценарий" от "скрипта"?
Можно и в разных файлах держать. Части скрипта из других файлов подключать по
#include "babki.cms"
-
Не знаю где спросить, спрошу тут )
Проблемка такая, кликерман работает с программкой, у нее полупрозрачное окно, т.е. кликерман его не видит. Если в менеджере окон выставляю прозрачность 100%, то все норм, но периодически у меня снова появляются полупрозрачные окна, и тут вопрос, можно ли как-нибудь устанавливать прозрачность в коде?
-
В коде, нет. Если только через сторонние утилиты.
-
Всем привет.
обьясните нубу какая разница как я буду объявлять переменную
через define или просто напишу ее в скрипте?
заранее спасибо ;D
-
Всем привет.
обьясните нубу какая разница как я буду объявлять переменную
через define или просто напишу ее в скрипте?
заранее спасибо ;D
DEFINE присваивает переменной значение только если этой переменной до этого не было.
Здесь при запуске сценария DEFINE присвоит $var значение 20 и на последующих проходах скрипта менять $var уже не будет.
DEFINE($var, 20) // начальное значение
LOGWRITE ($var)
INC($var,1)
WAITMS(500)
-
Спасибо. Сейчас сравнил лог после твоего скрипта, и моего :)
$var = 20
LOGWRITE ($var)
INC($var,1)
WAITMS(500)
Здесь в логе всегда 20 было, а в нижнем примере значение менялось на 1 после каждого прохода
DEFINE($var, 20) // начальное значение
LOGWRITE ($var)
INC($var,1)
WAITMS(500)
-
Всем привет подскажите как вставить в буфер сообщение из переменной?
пример:DEFINE ($Message, Всем удачи)
TOCLIP ("$Message")
LCLICK(81, 171)
WAIT(1)
KEYDOWN (#CTRL)
WAITMS (100)
KEYDOWN (#V)
WAITMS (100)
KEYUP (#V)
KEYUP (#CTRL)
WAIT(1)
LCLICK(626, 216)
WAIT(1)
В чате появилось $Message, а не значение переменной.
-
Всем привет подскажите как вставить в буфер сообщение из переменной?
[spoiler]
пример:DEFINE ($Message, Всем удачи)
TOCLIP ("$Message")
LCLICK(81, 171)
WAIT(1)
KEYDOWN (#CTRL)
WAITMS (100)
KEYDOWN (#V)
WAITMS (100)
KEYUP (#V)
KEYUP (#CTRL)
WAIT(1)
LCLICK(626, 216)
WAIT(1)
В чате появилось $Message, а не значение переменной.
Привет, у тебя просто кавычки не в тех местах где надо стоят.
DEFINE ($Message, "Всем удачи")
TOCLIP ($Message)
LCLICK(81, 171)
WAIT(1)
KEYDOWN (#CTRL)
WAITMS (100)
KEYDOWN (#V)
WAITMS (100)
KEYUP (#V)
KEYUP (#CTRL)
WAIT(1)
LCLICK(626, 216)
WAIT(1)
-
Спасибо большое :)
-
Всем доброй ночи ;D
Вопрос по синтаксису.
Как написать двойное условие в цикле WHILE?
Нужно что бы цикл выполнялся пока одно из двух условий не станет верным.
В справке к программе не нашел ответа(
Пример:
WHILE (($MG ! $maximumGain) | ($strengthening > $_time_t))
Бла Бла :)
END_CYC
этот цикл работает пока оба условия не выполнятся :)
как сделать что бы если одно из двух совпало цикл останавливался?
-
За место или надо и.
WHILE (($MG ! $maximumGain) & ($strengthening > $_time_t))
END_CYC
-
Всем привет. Еще один нубский вопрос)
Написал небольшой сценарий для игры с использованием двух потоков для проверки сплывающих окон.
кусок скрипта)
THREAD (KILL, 0)
#include "prog.cms"
ATTACK()
END_THREAD
GETSCREEN
IF_PIXEL_IN (784, 44,802, 59, 9095142)
LCLICK ($_return1, $_return2)
WAIT(5)
SetThread (KILL, 1)
END_IF
push:
WHILE (($p ! $fuckingPush) & ($r ! $errorConnectings))
GETSCREEN
$p = PXLCRC (461, 329, 498, 345)
$r = PXLCOUNT (246, 249, 322, 263, 14582784)
WAITMS (3000)
END_CYC
SetThread (KILL, 0)
IF ($p = $fuckingPush)
LCLICK (461, 329)
WAIT (3)
else
LCLICK (472, 384)
WAIT(40)
end_if
SetThread (KILL, 1)
goto(push)
У меня такой вопрос почему после того как всплывает сообщение, и поток становится на паузу с курсором на экране не чего не происходит? То есть программа работает как мне нужно всплывает окно поток встает на паузу, происходит клик для закрытия окна, программа работает дальше. НО почему то курсор находится в центре экрана неподвижно. В программе производятся клики по координатам, а в это время курсор неподвижно находится в центре экрана. До момента пока выскакивает пуш сообщение курсор передвигается по координатам, и визуально на экране это видно. После остановки, и запуска потока клики есть но их не видно)
может быть косяк в коде? я недавно начал вникать в написание алгоритмов для кликерман так что извините за нубизм, и много букв)
Хочу что бы все работало как часы подскажите где ошибка пожалуйста, или как без потоков можно реализовать проверку пуш сообщений?
-
SUB (ATTACK)
DEFINE ($active, 949237435)
DEFINE ($maximumGain, 3748378392)
DEFINE ($resetTimeout, 776058941)
WHILE ($AP ! $active)
GETSCREEN (215,387, 261,397)
$AP = PXLCRC (215,387, 260,396)
WAIT(1)
END_CYC
LCLICK(215,387)
WAIT(15)
DEFINE ($strengthening, $_time_t + 60)
WHILE (($MG ! $maximumGain) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
LCLICK (rnd (850, 930), rnd (544, 568))
WAITMS (rnd (1900, 2100))
END_CYC
DEFINE ($time, $_time_t + 2000)
WHILE($time > $_time_t)
GETSCREEN (635,290, 669,307)
$RT = PXLCRC (635,290, 668,306)
if ($RT ! $resetTimeout)
LCLICK(rnd(700, 800),rnd(220, 260))
WAIT(rnd (4, 6))
LCLICK(rnd(13, 113),rnd(550, 570))
WAIT(rnd (6, 8))
else
wait(1)
end_if
END_CYC
-
Строчки
DEFINE ($strengthening, $_time_t + 60)
DEFINE ($time, $_time_t + 2000)
сработают один раз пока нет таких переменных. При последующих проходах циклы уже не будут срабатывать.
Зачем делать подпрограммы и инклуды когда можно сразу вставить код в поток?
THREAD (KILL, 0)
DEFINE ($active, 949237435)
DEFINE ($maximumGain, 3748378392)
DEFINE ($resetTimeout, 776058941)
WHILE ($AP ! $active)
GETSCREEN (215,387, 261,397)
$AP = PXLCRC (215,387, 260,396)
WAIT(1)
END_CYC
LCLICK(215,387)
WAIT(15)
DEFINE ($strengthening, $_time_t + 60)
WHILE (($MG ! $maximumGain) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
LCLICK (rnd (850, 930), rnd (544, 568))
WAITMS (rnd (1900, 2100))
END_CYC
DEFINE ($time, $_time_t + 2000)
WHILE($time > $_time_t)
GETSCREEN (635,290, 669,307)
$RT = PXLCRC (635,290, 668,306)
if ($RT ! $resetTimeout)
LCLICK(rnd(700, 800),rnd(220, 260))
WAIT(rnd (4, 6))
LCLICK(rnd(13, 113),rnd(550, 570))
WAIT(rnd (6, 8))
else
wait(1)
end_if
END_CYC
END_THREAD
GETSCREEN
IF_PIXEL_IN (784, 44,802, 59, 9095142)
LCLICK ($_return1, $_return2)
WAIT(5)
SetThread (KILL, 1)
END_IF
push:
WHILE (($p ! $fuckingPush) & ($r ! $errorConnectings))
GETSCREEN
$p = PXLCRC (461, 329, 498, 345)
$r = PXLCOUNT (246, 249, 322, 263, 14582784)
WAITMS (3000)
END_CYC
SetThread (KILL, 0)
IF ($p = $fuckingPush)
LCLICK (461, 329)
WAIT (3)
else
LCLICK (472, 384)
WAIT(40)
end_if
SetThread (KILL, 1)
goto(push)
-
Спасибо. Инклюды, и сабы начал делать т.к в игре много разных событий и мне кажется что использовать подпрограммы удобно для некоторых из них ;D
-
DEFINE ($strengthening, $_time_t + 60)
WHILE (($MG ! $maximumGain) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
LCLICK (rnd (850, 930), rnd (544, 568))
WAITMS (rnd (1900, 2100))
END_CYC
Еще вопрос по этому циклу. Если во время цикла $MG = $maximumGain как сделать что бы не было кликов LCLICK (rnd (850, 930), rnd (544, 568))?
Пробовал сделать так:
DEFINE ($strengthening, $_time_t + 60)
WHILE (($MG ! $maximumGain) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
if ($MG ! $maximumGain)
LCLICK (rnd (850, 930), rnd (544, 568))
end_if
WAITMS (rnd (1900, 2100))
END_CYC
Но он клацает пока не занончится время >:(
-
Насколько я понял знак "|" в цикле WHILE означает что должны выполнится оба условия цикла.
Логика в том что есть таймер 60 сек, и шкала от 0% до 100% при клике по кнопке происходит или не происходит увеличение шкалы на 10%. То есть шкала может увеличится до 100% ( $MG = $maximumGain) за 40 сек, и что бы идти дальше нужно дождаться пока пройдет еще 20 сек. Также шкала может увеличится до 100% за 1 мин. 30 сек. и только после этого нужно идти дальше.
как я понял что DEFINE ($strengthening, $_time_t + 60) в этом случае означает что в переменной $strengthening присваивается значение текущего времени +60 сек, и условие ($strengthening > $_time_t) будет работать пока не пройдет 60 сек + еще один проход наверное?
Вопрос как сделать если шкала увеличится до 100% ( $MG = $maximumGain) за 40 сек что бы оставшиеся 20 сек не было кликов, а было просто ожидание пока закончится время?
-
Завтра этот код попробую
DEFINE ($strengthening, $_time_t + 60)
DEFINE ($str, 0)
DEFINE ($maximumGain, 3748378392)
WHILE (($str = 0) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
if ($MG = $maximumGain)
$str = 1
end_if
LCLICK (rnd (850, 930), rnd (544, 568))
WAITMS (rnd (1900, 2100))
END_CYC
-
Пипец :) запутался с легким условием :D
DEFINE ($strengthening, $_time_t + 60)
DEFINE ($str, 0)
DEFINE ($maximumGain, 3748378392)
WHILE (($str = 0) | ($strengthening > $_time_t))
GETSCREEN (786,545, 835, 564)
$MG = PXLCRC (786,545, 834, 563)
if ($MG ! $maximumGain)
LCLICK (rnd (850, 930), rnd (544, 568))
WAITMS (rnd (1900, 2100))
else
$str = 1
end_if
END_CYC
-
Кирил спасибо за ответ :)
попробуйте выполнить эти цыклы, и вы поймете где здесь "и" а где "или" :)
WHILE(($_time_h ! 11) | ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
/////////
WHILE(($_time_h ! 11) & ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
-
попробуйте выполнить эти цыклы, и вы поймете где здесь "и" а где "или" :)
WHILE(($_time_h ! 11) | ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
/////////
WHILE(($_time_h ! 11) & ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
А разве их значение меняется? :o
Как в справке написано, так и есть, неужели ты думаешь что логические операторы никто не использует и их нужно проверять?
В первом цикле ИЛИ, во тором И.
Только большинство попадают впросак, когда они используются в сложном условии когда проверяются операнды НЕ
-
в этом случае я точно знаю что подпрограмма старт запустится ровно в 11:50 допустим это будет или :)
WHILE(($_time_h ! 11) | ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
В этом случае подпрограмма старт запустится в 08:50, а может быть в 11:00 тогда это будет И :)
WHILE(($_time_h ! 11) & ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
-
Зачем ты путаешь людей?
| - это ИЛИ, & - это И
Как тебе лучше представлять это другое дело.
Условие у тебя сложное, там не один логический операнд и поэтому конечный итог это не то что даёт одиночный операнд хоть И, хоть ИЛИ.
А такими заявлениям ты сбиваешь с толку читающих тебя вновь прибывших. Которые будут уже В СВОЁМ условии отличном от твоего пытаться применить & как ИЛИ или наоборот.
И вообще называют выполнением условия то что находится в теле условия, а не то что произойдёт если это условие не выполнится.
Как ты будешь называть это? Когда выполнится твоя подпрограмма Start?
WHILE(($_time_h = 11) & ($_time_m = 50))
Start ( )
END_CYC
-
Извиняюсь если кого то попутал :) но я сам запутался в этом условии после прочтения справки.
Сейчас понял что в справке все норм написано:
Логическое И: (a & b) = 1 если и a = 1 и b = 1
Логическое ИЛИ: (a | b) = 1 если a = 1 или b = 1, или оба
-
Зачем ты путаешь людей?
| - это ИЛИ, & - это И
Как тебе лучше представлять это другое дело.
Условие у тебя сложное, там не один логический операнд и поэтому конечный итог это не то что даёт одиночный операнд хоть И, хоть ИЛИ.
А такими заявлениям ты сбиваешь с толку читающих тебя вновь прибывших. Которые будут уже В СВОЁМ условии отличном от твоего пытаться применить & как ИЛИ или наоборот.
И вообще называют выполнением условия то что находится в теле условия, а не то что произойдёт если это условие не выполнится.
Как ты будешь называть это? Когда выполнится твоя подпрограмма Start?
WHILE(($_time_h = 11) & ($_time_m = 50))
Start ( )
END_CYC
Vint спасибо тебе :) начинаю понимать что я вообще нуб по сравнению с вами :)
-
Можно ли использовать IF_PICTURE_IN с несколькими условиями? Представляется следующее:
IF_PICTURE_IN(IF_PICTURE_IN (0, 0, 600, 600, "1.bmp")) | (IF_PICTURE_IN (0, 0, 600, 600, "2.bmp"))
Методом проб и ошибок думается что нельзя, тогда как организовать конструкцию?
-
Можно ли использовать IF_PICTURE_IN с несколькими условиями?
Только так
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
LCLICK($_return1, $_return2)
WAITMS(100)
ELSE
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100)
LCLICK($_return1, $_return2)
WAITMS(100)
END_IF
END_IF
-
Только так
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
LCLICK($_return1, $_return2)
WAITMS(100)
ELSE
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100)
LCLICK($_return1, $_return2)
WAITMS(100)
END_IF
END_IF
Здесь уже нарушена логика,
Если
Тогда
Иначе
Тогда
Конец
Я же вижу результат таким образом:
Если (условие1) или (условие2)
Тогда
Конец
-
Здесь уже нарушена логика,
Где там че нарушено?
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
// если нашли 1.bmp выполняем код
ELSE // если не нашли 1.bmp
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100) // ищем 2.bmp
// если нашли 2.bmp выполняем код
END_IF
END_IF
Это и есть или 1 или 2
-
Хотя да, надо было кофе выпить) Спасибо за подсказку
-
Сортировка массива
Эти алгоритмы выстраивают числа в массиве от меньших к большему.
Простая сортировка
SUB(sort)
$siz = ARRSIZE($arr)
$srtcheck = 0
$srt = 0
FOR($a=$siz-1,($a>0)&($srt=0),-1)
FOR($b=0,$b<$a)
IF($arr[$b] > $arr[$b+1])
$srtcheck = 1
$tmp = $arr[$b]
$arr[$b] = $arr[$b+1]
$arr[$b+1] = $tmp
END_IF
END_CYC
IF($srtcheck = 0)
$srt = 1
END_IF
END_CYC
END_SUB
arrpush ($arr, 454)
arrpush ($arr, 66)
arrpush ($arr, 43)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 1)
LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr))
LOGWRITE ($arr[$i])
END_CYC
LOGWRITE ("")
sort()
LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr))
LOGWRITE ($arr[$i])
END_CYC
HALT
Парная сортировка (например сортировка координат) по первому числу
SUB(sort)
$siz = ARRSIZE($arr)
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
FOR($b=0,$b<$a,2)
IF($arr[$b] > $arr[$b+2])
$srtcheck = 1
$tmp = $arr[$b]
$tmp2 = $arr[$b+1]
$arr[$b] = $arr[$b+2]
$arr[$b+1] = $arr[$b+3]
$arr[$b+2] = $tmp
$arr[$b+3] = $tmp2
END_IF
END_CYC
IF($srtcheck = 0)
$srt = 1
END_IF
END_CYC
END_SUB
arrpush ($arr, 22)
arrpush ($arr, 66)
arrpush ($arr, 22)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 88)
arrpush ($arr, 201)
arrpush ($arr, 66)
arrpush ($arr, 201)
arrpush ($arr, 77)
arrpush ($arr, 201)
arrpush ($arr, 88)
arrpush ($arr, 10)
arrpush ($arr, 66)
arrpush ($arr, 10)
arrpush ($arr, 77)
arrpush ($arr, 10)
arrpush ($arr, 88)
LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr), 2)
LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC
LOGWRITE ("")
sort()
LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr), 2)
LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC
HALT
Парная сортировка по первому затем по второму числу
SUB(sort)
$siz = ARRSIZE($arr)
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
FOR($b=0,$b<$a,2)
IF($arr[$b] > $arr[$b+2])
$srtcheck = 1
$tmp = $arr[$b]
$tmp2 = $arr[$b+1]
$arr[$b] = $arr[$b+2]
$arr[$b+1] = $arr[$b+3]
$arr[$b+2] = $tmp
$arr[$b+3] = $tmp2
END_IF
END_CYC
IF($srtcheck = 0)
$srt = 1
END_IF
END_CYC
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
FOR($b=0,$b<$a,2)
IF($arr[$b] = $arr[$b+2])
IF($arr[$b+1] > $arr[$b+3])
$srtcheck = 1
$tmp = $arr[$b+1]
$tmp2 = $arr[$b+3]
$arr[$b+1] = $tmp2
$arr[$b+3] = $tmp
END_IF
END_IF
END_CYC
IF($srtcheck = 0)
$srt = 1
END_IF
END_CYC
END_SUB
arrpush ($arr, 22)
arrpush ($arr, 60)
arrpush ($arr, 22)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 88)
arrpush ($arr, 201)
arrpush ($arr, 66)
arrpush ($arr, 201)
arrpush ($arr, 30)
arrpush ($arr, 201)
arrpush ($arr, 88)
arrpush ($arr, 10)
arrpush ($arr, 66)
arrpush ($arr, 10)
arrpush ($arr, 77)
arrpush ($arr, 10)
arrpush ($arr, 28)
LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr), 2)
LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC
LOGWRITE ("")
sort()
LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr), 2)
LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC
HALT
-
Может кому пригодится.
Создание .bmp при клике mouse1
Клик в центр изображения и сохранится область выделенная желтым цветом
http://prntscr.com/98d965
if ( iskeydown(1)=1 )
GETSCREEN
//COLORMODE(6) // Стереть "//" чтоб включить
screenshotex($_xmouse,$_ymouse, $_xmouse+10,$_ymouse+10) //вывод скриншота в файл (текущее положение курсора +10 пикселей по x и y)
HINTPOPUP("Готово")
halt
END_IF
-
выстраивают числа в массиве от меньших к большему.
Простая сортировка
Не могу понять как отсортировать не числа, а именно те переменные , которые в момент очередного цикла опроса оказались в максимуме.
Например , я опросил ряд значений, присвоенных разным линиям графика. На "красное" выбрана переменная $a1 , "белое " выбрана переменная $a2 , "зеленое" выбрана переменная $a3 итп . 9 линий графика.
Вот графики https://cldmine.com/speedlog
В какой-то цикл опроса , максимальное значение принимает переменная у "красного" , в другом цикле максимальным становится "белое" итп
Как это отсортировать? Для того , чтобы вовремя переключать майнинг.
-
Для версии 4.11
SUB(max,$res, $n)
IF($res > $resMax)
$resMax = $res
$resMaxVar = $n
END_IF
END_SUB
$a1 = 10
$a2 = 100
$a3 = 300
$a4 = 20
$a5 = 10
$a6 = 34
$a7 = 56
$a8 = 25
$a9 = 1
max($a1,1)
max($a2,2)
max($a3,3)
max($a4,4)
max($a5,5)
max($a6,6)
max($a7,7)
max($a8,8)
max($a9,9)
LOGWRITE ($resMaxVar, "=",$resMax)
HALT
9:03:27 3=300
Для версии 4.12 уже проще
$a1 = 10
$a2 = 100
$a3 = 300
$a4 = 20
$a5 = 10
$a6 = 34
$a7 = 56
$a8 = 25
$a9 = 1
FOR($count=1,$count<10)
$res = GETVAR (STRCONCAT("$a", $count))
IF($res > $resMax)
$resMax = $res
$resMaxVar = STRCONCAT("$a", $count)
END_IF
END_CYC
LOGWRITE ($resMaxVar, "=",$resMax)
HALT
9:01:44 $a3=300
Если что вот полная сборка 4.12 версии
https://yadi.sk/d/rQnhKmxYprJcP (https://yadi.sk/d/rQnhKmxYprJcP)
-
А ещё проще увидев что нужно создавать серию переменных $a1....$a9, взять и создать один массив $a и работать с ним. На то они и массивы.
-
Развернуть окно на весь экран
Столкнулся с проблемой как корректно развернуть (maximize) окно. Кто-то уже отвечал на этот вопрос на форуме и посоветовал использовать WNDSETINFO($hwnd, 0,0, $_xmax,$_ymax), но это не "честный" maximize, и это не будет работать в случае мульти-мониторов (ну точнее это будет работать, но совсем не так как вы предполагали :)) )
Нашел как сделать "честный" maximize:
POSTMESSAGE($_hwnd, 0x0112, 0xF030, 0) // Развернуть окно на весь экран
где
0x0112 это WM_SYSCOMMAND
0xF030 это SC_MAXIMIZE
(Если нужен minimize, то - 0xF020 это SC_MINIMIZE)
Работает идеально у меня на версии кликерманна 4.12, ОС: Win10 x64
Может кому пригодится..
-
Заметь, что должна быть включена английская раскладка.
Нельзя ли процедуру переключения раскладки поручить самой программе, или хотя бы дать понять пользователю , что у него раскладка не та?
Попробовал скрестить два учебный скрпта.
// 12.01.2017 6
#name "Запись в блокнот"//Имя нашего скрипта
EXECUTE("notepad.exe")//Запускаем программу notepad.exe. Команда EXECUTE равносильна окну "Выполнить" в Виндовс (Win+R).
WNDSTATE(WNDFIND("Блокнот"), 1)//Разворачиваем окно в заголовке которого есть строка "Блокнот". 1 - означает развернуть, 0 - свернуть.
WAITMS(1000)//Ждем чтобы блокнот окончательно запустился. 500 мс достаточно
//--------------------
$hwnd1 = wndfind("Clickermann -") // получаем HWND окна кликера
$hwnd2 = wndfind("Блокнот") // получаем HWND окна Блокнота
SETKBLAYOUT($hwnd1, 1033) // устанавливаем английскую раскладку для окон
SETKBLAYOUT($hwnd2, 1033)
print ($hwnd1) // добавил для контроля
print ($hwnd2)
//или
// SETKBLAYOUT($hwnd1, 1049) // устанавливаем русскую раскладку для окон
// SETKBLAYOUT($hwnd2, 1049)
//--------------------
FOR($i, $i < 2)//Начало цикла. Цифра 5 означает что цикл повторится 5 раз
KEYSTRING("The quick brown fox jumps over the lazy dog.", 20)//Вводим текст. 20 означает задержку в 20 мс между вводом каждой буквы
KEYPRESS(#ENTER)//Нажимаем Enter чтобы перевести строку. #ENTER - код клавиши Enter
END_CYC//Заканчиваем цикл
HALT//Останавливаем скрипт
Тело взял тут, а вставку между // ------------ отсюда:
http://crapware.aidf.org/forum/index.php?topic=382.msg3092#msg3092
Ну и русскую раскладку закомментил, понятное дело.
Первоначальный код установки раскладки, тот, что по ссылке, прекрасно работает отдельно. Но будучи вставленным внутрь кода "Запись блокнота" перестаёт работать нормально, т.е. переключает только кликермена, а блокнот остаётся в русской раскладке. Более того, $hwnd2 оказывается равен $hwnd1 и возвращает значение кликермена.
Но всё заработало, когда в
$hwnd2 = wndfind("Блокнот")
вместо "Блокнот" я написал "Безымянный".
Как-то оно странно...
-
Как-то оно странно...
Ничего странного. Функция WNDFIND возвращает hwnd первого попавшегося окна в заголовке которого присутствует слово "блокнот". Можно использовать дополнительный параметр для поиска слов от начала, читай справку.
-
Функция WNDFIND возвращает hwnd первого попавшегося окна в заголовке которого присутствует слово "блокнот".
ОК, спасибо!
Но в окне кликермана вроде ничего про блокнот нету...
Кроме названия "Блокнот.cms" ;)
Оно?
Нет. Поменял название .cms — ничего не изменилось. Где там "блокнот" у кликермана?
От я ж слепошарый! Во первых строках кода!
Поменял на
#name "Запись в notepad"//Имя нашего скрипта
и всё заработало.
Ещё раз спасибо!
-
Скриншот(окна)
#name "Get Screenshot"
HSET(12345,0)
$h=WNDFIND ("Блокнот") //название окна (при скриншоте должно быть активным, разумеется)
wndgetinfo($h, $var1, $var2, $var3, $var4)
$x1=$var1
$y1=$var2
$x2=$x1+$var3
$y2=$y1+$var4
waitms(100)
IF(iskeydown(#PAGEDOWN)=1) //пока нажат #PAGEDOWN делает скриншотики
GETSCREEN($x1,$y1,$x2,$y2)
COLORMODE(6,$x1,$y1,$x2,$y2)
SCREENSHOTEX($x1,$y1,$x2,$y2, "Image_",0)
// HINTPOPUP("saved")
waitms(250)
END_IF
-
Скриншот окна под курсором
#name "Get Screenshot"
IF(ISKEYDOWN(#CTRL)=1) // при нажатии CTRL делаем скриншот
WHILE(ISKEYDOWN(#CTRL)=1)
WAITMS(5)
END_CYC
WNDGETINFO(HGET($_xmouse,$_ymouse), $x,$y, $sizx,$sizy)
WAITMS(50)
GETSCREEN
COLORMODE(6)
SCREENSHOTEX($x,$y, $x+$sizx,$y+$sizy, "Image_",0)
WAITMS(20)
ELSE
WAITMS(20)
END_IF
-
Ближайшая к заданным координатам/центру картинка:
#name "Ближайшая к заданным координатам/центру картинка"
// Author: Vint
// Version: 1.0 (14.10.2013)
// цель
$Xtarget = 500
$Ytarget = 500
// цель - центр экрана
//$Xtarget = ($_xmax+1) / 2
//$Ytarget = ($_ymax+1) / 2
GETSCREEN(0,0, $_xmax,$_ymax)
SCANPICTURE($scan, 0,0, $_xmax,$_ymax, "picture.bmp", -1, 100)
$dist = 10000
$scan_size = ARRSIZE($scan)
FOR($i=0, $i < $scan_size, 2)
$X = $scan[$i]
$Y = $scan[$i+1]
$d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
IF($d_temp < $dist)
$dist = $d_temp
$Xdot_target = $X
$Ydot_target = $Y
END_IF
IF($Y > ($Ytarget + $dist))
$i = $scan_size
END_IF
END_CYC
UNDEFINE($scan)
IF($dist ! 10000)
LOGWRITE ("Ближайшая картинка к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
ELSE
LOGWRITE ("Картинка не найдена")
END_IF
HALT
Ближайший к заданным координатам пиксель:
#name "Ближайший к заданным координатам пиксель"
// цель
$Xtarget = 500
$Ytarget = 500
GETSCREEN
SCANPXL($scan, 0,0, $_xmax,$_ymax, 255)
$dist = 10000
$scan_size = ARRSIZE($scan)
FOR($i=0, $i < $scan_size, 2)
$X = $scan[$i]
$Y = $scan[$i+1]
$d_temp = DIST($Xtarget, $Ytarget, $X, $Y)
IF($d_temp < $dist)
$dist = $d_temp
$Xdot_target = $X
$Ydot_target = $Y
END_IF
IF($Y > ($Ytarget + $dist))
$i = $scan_size
END_IF
END_CYC
UNDEFINE($scan)
IF($dist ! 10000)
LOGWRITE ("Ближайший пиксель к заданным координатам X/Y: ", $Xdot_target, " / ", $Ydot_target)
ELSE
LOGWRITE ("Заданный цвет не найден")
END_IF
HALT
А то периодически всплывает.
P.S. 04.09.2018 исправлена опечатка.
-
Развернуть окно на весь экран
Столкнулся с проблемой как корректно развернуть (maximize) окно. Кто-то уже отвечал на этот вопрос на форуме и посоветовал использовать WNDSETINFO($hwnd, 0,0, $_xmax,$_ymax), но это не "честный" maximize, и это не будет работать в случае мульти-мониторов (ну точнее это будет работать, но совсем не так как вы предполагали :)) )
Нашел как сделать "честный" maximize:
POSTMESSAGE($_hwnd, 0x0112, 0xF030, 0) // Развернуть окно на весь экран
где
0x0112 это WM_SYSCOMMAND
0xF030 это SC_MAXIMIZE
(Если нужен minimize, то - 0xF020 это SC_MINIMIZE)
Работает идеально у меня на версии кликерманна 4.12, ОС: Win10 x64
Может кому пригодится..
Погасить экран монитора
(иногда полезно ставить перед HALT)
SendMessage(0xFFFF, 0x0112, 0xF170, 2) //Погасить экран монитора
HWND_BROADCAST = 0xFFFF
WM_SYSCOMMAND = 0x0112
SC_MONITORPOWER = 0xF170
lParam Описание
-1 Переводит монитор в нормальный, рабочий режим
0 Переводит монитор в режим "легкого" засыпания
1 Переводит монитор в спящий режим
2 Монитор выключается
(у меня на Windows 8.1 работает только "2").
Включить экран - движение мышкой.
-
Было бы неплохо дописать в пост "Скрипт выполняет действия в разные промежутки времени" ещё выполнение действий в заданное время. К примеру нужно мне в 7:00, 14:00 и 19:00 выполнить что-то.
if(($_time_h=14)&($_time_m=00) ^ ($_time_h=7)&($_time_m=00) ^ ($_time_h=21)&($_time_m=00))
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
Хотя мне кажется, что если попытаться моим кодом сделать в 7:30, 14:00 и 19:20, то он будет и в 7:00 и в 7:20 и в 7:30 действие повторять, хотя и не проверял..
Или к примеру если каждый час нужно выполнять, то:
if(($_time_m=00)) //вместо 00 ставим свои минуты в которые выполнять
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
Можно конечно так же написать действие раз в минуту, но если действие длится дольше минуты то не получится.
-
Исправление ошибок
IF((($_time_h=14)&($_time_m=0)) | (($_time_h=7)&($_time_m=0)) | (($_time_h=21)&($_time_m=0)))
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
IF($_time_m=0) //вместо 00 ставим свои минуты в которые выполнять
BEEP(500,500) //своё действие
ELSE
WAIT(1)
END_IF
-
Исправление ошибок
Спасибо=) Теперь буду знать как это пишется правильно.
-
Клик в глобальных координатах без перемещения. LCLICK без MOVE.
SUB(only_lclick, $olclx, $olcly)
$olcl_hwnd = HGET($olclx, $olcly)
WNDGETINFO($olcl_hwnd, $olcl_wx, $olcl_wy, $olcl_w, $olcl_h)
LOGWRITE($olcl_wx, " ", $olcl_wy)
$olclx = $olclx - $olcl_wx
$olcly = $olcly - $olcl_wy
LOGWRITE($olclx, " ", $olcly)
POSTMESSAGE($olcl_hwnd, 0x0201, 0x0001,$olclx+($olcly*65536)) //LDOWN
WAITMS(30)
POSTMESSAGE($olcl_hwnd, 0x0202, 0x0001,$olclx+($olcly*65536)) //LUP
END_SUB
// Lclick в глобальных координатах 253, 365
only_lclick(253, 365)
HALT
При необходимости можно доработать, сделать переключатель локальные/глобальные координаты. Передавать в ПП задержку между нажатием-отпусканием.
-
ШИКАРНЫЙ (и достаточно простой) симулятор человеческого движения мыши WindMouse.
Адаптировано под Clickermann отсюда: https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
Менять скорость параметром $m0, скорость ветра $w0, расстояние замедления перед остановкой $d0, гравитацию - $g0
// Mouse movement that's affected by gravity and wind physics laws
// https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
sub(hyp, $A, $B)
$R1 = round(sqrt($A*$A + $B*$B), 0)
end_sub
sub(min, $A, $B)
if($A > $B)
$R1 = $B
else
$R1 = $A
end_if
end_sub
sub(rand, $A, $B, $round) // если round=1, округляет результат
$rand = rnd(0, 1000000)
$rnd = $A + ($B - $A)*$rand/1000000
if($round = 1)
$rnd = round($rnd, 0)
end_if
end_sub
sub(mouse_init)
$SQRT3 = sqrt(3)
$SQRT5 = sqrt(5)
$cX = $_xmouse
$cY = $_ymouse
$mDist = round(dist($cX, $cY, $eX, $eY), 0) + 1
// скорости по осям X и Y
$vX = 0
$vY = 0
$vMag = 0
$wX = 0
$wY = 0
$wMag = 0
$tMMax = $_time_t + rnd(4,6)
rand(8,9,0)
$g0 = $rnd // magnitude of the gravitational force (влияет на амплитуду волны)
rand(0,100,0)
if($rnd < 10) // в 10% сильный ветер
rand(2,4,0)
$w0 = $rnd // magnitude of the wind force fluctuations (влияет на длину волны)
else
rand(0.8,2,0)
$w0 = $rnd
end_if
rand(15,25,0)
$m0 = $rnd // maximum mouse_step size (velocity clip threshold) (влияет на скорость волны)
rand(2,8,0)
$d0 = $rnd // distance where wind behavior changes from random to damped (влияет на затухание волны)
end_sub
sub(mouse_step) // считает скорость по осям X и Y, вычисляет координаты следующего шаг
min($m0, $mDist)
$m0 = $R1
min($w0, $mDist) // чтобы не перепрыгнуть цель
$wMag = $R1
if($mDist > $d0)
rand(-$wMag, $wMag, 0)
$wX = $wX / $SQRT3 + $rnd / $SQRT5
rand(-$wMag, $wMag, 0)
$wY = $wY / $SQRT3 + $rnd / $SQRT5
else
$wX = $wX / $SQRT3
$wY = $wY / $SQRT3
if($m0 < 1)
$m0 = 1
else
if($m0 > 2) // чтобы замедлиться перед остановкой
$m0 = $m0 / $SQRT3
end_if
end_if
end_if
// "ветер" и "гравитация" влияют на скорость мыши по осям
$vX = $vX + $wX + $g0 * ($eX - $cX)/$mDist
$vY = $vY + $wY + $g0 * ($eY - $cY)/$mDist
hyp($vX, $vY)
$vMag = $R1
if($vMag > $m0) // чтобы не перепрыгнуть цель
rand(0,$m0,0)
$vClip = $m0/2 + $rnd/2
$vX = ($vX/$vMag) * $vClip
rand(0,$m0,0)
$vClip = $m0/2 + $rnd/2
$vY = ($vY/$vMag) * $vClip
end_if
$mX = round($cX + $vX, 0) // where to move
min($mX, $_xmax)
max($R1, 0)
$mX = $R1
$mY = round($cY + $vY, 0)
min($mY, $_ymax)
max($R1, 0)
$mY = $R1
if(($cX != $mX) or ($cY != $mY))
move($mX, $mY)
$cX = $_xmouse
$cY = $_ymouse
end_if
end_sub
sub(wind_mouse, $eX, $eY, $wMin, $wMax)
mouse_init()
while(($mDist > 2) and ($_time_t < $tMMax)) // разброс вокруг цели <= 3
mouse_step()
$mDist = round(dist($cX, $cY, $eX, $eY), 0)
end_cyc
waitms(rnd($wMin,$wMax))
end_sub
Чтобы протестировать, откройте на весь экран Paint, выберите кисть и запустите данный скрипт:
sub(move_rand)
$m_x = rnd(200, $_xmax-200)
$m_y = rnd(200, $_ymax-200)
wind_mouse($m_x, $m_y, 500, 1500)
end_sub
move_rand()
lclick($_xmouse, $_ymouse)
waitms(100)
ldown($_xmouse, $_ymouse)
for($rmove = 0, $rmove < 10)
move_rand()
end_cyc
lup($_xmouse, $_ymouse)
halt()
Если попытаться сдвинуть курсор во время исполнения скрипта, получится интересный узор :)
-
ШИКАРНЫЙ (и достаточно простой) симулятор человеческого движения мыши WindMouse.
Адаптировано под Clickermann отсюда: https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
Там по ссылке очень много не понятного текста и столько же ссылок. Ты бы точно сказал что качать, и если какие-то нюансы по запуску, то тоже не хотелось бы самому разбираться.
-
ШИКАРНЫЙ (и достаточно простой) симулятор человеческого движения мыши WindMouse.
Адаптировано под Clickermann отсюда: https://ben.land/post/2021/04/25/windmouse-human-mouse-movement/
Там по ссылке очень много не понятного текста и столько же ссылок. Ты бы точно сказал что качать, и если какие-то нюансы по запуску, то тоже не хотелось бы самому разбираться.
Прикрепил код Clickermann ;)
-
А, то есть это там уже весь алгоритм в коде? Я и не посмотрел. Думал там типа прога какая-то. Кстати вот тут http://crapware.aidf.org/forum/index.php?topic=2112.0 когда-то разбирали варианты по реалистичности, чтоб не было путаницы по темам, можно туда и этот вариант. Еще по безье тоже есть тема http://crapware.aidf.org/forum/index.php?topic=5442.0 тоже красиво.
Я правильно вызываю?
LDOWN(500,500)
wind_mouse(1500,500, 500, 1500)
LUP($_xmouse,$_ymouse)
Выходит вот так если карандашом. Красиво, но наверно нужно допилить. Видно что в каких то моментах курсор дергает назад.
(https://i.imgur.com/I4GyFaU.png)
Вопросы:
1. как скорость менять
2. что за параметры $wMin, $wMax
3. и еще, почему задержка какая-то после выполнения, курсор уже на месте, а он чето ждет
-
Выходит вот так если карандашом. Красиво, но наверно нужно допилить. Видно что в каких то моментах курсор дергает назад.
(https://i.imgur.com/I4GyFaU.png)
Вопросы:
1. как скорость менять
2. что за параметры $wMin, $wMax
3. и еще, почему задержка какая-то после выполнения, курсор уже на месте, а он чето ждет
Да, это простенький алгоритм, мне показался лучше выложенных в этой теме ранее, поэтому решил поделиться) $wMin и $wMax - мин/макс задержка после достижения цели, не хочешь задержку - ставь 0,0).
Сейчас допиливаю нормальный вариант, с выбором скорости и более плавным движением.
(https://i.imgur.com/cjtYsee.gif)
-
Самый первый вариант мне нравится больше.
(https://i.ibb.co/BBwVMZ1/Free.png) (https://ibb.co/2d574tb)
Сейчас очень медленно и сильный разброс параметров от линии к линии, не думаю, что это лучше, особенно концевые разбросы.
P.S. Код почти по PEP8
-
Самый первый вариант мне нравится больше.
(https://i.ibb.co/BBwVMZ1/Free.png) (https://ibb.co/2d574tb)
Сейчас очень медленно и сильный разброс параметров от линии к линии, не думаю, что это лучше, особенно концевые разбросы.
P.S. Код почти по PEP8
Немного ускорил, убрал сильный разброс(хотя мне больше нравилось так имитации человеческого движения), менять максимальную скорость параметром $m0, скорость ветра $w0, расстояние замедления перед остановкой $d0, гравитацию - $g0