【发布时间】:2020-01-10 19:56:05
【问题描述】:
如果我使用计算机鼠标滚动窗口,我会得到以下 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 可以使用 GET_WHEEL_DELTA_PARAM 从 wParam 中提取,但我没有看到任何关于这个 wParam 是如何从 fwKeys 和 zDelta 实际创建的信息。显然我的方法是不正确的。
我也试过用 SendMessage 代替 PostMessage,但结果是一样的。
感谢您的帮助!
【问题讨论】:
-
显示您对
CopyMemory的声明。这看起来有点像ByRef/ByVal mismatch -
不知道为什么你使用 CopyMemory 违反了你的编程合同(看看当 MS 忘记做编程合同时会发生什么devblogs.microsoft.com/oldnewthing/20200110-00/?p=103316)。此代码显示了如何正常提取它
Dim x As Long: x = &h00050078: MsgBox "HiParam " & x \ 65535: MsgBox "LoParam " & (x And 65535) -
VB.NET 中的 MS 使 VB6 在某种程度上具有可移植性。访问 VB6 的内部变量会使您的代码完全不可移植。
-
@JimMack 谢谢。我已将我的声明添加到帖子中。
-
@Mark 我使用了 CopyMemory,因为我在 VB6 论坛中找到了这个示例。