后台程序用以下代码成功勾到滚轮滚动事件,但是无法得到滚动方向,求助!
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
网上很多都是线程钩子,窗体激活时才有效,我的是后台获取,如何得到滚动方向?

解决方案 »

  1.   

    http://topic.csdn.net/t/20040413/15/2959988.html
      

  2.   

    看 zDelta 的正负,即 wParam 的正负。
      

  3.   

    http://topic.csdn.net/u/20090803/01/417828e0-2807-4118-b4f1-b91ac6090581.html参考15楼的代码.
      

  4.   

    马哥,我做系统钩子 ,无法确定消息发到哪个窗体,因此hwnd属性要怎么控制啊
      

  5.   

    一样的吧全局的HOOK还管啥焦点,全拦截.
      

  6.   

    可是我试着不行啊,当窗体后台运行时无法识别鼠标滚轮操作   
    hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
    返回值wParam = WM_MOUSEWHEEL   是无符号的吧   鼠标滚轮上下滚动 msgbox wParam  得到的结果都是一样的啊
      

  7.   


    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}"       
      

  8.   

    我晕倒...........叫你参考那个代码,是子类化的......我的意思是让你看看我是如何取滚轮方向,不是叫你使用子类化......要用LL HOOK取滚轮方向很简单,我测试了一下.先下载这个代码:http://www.m5home.com/blog/article.asp?id=245然后把鼠标HOOK事件里面写下面代码(其它相关代码也需要修改):Private Type MSLLHOOKSTRUCT     '鼠标HOOK时lParam指针指向的结构
        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
      

  9.   

    而且,有关WH_MOUSE_LL的用法,MSDN都说得非常非常非常之清楚了:
    一路都是链接,直接翻译一下就行了呀.
      

  10.   

    那个是他们的驱动在搞鬼,收到滚轮动作后,不发滚轮消息,而是发送了PageUp/PageDown按键,有的还是发送上下左右方向键...