Да, это баг, колесо надо обрабатывать отдельно — возвращать всегда 0 .
Ага, хотя бы так для начала.
AHK не записывает внутри себя эту информацию.
Но если обработка идёт внутри хука, то ничего не стоит изменить её на ноль в случае эмулированного нажатия.
#SingleInstance Force
#NoEnv
#Persistent
CoordMode, ToolTip
MouseHook.Set()
esc::ExitApp
class MouseHook
{
Set() {
if !this.hook {
this.hook := this.SetMouseHook()
OnExit( this.OnExit := ObjBindMethod(this, "Del") )
}
}
Del() {
if this.hook {
this.SetMouseHook(this.hook)
this.hook := ""
OnExit(this.OnExit, 0)
}
}
SetMouseHook(hHook := "") {
if hHook
DllCall("UnhookWindowsHookEx", Ptr, hHook)
else
Return hHook := DllCall("SetWindowsHookEx", Int, WH_MOUSE_LL := 14
, Int, RegisterCallback("LowLevelMouseProc", "Fast")
, Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
, UInt, 0, Ptr)
}
}
LowLevelMouseProc(nCode, wParam, lParam) {
static oMem := [], lpData, size := VarSetCapacity(lpData, 16 + A_PtrSize*2, 0)
If (wParam != 0x20A) ; WM_MOUSEWHEEL
Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
DllCall("RtlMoveMemory", Ptr, &lpData, Ptr, lParam, Ptr, size)
oMem.Push([wParam, &lpData])
timer := Func("EventHandling").Bind(oMem) ; во избежание фризов мыши обработка событий должна
SetTimer, % timer, -10 ; происходить обязательно по таймеру, а не в теле этой функции
Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
}
EventHandling(oMem) {
while event := oMem.RemoveAt(1) {
ext := NumGet(event[2] + 10, "Short")
flags := NumGet(event[2] + 12, "UInt")
INJECTED := flags & 1
ToolTip % (ext = 120 ? "WheelUp" : "WheelDown") "`n" (INJECTED ? "Emulated" : "Physical"), 0, 0, 20
}
}
1::SendInput {WheelUp}
2::SendInput {WheelDown}
Конечно понятно, что если через час вызвать GetKeyState исходя из переменной в этой функции, то он вернёт то что было час назад, но если GetKeyState применимо к колёсику изначально не имеет смысла, то это может иметь смысл сразу после посыла колёсика. И как раз с помощью #If может быть однозначно определено как именно в последний раз послано колёсико.
А для взятия логических состояний используется другой метод
Известных методов и так несколько, и без evilC, разговор про то, что это можно сделать встроенным, тем более на фоне бесполезности и невнятности существующего GetKeyState в отношении Wheel(Key).
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui