1

Тема: AutoHotkey: автопрокрутка окна

Удобно, когда при резком "рывке" колеса мыши вверх или вниз включается автопрокрутка окна. Скрипт:

;Any mouse = Logitech Revolution
;(C)2007 by Steve Key
;Непрерывная прокрутка при быстром движении колесом мыши
;Стоп - щелчок колеса в противоположную сторону
;Что-то похожее применяется в новых мышах Logitech Revolution,
;только там используется массивное колесо и куча софта...

;Я нагло содрал пример, в помощи к программе AHK, статья Set Timer,
;называемый "Пример №3", и доработал его под свои задачи.
;Даже некоторые комментарии из него остались...

;Не знаю, нужны ли нижеследующие команды:
Process, Priority, , High
SetKeyDelay, 10, 10
#NoEnv
SendMode Input
#InstallMouseHook
Thread, interrupt, 0

;Обработка прокрутки колеса вниз
$WheelDown::
     Send, {WheelDown} ;при вращении посылаем как минимум один щелчек колеса

    settimer, su, off ;и останавливаем прокрутку вверх, если она запущена
; Команда SetTimer уже запущена, но прежде, чем она сработает,
; мы успеем собрать данные о количестве щелчков колеса за это время:
If md > 0
{
    md += 1
    Return
}
; А вот и наш первый щелчок колеса. Устанавливаем счетчик в 1
; и запускаем таймер:
md = 1
SetTimer, tmd, 20 ; Идет подсчет количества щелчков колеса...
                                    ; в течение 20 миллисекунд - выставлено опытным путем
Return

;Таймер времени, в течение которого считаются щелчки колеса вниз
tmd:
SetTimer, tmd, Off ; отключение таймера

If md > 2 ; Если колесо успело щелкнуть более двух раз (быстро крутанули)...
                    ;то запускается таймер повтора прокрутки колеса вниз
{
;скорость прокрутки задается здесь:
  settimer, sd, 100
}
; Вне зависимости от того, какое действие было выполнено, сбрасываем
; значение нашей переменной на ноль, чтобы подготовиться к следующей
; серии щелчков колеса:
md = 0
Return

;Обработка прокрутки колеса вверх
;смысл команд тот же самый, что и выше...
$WheelUp::
     Send, {WheelUp}

    settimer, sd, off

If mu > 0
{
    mu += 1
    Return
}
mu = 1
SetTimer, tmu, 28 ; Идет ожидание количества нажатий клавиш
                                    ; в течение 28 миллисекунд - выставлено опытным путем
;Время ожидания разное для прокрутки вверх и вниз, потому что
;палец (у меня средний) лучше крутит колесо "к себе", чем "от себя".
return

;Таймер времени, в течение которого считаются щелчки колеса вверх
tmu:
SetTimer, tmu, Off

If mu > 2
{
  settimer, su, 100
}

mu = 0
Return

;таймер повтора прокрутки вниз
sd:
            Send, {WheelDown}
return

;таймер повтора прокрутки вверх
su:
            Send, {WheelUp}
return

Опубликовал Steve Key.
Недостатки: работает не во всех окнах, а в некоторых работает только после рывка колеса на заголовке окна. Прокрутка идёт рывками. Кроме того, прокрутка в вышеприведённом скрипте не останавливается, когда доходит до конца документа (например, запустив прокрутку вниз, можно получить интересный эффект, когда она дойдёт до конца документа: если нажать Ctrl+Home, не трогая мышь, документ опять начнёт сам прокручиваться вниз, и более того, если перевести курсор мыши на другое окно, то прокрутка будет действовать и там).
Несмотря на все недостатки, сама идея и реализация, несомненно, представляют интерес.

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

2

Re: AutoHotkey: автопрокрутка окна

Альтернативный способ реализации идеи. Измеряем не число шагов в единицу времени, а время между шагами.

#UseHook   ; Делает то же, что префикс $, но для всех гор. клавиш ниже.

WheelDown::
WheelUp::
  SetTimer, Scroll, Off
  If (A_PriorHotkey=A_ThisHotkey) and (A_TimeSincePriorHotkey<20) ; 20 миллисекунд.
    SetTimer, Scroll, 100
  Else
    Click %A_ThisHotkey%
Return

Scroll:
  Click %A_ThisHotkey%
Return

#UseHook, Off

Автор скрипта - YMP.

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

3

Re: AutoHotkey: автопрокрутка окна

Дальнейшее развитие альтернативного способа реализации от YMP. Заставляем процедуру таймера проверять, какое окно под мышью в данный момент. Если другое - останавливаться. А также останавливаться, если окно неактивно.

#UseHook

WheelDown::
WheelUp::
  SetTimer, Scroll, Off
  If (A_PriorHotkey=A_ThisHotkey) and (A_TimeSincePriorHotkey<20)
  {
    MouseGetPos,,, WinID_Start           ; Запоминает HWND окна под курсором.
    SetTimer, Scroll, 100
  }
  Else
    Click %A_ThisHotkey%
Return

Scroll:
  MouseGetPos,,, WinID                                    ; Проверка.
  If (WinID=WinID_Start) and WinActive("ahk_id" . WinID)
    Click %A_ThisHotkey%
  Else
    SetTimer, Scroll, Off
Return

#UseHook, Off
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.