后台程序用以下代码成功勾到滚轮滚动事件,但是无法得到滚动方向,求助!
Form1 :
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Const WH_MOUSE_LL As Long = 14
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
Module1:Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MBUTTONDBLCLK = &H209
Public Const WM_MOUSEACTIVATE = &H21
Public Const WM_MOUSEFIRST = &H200
Public Const WM_MOUSELAST = &H209
Public Const WM_MOUSEWHEEL = &H20A '以上是鼠标的各个值
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Exit Function
End If
If wParam = WM_MOUSEWHEEL Then
MsgBox "滚动"
End If
End Function
网上很多都是线程钩子,窗体激活时才有效,我的是后台获取,如何得到滚动方向?
Form1 :
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Const WH_MOUSE_LL As Long = 14
Private Sub Form_Load()
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnhookWindowsHookEx(hHook)
End Sub
Module1:Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_MBUTTONDOWN = &H207
Public Const WM_MBUTTONUP = &H208
Public Const WM_MBUTTONDBLCLK = &H209
Public Const WM_MOUSEACTIVATE = &H21
Public Const WM_MOUSEFIRST = &H200
Public Const WM_MOUSELAST = &H209
Public Const WM_MOUSEWHEEL = &H20A '以上是鼠标的各个值
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Exit Function
End If
If wParam = WM_MOUSEWHEEL Then
MsgBox "滚动"
End If
End Function
网上很多都是线程钩子,窗体激活时才有效,我的是后台获取,如何得到滚动方向?
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
返回值wParam = WM_MOUSEWHEEL 是无符号的吧 鼠标滚轮上下滚动 msgbox wParam 得到的结果都是一样的啊
Private Sub Form_Load()
Set objSubClass = New cSubclass
objSubClass.AddWindowMsgs Me.hWnd '挂上子类化
s = GetForegroundWindow
' hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
End SubPrivate Sub Form_Unload(Cancel As Integer)
' Call UnhookWindowsHookEx(hHook)
objSubClass.DeleteWindowMsg Me.hWnd '取消子类化
Set objSubClass = Nothing
End SubPrivate Sub objSubClass_MsgCome(ByVal bBefore As Boolean, bHandled As Boolean, lReturn As Long, lng_hWnd As Long, uMsg As Long, wParam As Long, lParam As Long)
If bBefore Then
Select Case uMsg
Case WM_MOUSEWHEEL '拦截滚轮消息
Select Case (wParam / 65536) '判断是向上滚还是向下滚
Case 120
MsgBox "{UP}" '模拟按键
Case -120
MsgBox "{DOWN}" '模拟按键
End Select
End Select
End If
End Sub
简单的代码 我用上类模块后编制上面程序,当窗体失去焦点时再滚动滚轮无法弹出MsgBox "{DOWN}"
pt As POINTAPI
dwMouseData As Long
dwFlags As Long
dwTime As Long
dwExtraInfo As Long
End Type
Private Const WM_MOUSEWHEEL As Long = &H20APrivate Sub objHookLL_MouseHook(ByVal Code As Long, ByVal wParam As Long, ByVal lParam As Long, lRet As Long)
'鼠标HOOK事件.
'要吃了当前消息,把lRet = -1即可.
If Code = HC_ACTION And wParam = WM_MOUSEWHEEL Then
Dim stMLL As MSLLHOOKSTRUCT
Call CopyMemory(ByVal VarPtr(stMLL), ByVal lParam, Len(stMLL))
With stMLL
Debug.Print .dwMouseData / 65536 '输出滚轮状态
'在这里可以得到鼠标坐标以及其它信息
End With
End If
txtMCode.Text = Code
txtMwParam.Text = wParam
txtMlParam.Text = lParam
Debug.Print " M = " & Code, wParam, lParam
End Sub
一路都是链接,直接翻译一下就行了呀.