26 (изменено: 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 не зависит от значения записи в реестре.

27

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

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

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

28 (изменено: 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

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

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

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

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

30 (изменено: 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.

31

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.
Дальнейшую дискуссию по теме считаю бессмысленной.

32 (изменено: 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
}