1 (изменено: D-r_Safiullin, 2018-10-02 17:00:00)

Тема: AHK: Прокрутка на дробное число строк

Здравствуйте. Искал на русском и на английском языках, но не нашел: при нажатии комбинации клавиш нужна прокрутка на не целое число строк. Например не 4 строки, а 4.8.

Numpad1:: MouseClick, WheelUp,,,4.8

Проматывает ровно на 4 стоки почему-то

2 (изменено: teadrinker, 2018-10-01 20:16:55)

Re: AHK: Прокрутка на дробное число строк

Это примерно одно и то же, что спросить: а как можно кликнуть мышью 4.8 раз?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Прокрутка на дробное число строк

teadrinker пишет:

Это примерно одно и то же, что спросить: а как можно кликнуть мышью 4.8 раз?

Я так не считаю:
https://docs.microsoft.com/en-us/window … mousewheel

4 (изменено: stealzy, 2018-10-02 12:16:52)

Re: AHK: Прокрутка на дробное число строк

MOUSEEVENTF_WHEEL := 0x800, LINE_HEIGHT := 30
WHEEL_DELTA := 4.8*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)

5

Re: AHK: Прокрутка на дробное число строк

LINE_HEIGHT := 40

6

Re: AHK: Прокрутка на дробное число строк

Коллеги, вы о чём?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Прокрутка на дробное число строк

И что, работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Прокрутка на дробное число строк

Не везде.
Тут уже от приложения зависит.

9 (изменено: stealzy, 2018-10-02 16:27:05)

Re: AHK: Прокрутка на дробное число строк

В sublime и firefox - безупречно, а в элементах на основе стандартного Edit или Scintilla(Np++, Scintilla) верхняя строка всегда занимает фиксированное положение, соответсвенно плавный скролл не поддерживается.

10

Re: AHK: Прокрутка на дробное число строк

stealzy пишет:

В sublime и firefox - безупречно

У меня в FF этот код проворачивает действительно на другое расстояние, чем один поворот колеса. До этого в блокноте проверял — не работает. А откуда вы это LINE_HEIGHT взяли?

One wheel click is defined as WHEEL_DELTA, which is 120.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Прокрутка на дробное число строк

Скрипт отлично работает, спасибо!

Numpad1::
	MOUSEEVENTF_WHEEL := 0x800, LINE_HEIGHT := 30
	WHEEL_DELTA := -4.8*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
	DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)
Return

Numpad2::
	MOUSEEVENTF_WHEEL := 0x800, LINE_HEIGHT := 30
	WHEEL_DELTA := 4.8*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
	DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)
Return

12 (изменено: stealzy, 2018-10-02 17:41:31)

Re: AHK: Прокрутка на дробное число строк

По дефолту прокрутка колеса 3 строки, WHEEL_DELTA/3 = 40.
В блокноте стандартный Edit в принципе не умеет плавный скроллинг.

13

Re: AHK: Прокрутка на дробное число строк

stealzy пишет:

По дефолту прокрутка WHEEL_DELTA равна 3 строкам

Да, но вариант кода, где LINE_HEIGHT := 40 у меня в FF прокручивает на меньшее расстояние, чем поворот колеса. У меня поворот колеса 3 строки.

stealzy пишет:

В блокноте - стандартный Edit, как он должен на дробную часть прокручивать, если он в принципе не умеет частично отображать верхнюю строку?

В блокноте не получилось не только повернуть на дробную часть, но и на любое число, не кратное 3.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: stealzy, 2018-10-02 17:57:09)

Re: AHK: Прокрутка на дробное число строк

В Edit/Scintilla прокрутка накапливается. Можно послать 6 раз прокрутку на полстроки, и когда в контроле накопится на 3 строки, произойдет прокрутка на эти самые 3 строки.

У меня в FF этот код проворачивает действительно на другое расстояние, чем один поворот колеса.

ТС это и надо было - 4.8 строки.

15 (изменено: teadrinker, 2018-10-02 18:07:24)

Re: AHK: Прокрутка на дробное число строк

На другое — не значит на 4.8.

teadrinker пишет:

Да, но вариант кода, где LINE_HEIGHT := 40 у меня в FF прокручивает на меньшее расстояние, чем поворот колеса.

А у вас на 4.8 ?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: stealzy, 2018-10-02 18:22:46)

Re: AHK: Прокрутка на дробное число строк

Да, я проверял, 4.8*40 = 4.8 строки, если совершить это действие 5 раз выйдет прокрутка ровно на 24 строки.
Но это sublime, а что в браузере...

17

Re: AHK: Прокрутка на дробное число строк

А как вы в FF определили точное число строк?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: teadrinker, 2018-10-02 18:35:59)

Re: AHK: Прокрутка на дробное число строк

Пробовал PhpStorm — тоже только на кратное 3 поворачивает, плавная прокрутка есть. В общем, работает в каких-то приложениях, в некоторых — непредсказуемо.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Прокрутка на дробное число строк

Предсказуемо.
Тут подробно описано:
https://www.codeproject.com/Articles/15 … pplication

20 (изменено: teadrinker, 2018-10-02 19:20:34)

Re: AHK: Прокрутка на дробное число строк

Malcev пишет:

Предсказуемо

Не-а. Запускаю MS Spy, выбираю WM_MOUSEWHEEL для окна FF. Дискретно прокручиваю колесо мыши, получаю zDelta: -120, запускаю код — получаю zDelta: -192. Всё математически правильно, но прокручивается на меньшее расстояние.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Прокрутка на дробное число строк

Вот 120:

f1::
MOUSEEVENTF_WHEEL := 0x800, LINE_HEIGHT := 40
WHEEL_DELTA := 3*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)

22

Re: AHK: Прокрутка на дробное число строк

Да, вот так у меня прокручивает страницу в FF ровно на такое же расстояние, как один поворот колеса. Но если сделать коэффициент 4.8, почему-то прокручивает на меньшее расстояние.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: Прокрутка на дробное число строк

Больше 3 фаерфокс не обрабатывает.
Поэтому так можно:

f1::
MOUSEEVENTF_WHEEL := 0x800, LINE_HEIGHT := 40
WHEEL_DELTA := 3*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)
sleep 10
WHEEL_DELTA := 1.8*LINE_HEIGHT, dx := 0, dy := 0, dir := -1
DllCall("mouse_event", uint, dwFlags := MOUSEEVENTF_WHEEL, int, dx ,int, dy, uint, dir*WHEEL_DELTA, int, 0)

24 (изменено: stealzy, 2018-10-03 00:48:30)

Re: AHK: Прокрутка на дробное число строк

Gecko обрабатывает особым образом:

if (MOUSEEVENTF_WHEEL <= 120 and WheelScrollLines = 3)
	MOUSEEVENTF_WHEEL := MOUSEEVENTF_WHEEL * k ; k ≈1.8±0.1, зависит от масштаба в лисе
F1::Wheel(-3) ; равна прокрутке от {WheelDown} ≈ k*3 ≈ 6
F2::Wheel(-3.05) ; равна прокрутке от нажатия {Down} ≈ 3
F3::Wheel(-5.95) ;  равна прокрутке от {WheelDown} ≈ 6
F4::Send {WheelDown}

Wheel(lines) {
	RegRead WheelScrollLines, HKCU\Control Panel\Desktop, WheelScrollLines
	LINE_HEIGHT := 120/WheelScrollLines ; LINE_HEIGHT := 40 for Edit
	WHEEL_DELTA := lines*LINE_HEIGHT
	DllCall("mouse_event", uint, MOUSEEVENTF_WHEEL:=0x800, int, dx:=0 ,int, dy:=0, uint, WHEEL_DELTA, int, 0)
}

В Sublime F1 будет прокручивать на 3 строки при любых значениях WheelScrollLines.
В лисе формула будет как в коде выше, но не совсем точно.
В контролах Edit значение WheelScrollLines также обозначает минимальный квант прокрутки (по умолчанию 3), но там LINE_HEIGHT := 40 не зависит от значения записи в реестре.

25

Re: AHK: Прокрутка на дробное число строк

Ну всё-таки не совсем предсказуемо.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26 (изменено: Malcev, 2018-10-02 22:56:27)

Re: AHK: Прокрутка на дробное число строк

stealzy пишет:

if (MOUSEEVENTF_WHEEL < 120 and WheelScrollLines = 3) MOUSEEVENTF_WHEEL := MOUSEEVENTF_WHEEL * k ; k ≈1.8±0.1

А откуда вы взяли эту формулу?
У меня этот код в фаерфоксе постоянно сдвигает ползунок на расстояние равное 8 посыланием wheeldown, при настройках шага в 3 линии.

f1::
loop 5
{
   PostMW(-120)
   PostMW(-72)
}
return


PostMW(delta)
{ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx
  CoordMode, Mouse, Screen
  MouseGetPos, x, y
  Modifiers := 0x8*GetKeyState("ctrl") | 0x1*GetKeyState("lbutton") | 0x10*GetKeyState("mbutton")
              |0x2*GetKeyState("rbutton") | 0x4*GetKeyState("shift") | 0x20*GetKeyState("xbutton1")
              |0x40*GetKeyState("xbutton2")
  PostMessage, 0x20A, delta << 16 | Modifiers, y << 16 | x ,, A

27 (изменено: stealzy, 2018-10-03 00:55:05)

Re: AHK: Прокрутка на дробное число строк

Это псевдокод.
Методом тыка, после обнаружения teadrinker'ом в 24 посте.
Моя ошибка, я использовал строгое сравнение, заменить < на <=. Поправил.

   PostMW(-120-72) ; так сдвинет на 4

28 (изменено: Malcev, 2018-10-03 06:48:09)

Re: AHK: Прокрутка на дробное число строк

stealzy пишет:

Методом тыка, после обнаружения teadrinker'ом в 24 посте

Я у себя такое не наблюдаю, а вижу следующий алгоритм:

n := -727
wheel_delta := 120

f1::PostMW(n)
f2::
if (abs(n) <= wheel_delta)
   PostMW(n)
else
{
   count := floor(abs(n)/2/wheel_delta) + 1
   delta := abs(n)/n*wheel_delta
   loop % count
   {
      If (A_Index = count)
         delta := mod(n/2, wheel_delta)
      PostMW(delta)
   }
}


PostMW(delta)
{ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx
  CoordMode, Mouse, Screen
  MouseGetPos, x, y
  Modifiers := 0x8*GetKeyState("ctrl") | 0x1*GetKeyState("lbutton") | 0x10*GetKeyState("mbutton")
              |0x2*GetKeyState("rbutton") | 0x4*GetKeyState("shift") | 0x20*GetKeyState("xbutton1")
              |0x40*GetKeyState("xbutton2")
  PostMessage, 0x20A, delta << 16 | Modifiers, y << 16 | x ,, A
}
stealzy пишет:

PostMW(-120-72) ; так сдвинет на 4

Не на 4, а на 2.4.

29

Re: AHK: Прокрутка на дробное число строк

Вы написали код, пытающийся компенсировать их хак; у меня приблизительное описание самого хака со стороны браузера.
Кстати при изменении масштаба страницы работает? А при изменении дефолтных 3 строк прокрутки в винде?

Malcev пишет:
stealzy пишет:

PostMW(-120-72) ; так сдвинет на 4

Не на 4, а на 2.4.

Вполне допускаю что у вас замена двух PostMW(-120) и PostMW(-72) на PostMW(-120-72) и приводит к изменению прокрутки с 8 до 2.4 WheelDown.
У меня же - с 8 до 4 WheelDown.
Дальнейшую дискуссию по теме считаю бессмысленной.

30 (изменено: Malcev, 2018-10-03 15:36:26)

Re: AHK: Прокрутка на дробное число строк

Почему же бесмысленной?
Вы считаете, что фаерфокс умножает на k ≈1.8±0.1, зависит от масштаба в лисе.
А у меня таких выводов нету.
Вот так у меня идет сдвиг на 4.8 линии при любом значении в реестре и масштаба в лисе.

n := 4.8

wheel_delta := 120
RegRead WheelScrollLines, HKCU\Control Panel\Desktop, WheelScrollLines
if !WheelScrollLines
   WheelScrollLines := 3
Line_Height := 120/WheelScrollLines
new_delta := Line_Height*n
f1::
f2::
if (A_ThisHotkey = "f1")
   i := -1
else
   i := 1
if (WheelScrollLines = 3) and (new_delta > wheel_delta)
   i*=2
PostMW(new_delta*i)



PostMW(delta)
{ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx
  CoordMode, Mouse, Screen
  MouseGetPos, x, y
  Modifiers := 0x8*GetKeyState("ctrl") | 0x1*GetKeyState("lbutton") | 0x10*GetKeyState("mbutton")
              |0x2*GetKeyState("rbutton") | 0x4*GetKeyState("shift") | 0x20*GetKeyState("xbutton1")
              |0x40*GetKeyState("xbutton2")
  PostMessage, 0x20A, delta << 16 | Modifiers, y << 16 | x ,, A
}