为 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 向后)作为参数。希望这有帮助。
如果我使用计算机鼠标滚动 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 向后)作为参数。希望这有帮助。