Author Topic: Разница между L(R)Down и KeyDown  (Read 3766 times)

0 Members and 3 Guests are viewing this topic.

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Разница между L(R)Down и KeyDown
« 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) в конце выдаст нормальный код клавиши.
« Last Edit: October 09, 2016, 03:38:35 PM by vasyapro »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #1 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

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #2 on: October 09, 2016, 04:41:17 PM »
Вы не так меня поняли. Скрипт выполняется лишь один раз, что бы отправить в систему сообщение о том, что клавиша была зажата, а сообщения о отжатии нету, в результате чего клавиша остаётся зажатой всегда. После этого скрипт заканчивается и про кликер мы забываем. При ручном нажатии в систему опять отправляется сообщение о том, что клавишу зажали(но она была зажата кликером до этого, так что ничего не меняется), а вот при ручном отжатии клавиша наконец то вырубается.
Суть в том, что при использовании L(R)Down такой подход работает, а вот с KeyDown нет. То есть, скрипт состоящий из одной строки:
Code: [Select]
LDown($_xmouse,$_ymouse)выполненный лишь один раз зажимает ЛКМ до тех пор, пока она не будет нажата и отжата вручную. А вот этот код:
Code: [Select]
KeyDown(#A)такого результата не даст. В блокноте будет лишь одна буква А.



Quote
Задержки в цикле были бы не лишними, а то кликер будет напрягать процессор по чем зря. 20 мс вполне достаточно.
Скрипт на три секунды максимум, сомневаюсь что процессор сгорит за это время.
Quote
Объявлять переменные в кликермане не требуется, он сам это сделает при необходимости.
Будет ли переменная объявленная кликером в условии равна нулю?
« Last Edit: October 09, 2016, 04:43:44 PM by vasyapro »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #3 on: October 09, 2016, 05:01:03 PM »
В старых версиях кликер действительно не отжимал зажатые в ходе выполнения клавиши. Теперь при остановке он отжимает все клавиши клавиатуры чтобы не осталось залипших клавиш. Странно что это не относится к мыши.

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





vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #4 on: October 09, 2016, 05:04:10 PM »
Чёрт. То есть я всё это время использовал баг и случайно репортнул его?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #5 on: October 09, 2016, 05:11:46 PM »
Code: [Select]
KeyDown(#A)такого результата не даст. В блокноте будет лишь одна буква А.

При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #6 on: October 09, 2016, 05:12:36 PM »
Чёрт. То есть я всё это время использовал баг и случайно репортнул его?
Ну не баг а скорее недоработка.

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #7 on: October 09, 2016, 05:44:00 PM »
При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.
Какой тогда вообще смысл в KeyDown?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #8 on: October 09, 2016, 06:27:02 PM »
При зажатии клавиш кликером в блокноте не будет AAAAAA, повторы инициирует сама клавиатура.
Какой тогда вообще смысл в KeyDown?

Ну например в игре KeyDown(#W) заставит персонажа бежать вперед.
А для повторения команд есть цикл For

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Разница между L(R)Down и KeyDown
« Reply #9 on: October 10, 2016, 03:31:39 PM »
Какой тогда вообще смысл в KeyDown?
Задавать свою задержку между нажатием-отжатием чтобы прога успевала всё правильно обрабатывать.