为 GET_WHEEL_DELTA_WPARAM 创建 wParam

Create wParam for GET_WHEEL_DELTA_WPARAM

如果我使用计算机鼠标滚动 window,我会得到以下 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,可以使用 GET_WHEEL_DELTA_PARAM 从 wParam 中提取 zDelta,但我没有看到任何关于如何从 fwKeys 和 zDelta 创建 wParam 的信息。显然我的做法是不正确的。

我也尝试过用 SendMessage 代替 PostMessage,但结果是一样的。

感谢您的帮助!

由于 pSource 没有 ByVal,因此您不应该将 VarPtr 用于 foo(0),或者您应该显式传递 [=10] =]:CopyMemory lRet, ByVal VarPtr(foo(0))...或CopyMemory lRet, foo(0)...

此外,您有 foo() As Integer,但您将 Long 变量分配给了它的内容。你确定那是你想要的吗?

如果您需要模拟鼠标滚轮,我认为您最好像这样使用 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 向后)作为参数。希望这有帮助。