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

Основной раздел => Общие вопросы => Topic started by: vasyapro on October 09, 2016, 03:33:59 PM

Title: Разница между L(R)Down и KeyDown
Post by: vasyapro on October 09, 2016, 03:33:59 PM
Уже давно пользуюсь фичей зажатия клавиш мышки с помощью одноразового однострочного скрипта. После выполнения клавиша мышки остаётся зажатой, а пальца на мышке нету. Полезно когда надо долго держать, и пальцы не устают. А если надо отжать, то достаточно вручную нажать клавишу и она отожмется.
Понадобилось сделать то же самое с клавишами на клавиатуре, но не работает.
Code: [Select]
waitms(500) //что бы не среагировало на хокей запуска
getkeysdown($arr) //не знаю как отреагирует кликер на проверку в while если $arr до этого не объявлена
While($arr ! 0) //не for потому что $arr = $arr[0], а я всё равно лишь одну кнопку буду нажимать
 getkeysdown($arr)
end_cyc
wait(1) //что бы успел отжать клавишу
keydown($arr)
Вообще никакой реакции от KeyDown, даже если добавить в конце wait(1). Print($arr) в конце выдаст нормальный код клавиши.
Title: Re: Разница между L(R)Down и KeyDown
Post by: Oraven on October 09, 2016, 04:13:56 PM
Задержки в цикле были бы не лишними, а то кликер будет напрягать процессор по чем зря. 20 мс вполне достаточно.
Объявлять переменные в кликермане не требуется, он сам это сделает при необходимости.

У тебя происходит зажатие после чего скрипт начинается за ново и функция видит зажатую клавишу, цикл пропускается и клавиша снова зажимается, вот такая круговерть. Для отключения зажатия по любому придется использовать какую то другую клавишу.

вот рабочий скрипт
Code: (clickermann) [Select]
WAITMS(500) // пауза чтоб не сработал на клавиши запуска

WHILE(1) // бесконечный цикл
   GETKEYSDOWN($keys) // анализ зажатых клавиш
   IF(ARRSIZE($keys) > 0) // если массив не пуст
      IF(($keys[0]!#ESC)&($keys[0]!1)&($keys[0]!2)&($keys[0]!3)) // здесь исключаем некоторые клавиши (ESC и клавиши мыши)
         BEEP(1000,200) // сигналим (необязательно)
         
         WHILE(ISKEYDOWN($keys[0])=1) // ждем пока клавишу отпустят
            WAITMS(5)
         END_CYC     
         
         KEYDOWN($keys[0]) // зажимаем эту клавишу
         
         WHILE(ISKEYDOWN(#ESC)=0) // отпускание поставим на клавишу ESC (ждем нажатия)
            WAITMS(20)
         END_CYC
         WAITMS(300)
         
         KEYUP($keys[0]) // отпускаем 
         
         BEEP(800,200) // сигналим (необязательно)
      END_IF
   END_IF
   WAITMS(20) // общая задержка для разгрузки процессора
END_CYC
Title: Re: Разница между L(R)Down и KeyDown
Post by: vasyapro on October 09, 2016, 04:41:17 PM
Вы не так меня поняли. Скрипт выполняется лишь один раз, что бы отправить в систему сообщение о том, что клавиша была зажата, а сообщения о отжатии нету, в результате чего клавиша остаётся зажатой всегда. После этого скрипт заканчивается и про кликер мы забываем. При ручном нажатии в систему опять отправляется сообщение о том, что клавишу зажали(но она была зажата кликером до этого, так что ничего не меняется), а вот при ручном отжатии клавиша наконец то вырубается.
Суть в том, что при использовании L(R)Down такой подход работает, а вот с KeyDown нет. То есть, скрипт состоящий из одной строки:
Code: [Select]
LDown($_xmouse,$_ymouse)выполненный лишь один раз зажимает ЛКМ до тех пор, пока она не будет нажата и отжата вручную. А вот этот код:
Code: [Select]
KeyDown(#A)такого результата не даст. В блокноте будет лишь одна буква А.



Quote
Задержки в цикле были бы не лишними, а то кликер будет напрягать процессор по чем зря. 20 мс вполне достаточно.
Скрипт на три секунды максимум, сомневаюсь что процессор сгорит за это время.
Quote
Объявлять переменные в кликермане не требуется, он сам это сделает при необходимости.
Будет ли переменная объявленная кликером в условии равна нулю?
Title: Re: Разница между L(R)Down и KeyDown
Post by: Oraven on October 09, 2016, 05:01:03 PM
В старых версиях кликер действительно не отжимал зажатые в ходе выполнения клавиши. Теперь при остановке он отжимает все клавиши клавиатуры чтобы не осталось залипших клавиш. Странно что это не относится к мыши.

Переменная объявляется с 0 об этом написано в справке.




Title: Re: Разница между L(R)Down и KeyDown
Post by: vasyapro on October 09, 2016, 05:04:10 PM
Чёрт. То есть я всё это время использовал баг и случайно репортнул его?
Title: Re: Разница между L(R)Down и KeyDown
Post by: Oraven on October 09, 2016, 05:11:46 PM
Code: [Select]
KeyDown(#A)такого результата не даст. В блокноте будет лишь одна буква А.

При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.
Title: Re: Разница между L(R)Down и KeyDown
Post by: Oraven on October 09, 2016, 05:12:36 PM
Чёрт. То есть я всё это время использовал баг и случайно репортнул его?
Ну не баг а скорее недоработка.
Title: Re: Разница между L(R)Down и KeyDown
Post by: vasyapro on October 09, 2016, 05:44:00 PM
При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.
Какой тогда вообще смысл в KeyDown?
Title: Re: Разница между L(R)Down и KeyDown
Post by: Oraven on October 09, 2016, 06:27:02 PM
При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.
Какой тогда вообще смысл в KeyDown?

Ну например в игре KeyDown(#W) заставит персонажа бежать вперед.
А для повторения команд есть цикл For
Title: Re: Разница между L(R)Down и KeyDown
Post by: Vint on October 10, 2016, 03:31:39 PM
Какой тогда вообще смысл в KeyDown?
Задавать свою задержку между нажатием-отжатием чтобы прога успевала всё правильно обрабатывать.