Вот мой готовый вариант, который благодаря YMP'у может прокручивать что угодно, где угодно и без потери основных функций ролика в системе.
#SingleInstance,Force
#NoEnv
CoordMode,Mouse,Screen
DetectHiddenWindows,On
Menu,Tray,UseErrorLevel
SetBatchLines,-1
SetTitleMatchMode,2
SetWinDelay,-1
SetWorkingDir,%A_ScriptDir%
StringCaseSense,Off
scrollspeedup:=1
~*$WheelDown::
~*$WheelUp::
MouseGetPos,X,Y,mwin
WinGet,ActiveWin,id,A
stringtrimleft,Wheel,A_ThisHotkey,3
keywait,%Wheel%,L
if (whellwork=1)
return
whellwork:=1
if !scrollspeedup
scrollloop=1
else
{
if A_TimeSincePriorHotkey<400
{
if (!speedup:=speedup>10 ? 0 : speedup="" ? 1 : speedup+1)
scrollmulti++
}
if (A_TimeSincePriorHotkey>400 or A_ThisHotkey!=A_PriorHotkey)
{
scrollmulti=1
speedup=
}
oldthishotkey:=a_thishotkey
if scrollmulti>65
scrollmulti=65
if A_TimeSincePriorHotkey<17
scrollloop=4
else if A_TimeSincePriorHotkey<20
scrollloop=3
else if A_TimeSincePriorHotkey<30
scrollloop=2
else
scrollloop=1
scrollloop*=scrollmulti
}
if (A_OSVersion~="10.*?")
{
if (scrollloop!=1)
{
if (Wheel="WheelUp")
loop,% scrollloop
mouseclick, WheelUp
else
loop,% scrollloop
mouseclick, wheeldown
}
}
else
{
scroll:=Wheel="WheelUp" ? (120*scrollloop+1)<<16 : Wheel="WheelDown" ? -(120*scrollloop+1)<<16 : 0
WheelWinID :=DllCall("WindowFromPoint","int64",(X&0x00000000FFFFFFFF)|(Y<<32),"ptr")
WheelWinID2:=DllCall("WindowFromPoint","int64",(X&0x00000000FFFFFFFF)|((Y-20)<<32),"ptr")
ControlGetFocus,focctrl,ahk_id %mwin%
ControlGet,hfocctrl,Hwnd,,% focctrl,ahk_id %mwin%
if (WheelWinID!=hfocctrl)
ControlFocus,,ahk_id %WheelWinID%
if (scroll!=0 and (scrollloop!=1 or ActiveWin!=mwin))
{
PoSTMessage,0x20A,Scroll,(X&0x0000FFFF)|(Y<<16),,ahk_id %WheelWinID%
If (ErrorLevel or (WheelWinID!=WheelWinID2))
PoSTMessage,0x20A,Scroll,(X&0x0000FFFF)|(Y<<16),,ahk_id %WheelWinID2%
}
}
whellwork=0
return
Только нужно доработать режимы ускорения (сделать помягче).
Чуть не забыл. YMP, объясните пожалуйста что значит это выражение:
mX & 0x00000000FFFFFFFF | mY<<32
1) Для чего здесь добавляется 16-ричный код?
2) Какую функцию выполняет - | и &? В справке на этот счет мало информации.
3) Зачем Y умножать на 2 в степени 32?
И чему например будет равно выражение в итоге:
0x0033 или 0x1122 или 0x00110022?