1

Тема: AHK: Home/End на скроллере при зажатой правой кнопке

Написала небольшой скриптик для облегчения жизни в интернете (часто приходится скроллить длиные страницы вверх и вниз), но отравляет жизнь постоянно появляющееся контекстное меню при отжатии правой кнопки мыши. Есть небольшой вопрос, как сделать так, чтобы контекстное меню не появлялось если скроллер прокручивался при зажатой правой кнопке, и при этом желательно чтобы правая кнопка работала как обычно если скроллер не прокручивался. Рассматривала вариант со средней кнопкой мыши, но там отравляет жизнь менюшка скроллинга .

WheelDown::
GetKeyState, RBstate, RButton
if RBstate = D
 send {End}
else
 send {WheelDown}  
return

WheelUp::
GetKeyState, RBstate, RButton
if RBstate = D
 send {Home}
else 
 send {WheelUp}
return

2

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Я не очень понял, причём тут ПКМ... вроде достаточно WU/WD и кстати можно написать скрипт на ускорение, ну скажем если WU/WD сделан больше чем 2-3 раза, т.е. сделать акселерацию как у курсора мышки.

Может я что то не понимаю... т.к. у меня единственный и основной браузер это Mozilla FireFox.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

3

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Колеса недостаточно если приходится скроллить текст с огромным количеством страниц. Дело то даже не в страницах, просто мне гораздо удобнее повесить хоум и енд  на скроллер используя правую кнопку мыши как модификатор (крайне дебильные столы в офисе не позволяют быстро добраться до клавиатуры ), а функционал правой кнопки желательно оставить неизменным из-за мышиных жестов в опере (уж люблю я этот браузер и ничего не могу с собой поделать ). Перерыла справку, а возможности блокировать контекстное меню так и не нашла.

4 (изменено: Indomito, 2012-07-05 17:48:33)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Да, забыл, в коде допущена ошибка, клавиша (колёсико тоже) не может быть рекурсивной, т.е. обработка и вызов внутри обработчика.

WheelDown:: ;<---Обработка WD
GetKeyState, RBstate, RButton
if RBstate = D
 send {End}
else
 send {WheelDown}  ;<----вызов WD
return

WheelUp:: ;<---- Обработка WU
GetKeyState, RBstate, RButton
if RBstate = D
 send {Home}
else 
 send {WheelUp} ;;<---- Вызов WU
return

Весь код или же обработчик следует заключить внутри директивы #UseHook, On|Off

Например так:

#UseHook, On
WheelDown::
GetKeyState, RBstate, RButton
if RBstate = D
 send {End}
else
 send {WheelDown}  
return
#UseHook, Off

#UseHook, On
WheelUp::
GetKeyState, RBstate, RButton
if RBstate = D
 send {Home}
else 
 send {WheelUp}
return
#UseHook, Off
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

5

Re: AHK: Home/End на скроллере при зажатой правой кнопке

odebepra пишет:

Колеса недостаточно если приходится скроллить текст с огромным количеством страниц.

мне твоя идея понравилась, как я до этого не додумался
Сейчас пишу скрипт для WheelUp и WheelDown - поверь одного колёсика достаточно если применить... ЛОМ )) Чуть позже опубликую скрипт, когда его отлажу... отладю (ну в общем, доведу до ума).

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6

Re: AHK: Home/End на скроллере при зажатой правой кнопке

клавиша (колёсико тоже) не может быть рекурсивной, т.е. обработка и вызов внутри обработчика.

[...] mouse hotkeys cannot be triggered by commands such as Click because all mouse hotkeys use the mouse hook.

7 (изменено: Indomito, 2012-07-05 19:26:11)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

creature.ws Так есть директива #InstallMouseHook, но не очень понятно как сделать обратное, т.е. аналог #UseHook, Off - из примера я что то не понял, да и примера то нет, просто приведено её написание.

Хук мыши отслеживает её щелчки в целях активации горячих клавиш мыши и также нужен для реализации некоторых возможностей строк автозамены. Он не поддерживается для Windows 95/98/Me, поскольку эти операционные системы требуют другой тип хука, который должен находиться в файле DLL.

AutoHotkey не устанавливает хуки клавиатуры и мыши безусловно, потому что вместе они потребляют по меньшей мере 500 Кб памяти (но если один из хуков уже установлен, установка другого потребует уже только около 50 Кб добавочной памяти). Вследствие этого хук мыши обычно устанавливается, только если скрипт содержит горячие клавиши мыши. Он также устанавливается для строк автозамены, но это может быть отменено через #Hotstring NoMouse.

Напротив, директива #InstallMouseHook безусловно устанавливает хук мыши, что может быть полезно, чтобы KeyHistory могла отслеживать щелчки мыши.

Вы можете определить, используется ли скриптом этот хук, через команду KeyHistory или через пункт меню. Вы можете определить, какие горячие клавиши используют хук, через команду ListHotkeys или пункт меню.

Эта директива также делает скрипт резидентным, что означает, что для его завершения требуется команда ExitApp.

т.е. если его включить, то обратного действия нет, я верно понял?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8 (изменено: creature.ws, 2012-07-05 19:35:04)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Listhotkeys

~LButton::
~RButton::
~MButton::
~WheelDown::
~WheelUp::
~Xbutton1::
~Xbutton2::return

#InstallMouseHook не аналог #UseHook

9

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Ну то что ты написал выше я знаю, а про #InstallMouseHook я читал и русскую справку и английскую... 10 раз перечитал - так и не врубился

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

10

Re: AHK: Home/End на скроллере при зажатой правой кнопке

И так простой скрипт + проблема.

;#InstallMouseHook
; 1000 ms = 1 секунда
SetTimer lWDmove , 5000
SetTimer lWUmove, 5000
SetTimer lScrTip, 10
return

lScrTip:
 ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount%
return

lWUmove:
 vWUcount := 0
 ;ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount%
return

lWDmove:
 vWDcount := 0
 ;ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount%
return
 
~WheelDown::
 Gosub lWUmove
 vWDcount++
 loop %vWDcount%
  {
   send {WheelDown}
  }
;ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount% `n  
return

~WheelUp::
 Gosub lWDmove 
 vWUcount++
 loop %vWUcount%
 {
  send {WheelUp}
 }
;ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount% `n
return

Проблема заключается в том, что стоит курсору попасть в место где может работать скролл - скрипт отрубается, т.е. ToolTip выводит пустые строки... где я накосячил?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

11

Re: AHK: Home/End на скроллере при зажатой правой кнопке

odebepra пишет:

...гораздо удобнее повесить хоум и енд  на скроллер используя правую кнопку мыши как модификатор...

Так не получится именно в Опере, так как комбинации с колесом и ПКМ уже используются самим приложением. Как вариант крутить колесо с разной скоростью:

#If WinActive("ahk_class OperaWindowClass")

~WheelUp::
~WheelDown::
   Counter++
   SetTimer, Action, -50
   Return

Action:
   If Counter>5
      Send, % "{"(A_ThisHotkey~="lD" ? "End":"Home")"}"
   Counter:=""
   Return

12

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Grey а скрипт из моего поста (№10) не работоспособен? Где я ошибся - ответь плиз

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

13

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Indomito пишет:

ToolTip выводит пустые строки...

Ну у меня такое только при запуске (переменные же не инициализированы изначально), потом они имеют всегда значение.

14 (изменено: Indomito, 2012-07-06 23:06:54)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Но если навести курсор на браузер, то WheelDown= 0 WheelUp= 0 хотя я колёсиком активно кручу и это только там где возможен скроллинг.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

15

Re: AHK: Home/End на скроллере при зажатой правой кнопке

"Потестил" код, который предложил Grey. На мой взгляд, слишком часто происходят ложные срабатывания при активном использовании колеса мыши, то есть вместо прокрутки происходит переход в начало/конец.
Если же увеличить Counter, то для срабатывания колесо крутить приходится "с ветерком".

Поэтому на основе предложенного скрипта сделал такой вариант: Средняя кнопка мыши, затем в течении небольшого периода (0,5с) пользователь одним поворотом колеса может сделать переход в начало/конец страницы.

#If WinActive("ahk_class OperaWindowClass")
~MButton::
Return 
~WheelUp::
~WheelDown::
   if (A_PriorHotkey = "~MButton") && (A_TimeSincePriorHotkey < 500)
   Send, % "{"(A_ThisHotkey~="lD" ? "End":"Home")"}"
Return

16

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Irbis пишет:

..слишком часто происходят ложные срабатывания при активном использовании колеса мыши...

При отсутствии контраста между скоростью прокручивания - м.б.

Irbis пишет:

Если же увеличить Counter...

Кроме переменной есть ещё и значение таймера.

17

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Интересные варианты вы предложили в треде, спасибо. Но я выбрала самый примитивный и самый рабочий вариант:

MButton & WheelUp::Send {Home}
MButton & WheelDown::Send {End}
MButton Up::Send {MButton}

При зажатой средней кнопке колесо делает то что нужно, и в браузере средняя кнопка вкладки закрывает/ссылки открывает как надо (мелочи вроде посыла MButton Down/Up при отжатии - несущественны) .
А доработанный ирбисом код грея я думаю прилепить на PageUp/PageDown:

~MButton::
Return 
~WheelUp::
~WheelDown::
   if (A_PriorHotkey = "~MButton") && (A_TimeSincePriorHotkey < 500)
   Send, % "{"(A_ThisHotkey~="lD" ? "End":"Home")"}"
Return

18

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Irbis посмотрел я твой скрипт и попробовал - А не проще на WheelUp и WheelDown давать коды стрелок?
Да кстати я так и не смог реализовать ускорение WheelUp и WheelDown скрипт был выше и ускорение работает там где скролл не возможен, а в области скролла таймер не срабатывает...

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

19

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Indomito, не понял про какие стрелки речь - у себя на мыши после длительных поисков никаких стрелок не обнаружил
(Посмотри пост #3, если тобой подразумевалась клавиатура)

20 (изменено: Indomito, 2012-07-08 16:16:06)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Irbis пишет:

Indomito, не понял про какие стрелки речь - у себя на мыши после длительных поисков никаких стрелок не обнаружил
(Посмотри пост #3, если тобой подразумевалась клавиатура)

поясняю, что я хочу сделать, но почему то это не получается.
Вариант №1
Считать количество WheelDown и WheelU, и посылать их, т.е. вместо одного столько сколько было прокруток за 0.5 секунды - не получилось.

Вариант №2
Считать количество WheelDown и WheelU, и посылать UP DN стрелок клавиатуры, столько сколько было прокруток колеса мышки за 0.5 секунды - не получилось.

Код был выше приведён, но на него ответили что он работает. Да он работает, но как только указатель мышки попадает в область любого окна где допустим вертикальный скролл счётчик отрубается.

Вот код

;#InstallMouseHook
; 1000 ms = 1 секунда
SetTimer lWDmove , 5000
SetTimer lWUmove, 5000
SetTimer lScrTip, 10
return

lScrTip:
 ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount%
return

lWUmove:
 vWUcount := 0
return

lWDmove:
 vWDcount := 0
return
 
~WheelDown::
 Gosub lWUmove
 vWDcount++
 loop %vWDcount%
  {
  send, {WheelDown}
  }
return

~WheelUp::
 Gosub lWDmove 
 vWUcount++
 loop %vWUcount%
 {
  send {WheelUp}
 }
return

tab::
  ExitApp

Душой понмаю, что где то ошибка, мой mind.dll видимо не верно отрабатывает вызовы

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

21

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Да, я не тот код привёл... он с ошибкой, но это дело не меняет

;#InstallMouseHook
; 1000 ms = 1 секунда
SetTimer lWDmove , 5000
SetTimer lWUmove, 5000
SetTimer lScrTip, 10
return

lScrTip:
 ToolTip WheelDown= %vWDcount% `n WheelUp= %vWUcount%
return

lWUmove:
 vWDcount := 0
return

lWDmove:
 vWUcount := 0
return
 
~WheelDown::
 Gosub lWDmove
 vWDcount++
 loop %vWDcount%
  {
  send, {WheelDown}
  }
return

~WheelUp::
 Gosub lWUmove 
 vWUcount++
 loop %vWUcount%
 {
  send {WheelUp}
 }
return

tab::
  ExitApp
  

  ;SetTimer lbSaintsMove, on
;#UseHook, On
;WheelDown::
;GetKeyState, RBstate, RButton
;if RBstate = D
; send {End}
;else
; send {WheelDown}  
;return

;WheelUp::
;GetKeyState, RBstate, RButton
;if RBstate = D
; send {Home}
;else 
; send {WheelUp}
;return
;#UseHook, Off
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

22

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Код, мягко, говоря, необычный. (Можно предположить, что автор проходил практикум в предгорьях Гималаев)

Во-первых, как соотносятся между собой сообщение про счетчик прокруток за 0.5 с и SetTimer lWDmove , 5000, учитывая такой ценный комметнарий, что 1000 ms = 1 секунда?

Ну это еще полбеды, так как есть...
Во-вторых. Представь себе логику программы, как она выглядит со стороны, а не так, как бы тебе хотелось, чтоб она работала. (Ибо воздействие мысли на работу механизмов и бег электронов пока еще не доказано )
С запуском скрипта начинают работать подпрограммы таймеров. Причем, событие это происходит в скрипте каждые 5 секунд, и никак не завязано на действия пользователя, повороты колеса и прочее, а только на время запуска скрипта.
И вот, проходит время 4990 мс (к примеру) со времени запуска скрипта, и ты решаешь покрутить колесико, чтобы счетчик накрутить... Догадаешься, что будет через 10мс?

23 (изменено: Indomito, 2012-07-08 16:49:57)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Ну ладно, ладно я писал на ходу для проверки
Но... повторяюсь счётчик работает только там где нет вертикальной полосы прокрутки... вот что мне не понятно, ну а таймеры срабатывают верно.
То что я написал, просто скрипт для проверки, но когда он перестал работать как я хотел, то я стал спрашивать и по сему он в таком "плачевном" состоянии

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

24

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Не смог повторить сию багофичу с вертикальной полосой, счетчик работает всегда. (Win7 x64, AHK_L x64 Unicode)

25

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Блин... что же у меня такое? (Win7 x64, AHK_L x64 Unicode)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

26

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Я тут проходил мимо....Скажите вам случайно не подойдет програмулинка MouseImp (ссылки не привожу, она есть в фри доступе) которая вешается на любую из клавиш мышки и позволяет скролить многие приложения просто, зажав соответствующую клавишу, двигая мышкой?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

27 (изменено: Indomito, 2012-07-10 04:53:41)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Mikki подойдёт, а она на чём написана и если можно линк... да исходник есть?

Да, ещё... она скроллит с ускорением или как обычно? Если как обычно, то моя мышка это умеет - клик с удержанием по СКМ и двигай, даже значок скролла отображается, ещё раз нажал выключился, но нет ускорения и на больших страницах надо двигать мышой весьма интенсивно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

28 (изменено: Mikki, 2012-07-11 16:57:20)

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Заранее прошу прощения за не_автохоткейный пост. Но, по моему, он в тему поставленной тут задаче. И еще - я не заинтересован в рекламе приведенного ниже программного продукта. Не являюсь его разработчиком. Только пользователь. С многолетним, довольным стажем.

Ссылки (ох надеюсь меня не забанят)
- http://www.mouseimp.com/rus/
или
- http://forum.ru-board.com/topic.cgi?for … topic=6604
там же есть и исходники на С++ и не забудьте проскролить новости и повыкачивать измененные dll-ки под последние офисы и оперы....я уж не помню под что именно, но с ними работает стабильнее. Да, кстати, под семеркой может работать не столь корректно как и под ХР. Под 64 осью по моему не работает....читайте новости там было обсуждение.

Да, скролинг работает с ускорением. В большинстве окон скролит только вверх-вниз. Но есть приятные исключения где скролит и в стороны.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

29

Re: AHK: Home/End на скроллере при зажатой правой кнопке

Mikki спасибо за подробный ответ, но у меня Win 7 x64 и данная проблема не решена, т.е. программа глючит/вылетает или же просто не хочет стартовать.
Режим совместимости не помогает, т.е. она стартует, но с нулевым функционалом - просто лежит себе в памяти и на всё забила.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro