Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Belogv on August 21, 2017, 01:22:31 PM

Title: Ожидание, пока не нажата определенная клавиша
Post by: Belogv on August 21, 2017, 01:22:31 PM
Здравствуйте!
Пожалуйста, подскажите код, который вызывает бесконечную паузу в программе, пока будет не нажата определенная горячая клавиша (например, Alt+D).
Title: Re: Ожидание, пока не нажата определенная клавиша
Post by: open_78 on August 21, 2017, 01:37:18 PM
...будет не нажата...
Сложно это понять.
Предполагаю что так.
Code: (clickermann) [Select]
WHILE(ISKEYDOWN(#ALT)=0)
   WHILE(ISKEYDOWN(#D)=0)
      WAITMS(50)
   END_CYC
   WAITMS(50)
END_CYC
//  действия
HALT
Title: Re: Ожидание, пока не нажата определенная клавиша
Post by: Cleoss on August 22, 2017, 12:45:57 PM
Предполагаю что так.

Полагаю, что можно ещё и проверить другие модификаторы (ctrl/shift/win) на зажатость. Если это хоткей и надо делать действия когда клавиши Alt+D нажаты, то так:
Code: (clickermann) [Select]
WHILE(ISKEYDOWN(#ALT)=1)
   if((ISKEYDOWN(#D)=1)&(iskeydown(#ctrl)=0) & (iskeydown(#win)=0) & (iskeydown(#shift)=0))
      WAITMS(100)
      //  действия тут
   END_if
   WAITMS(30)
END_CYC
HALT


Если нужно наоборот делать действия в то время, когда одна клавиша НЕ нажата (например, пока не нажата та же клавиша D из примера выше), то просто меняем состояние ISKEYDOWN(#KEY) с единицы на ноль:

Code: [Select]
while(1)
   if((ISKEYDOWN(#D)=0))
      WAITMS(100) // пауза после нажатия, чтоб не выполнять действия слишком часто при зажатой кнопке
      // сами действия туточки
   END_if
   WAITMS(30) // проверка нажатия каждые 30 мс
end_cyc
// можно и убрать останавливающий HALT, если в скрипте больше не выполняется никаких действий, проверок и циклов



P. S. Ах да, проверочная конструкция IF закрывается с помощью END_IF, а цикл WHILE закрывается с помощью END_CYC.
Не путаем END_IF в коде с END_CYC!
Title: Re: Ожидание, пока не нажата определенная клавиша
Post by: open_78 on August 22, 2017, 05:41:39 PM
Полагаю, что можно ещё и проверить другие модификаторы (ctrl/shift/win) на зажатость. Если это хоткей и надо делать действия когда клавиши Alt+D нажаты, то так:
Code: (clickermann) [Select]
WHILE(ISKEYDOWN(#ALT)=1)
   if((ISKEYDOWN(#D)=1)&(iskeydown(#ctrl)=0) & (iskeydown(#win)=0) & (iskeydown(#shift)=0))
      WAITMS(100)
      //  действия тут
   END_if
   WAITMS(30)
END_CYC
HALT
Каким образом твой пример...
...вызывает бесконечную паузу в программе...
? ? ?
Title: Re: Ожидание, пока не нажата определенная клавиша
Post by: Cleoss on August 22, 2017, 05:44:19 PM
Хотел написать скриптец (для пробегания курсора по всему экрану и определения ссылок), но как всегда стало на полпути:

Code: (clickermann) [Select]
#include "mposback.cms"
#name "cursorz"
//getscreen
//wait(1)
//getscreen
// тест погрешностей, ограничение области,

mpos()
define($pts)
define($init)
if ($init=0)
   logclear
/ TFClear("cursorz.txt")
   inc($init)
end_if
/define($strokax="")
$strokax=""
$pauza=20
//$pause="100"
$tm=$_ms

$xn=0 // Задаём область и шаг поиска указателей курсора
$yn=100 // 0,100, $_xmax,$_ymax-120
$wn=$_xmax
$hn=$_ymax-120
$stepping=20

for($xx=$xn, $xx < ($wn+($stepping*2)), $stepping)
move($xx,130)
define($prev)
define($cur,339)
$prev=$cur
$cur=$_cursor
if (($cur!3)&($cur!5)&($cur!7)) // Перечень фильтруемых указателей
inc($pts)
if ($strokax="")
//$strokax=strconcat($pauza,"ms at Ln130: ",$xx,"=",$_cursor)
$strokax=strconcat($pauza,"ms at Ln130: ",$xx)
print("###")
/print($xx,"=",$_cursor)
else
if($prev=339)
//$strokax=strconcat($strokax,",",$xx,"=",$_cursor)
$strokax=strconcat($strokax,",",$xx)
/print($xx,"=",$_cursor)
else
if($prev=$cur)
$strokax=strconcat($strokax,",",$xx)

else
$strokax=strconcat($strokax,"=",$_cursor-$stepping,",",$xx,"=",$_cursor)

end_if
end_if
end_if
end_if
WAITMS($pauza)
end_cyc

$time=round((($_ms-$tm)/1000),-3)
TFWrite("cursorz.txt", strconcat($time,"s for ",$pts," pts on delay ",$strokax))
print("Result: ", $time,"s per ",$pts,"pts for delay ",$pauza,"ms at Line 130 ")
wait(1)
execute("cursorz.txt")
wait(1)
keydown(#ctrl)
keypress(#end)
keyup(#ctrl)

mback()
halt


Пока что не получилось организовать группировку стоящих рядом одинаковых курсоров в один диапазон на выходе. В скрипте ясно что не хватает второго включённого цикла, который будет пробегать вдоль оси игреков, не по строкам, а по столбцам, не делал вложенного цикла поскольку.. Также сперва проделал тесты, которые показали, что для менее-более адекватного и правильного определения количества встречающихся ТОЛЬКО в одной строке курсоров требуется как минимум пара мс (а лучше 10+ миллисекунд), то есть всего лишь на один экран будет уходить до минуты (при FullHD, хотя дело можно поправить незначительно сужением зоны поиска). Как по мне, способ весьма времезатратный. Скрипт задумывался как реализация ответа на теоретическую выкладку Золотого:

можно написать скрипт автоматически определяющий размеры найденных кнопок. Кнопки при наведениии курсора видоизменяются сами или видоизменяют курсор, перемещая курсор по четырём векторам, от найденного пикселя и отслеживая код курсора и цвет пикселей под курсором до наведения и после можно 100% точно определить размеры кнопок, а также место найденной координаты на кнопке и использовать эти данные для рандомных кликов

Ещё по ходу, чтобы реализовать данным алгоритмом круговой обход экрана мышью, имхо легче воспользоваться выводом в рисунок на экран (для пущей наглядности), чем выводом конкретных координат в текстовый файл (как я реализовал). Как раз отпадёт необходимость группировки соседних результатов в один грид, плюс рисунок будет меньше текста и его мона будет закрепить поверх окон в маленьком окошке сбоку либо даже сделать полупрозрачным и вывести на весь экран, а потом с помощью отдельного софта сделать, чтоб клики проходили сквозь этот рисунок.
Title: Re: Ожидание, пока не нажата определенная клавиша
Post by: Cleoss on August 22, 2017, 05:49:10 PM
И кстати, вот листинг инклуда mposback.cms, с помощью которого можно быстро двумя строками вернуть мышь на изначальную позицию:

Code: [Select]
sub(mpos)
$xmcoordt=$_xmouse
$ymcoordt=$_ymouse
iniwrite("mpos.ini", "x", $xmcoordt)
iniwrite("mpos.ini", "y", $ymcoordt)
/waitms(200)
end_sub
sub(mback)
$xmcoordt=iniread("mpos.ini", "x")
$ymcoordt=iniread("mpos.ini", "y")
move($xmcoordt,$ymcoordt)
end_sub

Для этого в том месте, куда надо вернуть мышь, ставим mpos() для определения местонахождения курсора, а позже в скрипте вызываем mback() для возврата курсора назад.

Сам инклуд подключаем через строку в начале своего скрипта:
Code: (clickermann) [Select]
#include "mposback.cms"