- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个用 VB.NET 编写的代码示例,以使用 user32.dll 和 的低级 Hook 捕获表单外的鼠标滚轮滚动事件 WM_MOUSEWHEEL 就像 Hans Passant 在我的其他问题中回答的那样:Record mouse Middle button and wheel scroll
这是我需要做的伪示例:
Dim mousewheel_up as boolean
Dim mousewheel_down as boolean
Sub that Overides the windows messages to set the mousewheel booleans
If mousewheel_up then msgbox("MouseWheel up")
If mousewheel_down then msgbox("MouseWheel down")
End sub
UPDATE
试过了,但它只在表单内有效,而且我不知道如何获取增量值:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Application.AddMessageFilter(New MouseWheelMessageFilter())
End Sub
Public Class MouseWheelMessageFilter : Implements IMessageFilter
Public Function PreFilterMessage1(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
' Filter out WM_MOUSEWHEEL messages, which raise the MouseWheel event,
' whenever the Ctrl key is pressed. Otherwise, let them through.
Const WM_MOUSEWHEEL As Integer = &H20A
'If m.Msg = WM_MOUSEWHEEL & My.Computer.Keyboard.CtrlKeyDown Then
If m.Msg = WM_MOUSEWHEEL Then
' Process the message here.
If Form.ActiveForm IsNot Nothing Then
MsgBox("Mouse scrolled!")
' TODO: Insert your code here to adjust the size of the active form.
' As shown above in the If statement, you can retrieve the form that
' is currently active using the static Form.ActiveForm property.
' ...
End If
Return True ' swallow this particular message
End If
Return False ' but let all other messages through
End Function
End Class
最佳答案
您需要使用 SetWindowsHookEx函数并将 Hook 类型指定为 *WH_MOUSE_LL* (14)。有以下声明。
Public Structure Point
Public X As Integer
Public Y As Integer
End Structure
Public Structure Msllhookstruct
Public Location As Point
Public MouseData As Integer
Public Flags As Integer
Public Time As Integer
Public ExtraInfo As Integer
End Structure
Private Delegate Function HookProc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As Integer
<DllImport("user32.dll", SetLastError:=True)> _
Private Function SetWindowsHookEx(ByVal hookType As Integer, ByVal lpfn As HookProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
End Function
<DllImport("user32.dll")> _
Private Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As Msllhookstruct) As IntPtr
End Function
Private Hook As IntPtr
在您的初始化例程中,按如下方式使用它
Hook = SetWindowsHookEx(14, AddressOf Proc, Process.GetCurrentProcess().MainModule.BaseAddress.ToInt32(), 0)
其中 Proc
是一个函数回调,如下所示:
Private Function Proc(nCode As Integer, wParam As Integer, ByRef lParam As Msllhookstruct) As IntPtr
If wParam = 522 Then
Dim Delta = CShort(lParam.MouseData >> 16)
If Delta > 0 Then
' Up
ElseIf Delta < 0 Then
' Down
End If
End If
Return CallNextHookEx(Hook, nCode, wParam, lParam)
End Function
关于.net - 为 WM_MOUSEWHEEL 设置 WindowsHookEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16857370/
我怎么知道用户是否停止滚动鼠标滚轮?目前,在我的 WinProc 函数下,c++ case WM_MOUSEWHEEL: if((int)wParam > 0) //scroll forward
我尝试使用 ctrl+ 鼠标滚轮实现缩放功能。如果我使用此代码,事件窗口会滚动,但不会缩放 - 看起来所有收到此消息的应用程序都无法识别 MK_CONTROL 标志。如果我做错了什么,有人可以告诉我吗
我一直在搜索 Windows API,寻找一种在所有 WM_MOUSESCROLL 消息到达其透视消息队列之前拦截它们的方法。拦截后我需要改变一些关于它们的东西并将它们发送到不同的[或相同的]消息队列
我有一个包含子窗口的主窗口。在 child 中我需要处理鼠标滚轮滚动,但是我滚动鼠标滚轮消息到主窗口的位置并不重要。我用 Spy++ 得到了这些结果。 不知道为什么会这样,但我认为子创建有问题,我的代
我需要一个用 VB.NET 编写的代码示例,以使用 user32.dll 和 的低级 Hook 捕获表单外的鼠标滚轮滚动事件 WM_MOUSEWHEEL 就像 Hans Passant 在我的其他问题
我想扩展我制作的现有应用程序,使其通过在通知区域图标上滚轮来设置混音器音量。 据我所知,通知区域没有收到任何 WM_MOUSEWHEEL 消息,但我仍然找到了一个完全符合我想要实现的目标的应用程序(
我正在尝试为我的应用程序处理 wm_mousewheel。 代码: BEGIN_MSG_MAP(DxWindow) MESSAGE_HANDLER(WM_MOUSEWHEEL, KeyHa
我的 C++ WinAPI 应用程序中有一个奇怪的问题。 当我运行我的应用程序时,滚动条起作用并且我每次使用它时都会看到 MessageBox。但是,我点击这里和那里,改变窗口,回到我的和...一切正
我有这些代码链接: WMMouseWheel not working in Delphi How to disable MouseWheel if mouse is not over VirtualT
我是一名优秀的程序员,十分优秀!