Создать wParam для GET_WHEEL_DELTA_WPARAM - PullRequest
5 голосов
/ 10 января 2020

Если я прокручиваю окно с помощью компьютерной мыши, я получаю следующие результаты Spy ++:

fwKeys: 0, zDelta: -120

Мне нужно эмулировать событие колеса мыши по коду, поэтому я использую PostMessage так:

Public Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long) As Long

PostMessage lHwnd, WM_MOUSEWHEEL, MakeWParam(0, -120), 0

Public Function MakeWParam(ByVal uHigh As Long, ByVal uLow As Long) As Long

    Dim foo(0 To 1) As Integer
    Dim lRet As Long

    foo(0) = uHigh
    foo(1) = uLow

    Call CopyMemory(lRet, VarPtr(foo(0)), Len(lRet))

    MakeWParam = lRet

End Function

Это, однако, приводит к тому, что Spy ++ говорит мне следующее:

fwKeys: 3C40, zDelta: 8996

Я не понимаю, где я делаю это неправильно.

Согласно MSDN, zDelta может быть извлеченным из wParam с помощью GET_WHEEL_DELTA_PARAM, но я не вижу никакой информации о том, как этот wParam фактически создается из fwKeys и zDelta. И, очевидно, мой подход не верен.

Я также попробовал SendMessage вместо PostMessage, но результат был тот же.

Спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 12 января 2020

Поскольку у вас нет ByVal для pSource, вы не должны использовать VarPtr для foo(0), или вы должны передать его явно ByVal: CopyMemory lRet, ByVal VarPtr(foo(0)) ... или CopyMemory lRet, foo(0) ...

Также у вас есть foo() As Integer, но вы присваиваете Long переменные его содержимому. Вы уверены, что это то, что вы хотите?

1 голос
/ 18 января 2020

Если вам нужно смоделировать колесо мыши, я думаю, вам было бы намного лучше использовать SendInput следующим образом:

Private Const MOUSEEVENTF_WHEEL = &H800
Private Const INPUT_MOUSE = 0
Private Type MOUSEINPUT
    dx As Long
    dy As Long
    mouseData As Long
    dwFlags As Long
    time As Long
    dwExtraInfo As Long
End Type
Private Type GENERALINPUT
    dwType As Long
    xi(0 To 23) As Byte
End Type
Private Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" (dest As Any, ByVal numbytes As Long)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long

Private Sub RotateMouseWheel(Optional lWheelClicks As Long = 1, Optional lWheelDirection As Long = 1)
Dim i As Long, GInput() As GENERALINPUT, MInput As MOUSEINPUT
    ReDim GInput(0 To lWheelClicks - 1)
    ZeroMemory MInput, Len(MInput): MInput.dwFlags = MOUSEEVENTF_WHEEL: MInput.mouseData = 120 * lWheelDirection
    For i = 0 To lWheelClicks - 1
        GInput(i).dwType = INPUT_MOUSE
        CopyMemory GInput(i).xi(0), MInput, Len(MInput)
    Next i
    SendInput lWheelClicks, GInput(0), Len(GInput(0))
End Sub

Вы можете указать количество щелчков колеса, чтобы вращать колесо, а также вращение. направление (1 означает вперед и -1 назад) в качестве параметров. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...