Author Topic: Ожидание, пока не нажата определенная клавиша  (Read 2594 times)

0 Members and 1 Guest are viewing this topic.

Belogv

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Здравствуйте!
Пожалуйста, подскажите код, который вызывает бесконечную паузу в программе, пока будет не нажата определенная горячая клавиша (например, Alt+D).

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
...будет не нажата...
Сложно это понять.
Предполагаю что так.
Code: (clickermann) [Select]
WHILE(ISKEYDOWN(#ALT)=0)
   WHILE(ISKEYDOWN(#D)=0)
      WAITMS(50)
   END_CYC
   WAITMS(50)
END_CYC
//  действия
HALT
« Last Edit: August 21, 2017, 01:39:03 PM by open_78 »

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Предполагаю что так.

Полагаю, что можно ещё и проверить другие модификаторы (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!
« Last Edit: August 23, 2017, 05:59:24 PM by Cleoss »

open_78

  • Активный участник
  • ***
  • Posts: 285
  • v4.13.014 x64
    • View Profile
Полагаю, что можно ещё и проверить другие модификаторы (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
Каким образом твой пример...
...вызывает бесконечную паузу в программе...
? ? ?

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
Хотел написать скриптец (для пробегания курсора по всему экрану и определения ссылок), но как всегда стало на полпути:

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% точно определить размеры кнопок, а также место найденной координаты на кнопке и использовать эти данные для рандомных кликов

Ещё по ходу, чтобы реализовать данным алгоритмом круговой обход экрана мышью, имхо легче воспользоваться выводом в рисунок на экран (для пущей наглядности), чем выводом конкретных координат в текстовый файл (как я реализовал). Как раз отпадёт необходимость группировки соседних результатов в один грид, плюс рисунок будет меньше текста и его мона будет закрепить поверх окон в маленьком окошке сбоку либо даже сделать полупрозрачным и вывести на весь экран, а потом с помощью отдельного софта сделать, чтоб клики проходили сквозь этот рисунок.
« Last Edit: August 22, 2017, 06:07:31 PM by Cleoss »

Cleoss

  • Активный участник
  • ***
  • Posts: 260
  • Автоматизируй это!
    • View Profile
И кстати, вот листинг инклуда 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"
« Last Edit: August 22, 2017, 05:56:09 PM by Cleoss »