1 (изменено: PhronemoS, 2012-04-27 01:27:51)

Тема: AHK: Код обработки скрола не больше 3-х раз

Здравствуйте.

Недавно только начал изучать AHK, хочу попросить у Вас совета.

Задача состоит такова:

При нажатие клавиши LShift должна активироваться блокировка скрола мыши, а именно не больше 3-х "нажатий/скачков" вперед либо назад.

Простым текстом.

Нажав на LShift Скрол мыши может сделать либо 3-и скачка вперед либо три скачка назад. Сколько не крути скрол вперед он не сделает больше 3-х скачков, так же сколько не крути его назад он так же не может сделать больше трех скачков.

Задача такова,

Чтоб был счетчик количества скатчков скрола, при нажатие LShift активируется счетчик, который следит, если значение WheelUp достигло = 3 то остановить дальнейшее выполнение WheelUp (заблокировать скрол прокрутки вверх), если после остановки WheelUp было сделано WheelDown то сбросить счетчик WheelUp и вести подсчет WheelDown   , и вновь если WheelDown достиг 3 скачков то запретить дальнейшее его выполнение. Ну и получается в обратном порядке.

Надеюсь смог объяснить нормально.


Спасибо за внимание.

2 (изменено: Irbis, 2012-04-27 15:24:34)

Re: AHK: Код обработки скрола не больше 3-х раз

Насколько я понял, под "нажатием" понимается одиночное действие, по типу переключателя, как CapsLock на клавиатуре.
Т.е. один раз нажал - включилось, второй раз - выключилось? (в отличие от зажатия).

; AHK_L 1.1.07.03
~*LShift::BWh := !Bwh, WCount := 0
*WheelUp::
*WheelDown::
   D := Substr(A_ThisHotKey, 7, 1)
   CountInc := (D = "U") ? 1 : -1
   WCount += CountInc
   if (ABS(WCount) < 4 || !BWh)
	  MouseClick W%D%
   else
      WCount -= CountInc
return

3

Re: AHK: Код обработки скрола не больше 3-х раз

Irbis пишет:

Насколько я понял, под "нажатием" понимается одиночное действие, по типу переключателя, как CapsLock на клавиатуре.
Т.е. один раз нажал - включилось, второй раз - выключилось? (в отличие от зажатия).

Да все верно. Проверил скрипт. Он не производит ограничение не больше 3-х скролов как верх так и в низ. Просто отображается потом уведомление:

http://s019.radikal.ru/i615/1204/37/e9b8a04e65a3.png


Возможно ли вообще написать такой скрип как я описывал?

Спасибо за помощь.

4 (изменено: Irbis, 2012-04-27 16:37:39)

Re: AHK: Код обработки скрола не больше 3-х раз

Все работает, если нажать - отпустить. А такое сообщение появляется, если как раз зажать клавишу LSift (нажать и не отпускать, если так понятней).
Чтобы оно не появлялось, исправьте 1ую строку:

~*LShift UP:: BWh := !Bwh, WCount := 0

И кодировкв скрипта должна соответствовать версии АНК, это понятно, надеюсь.

5

Re: AHK: Код обработки скрола не больше 3-х раз

Да работает. Спасибо.

Возможно ли сделать чтоб число прыжков не могло превысить 3-х?

Сейчас получается так, что при нажатие LShift и скроле верх идет ограничение на 3, это все очень хорошо, а вот когда делаешь, для примера, два щелчка в низ, то значение скидывается, и потом вновь можно сделать 3-и щелчка верх.  Возможно ли сделать как бы привязку не больше 3-х именно трех, получается когда я сделал щелчки верх, значение = 3 , когда я начинаю делать в низ то значение отминусовывается от 3-х, то есть если я сделаю 3 верх потом два назад, то скрипт позволит только сделать 2 скрола верх повторно.  А не вновь 3.


Надеюсь смог нормально объяснить.

6 (изменено: Irbis, 2012-04-27 17:35:44)

Re: AHK: Код обработки скрола не больше 3-х раз

Не совсем понял сей поток мыслей, наверное это подойдет:

~*LShift::BWh := !Bwh, WCount := 0
*WheelUp::
*WheelDown::
   D := Substr(A_ThisHotKey, 7, 1)
   if (Prev <> D)
      Wcount := 0, Prev := D
   CountInc := (D = "U") ? 1 : -1
   WCount += CountInc
   if (ABS(WCount) < 4 || !BWh)
      MouseClick W%D%
   else
      WCount -= CountInc
return

7

Re: AHK: Код обработки скрола не больше 3-х раз

Огромное спасибо. Все работает так как я хотел

Только в той программе что мне нужно оно не работает. Походу программа блокирует данные действия.

Еще раз спасибо.

8 (изменено: creature.ws, 2012-04-28 16:22:38)

Re: AHK: Код обработки скрола не больше 3-х раз

Код ниже не решит вопрос с работоспособностью в упоминаемой специфической программе.

*WheelDown::
*WheelUp::
    If KeySequence(3, 70)
        Click % "W" SubStr(A_ThisHotkey, 7, 1)
    return

KeySequence(length, timeout)
{
    static clickCount := 0
    (A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < timeout)? clickCount += 1 : clickCount := 0
    return clickCount < length
}

Вариант ориентирующийся не на «переключение» нажатием клавиши, а на паузы между физическими кликами.
Суть: если метка горячей клавиши вызывается с периодичностью менее timeout числом раз более length — «оправки кликов для данной серии» приостанавливаются.