窗体
Dim Lhook As Long
Private Sub Command1_Click()
 Call ADDHook
End SubPrivate Sub Form_Unload(Cancel As Integer)
 UnhookWindowsHookEx Lhook
End SubPublic Sub ADDHook()
 Lhook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)
End Sub
模块Public Function CallMouseHookProc(ByVal code As Long, Wparam As Long, ByVal lParam As Long) As Long
    Dim pt As POINTAPI
        If code = HC_ACTION Then                                             
            CopyMemory MouseMsg, lParam, LenB(MouseMsg)                         
            Form1.Text1.Text = "X=:" + Str(MouseMsg.X) + "Y=" + Str(MouseMsg.Y)  'Str把包含字节的X,Y..转换成数值
            Form1.Text2.Text = Format(Wparam, "0")                       
 
 '如果按下中键,则把它变为左键,再拦截该消息
                If Wparam = WM_MBUTTONDOWN Then
                    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0
                    CallMouseHookProc = 1
                End If
'摸拟左键抬起
                If Wparam = MOUSEEVENTF_LEFTUP Then
                    mouse_event mouseeventf_leetup, 0, 0, 0
                    CallMouseHookProc = 1
                End If
                
            If code <> 0 Then
                CallMouseHookProc = CallNextHookEx(0, code, Wparam, lParam)
            End If
    End Function
    
    
  大家有时间帮忙看看吧,这是我照着百度文档写的。
边写边查自己不懂的资料,写了半个晚上。。后来调试的时候,出现了一个非常严重的问题啊。一启动VB6就挂掉了,后来对着作者的源码看了几遍,又没发现错误。  头被我搞大了,后来单步调试,运行窗体代码的时候没事,但只要一移动鼠标,要跳到模块的时候VB就挂了,弹的对话框说什么错误根本没办法看见。。  刚入门VB不久,所以我找了几小时没找到答案,来请教各位高手了。。有时间帮我看下,谢谢大家了。。

解决方案 »

  1.   

    哪些API和API常量在哪里定义的??
      

  2.   

    模块
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" ( _
       ByVal idHook As Long, _
       ByVal lpfn As Long, _
       ByVal hmod As Long, _
       ByVal dwThreadId As Long _
    ) As LongDeclare Function CallNextHookEx Lib "user32" ( _
       ByVal ghHook As Long, _
       ByVal ncode As Long, _
       ByVal Wparam As Integer, _
       ByVal lParam As Long _
    ) As LongDeclare Function UnhookWindowsHookEx Lib "user32" ( _
       ByVal ghHook As Long _
    ) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)            Public Type MOUSEMSGS   '定义一个鼠标类结构
                X As Long               'X坐标
                Y As Long               'Y坐标
                a As Long
                b As Long
                End Type            Public Type POINTAPI    'PINT结构对象,保存鼠标在屏幕上的X,Y坐标
                X As Long
                Y As Long
                End Type            '==================类型常数
                Public Const WH_KEYBOARD_LL = 13
                Public Const Alt_Down = &H20
                Public Const WH_MOUSE_LL = 14
                '===========================消息
                Public Const HC_ACTION = 0
                Public Const HC_SYSMODALOFF = 5
                Public Const HC_SYSMODALON = 4
                '================================键盘消息
                Public Const WM_KEYDOWN = &H100
                Public Const WM_KEYUP = &H101
                Public Const WM_SYSKEYDOWN = &H104
                '=================================鼠标消息
                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
       这是我复制的模块中的源码,没改过,看看有错没
      

  3.   

    http://download.csdn.net/source/1899084
      

  4.   

    CopyMemory MouseMsg, lParam, LenB(MouseMsg)这里改为:CopyMemory MouseMsg, byval lParam, LenB(MouseMsg)从你发的声明来看,如果不加byval,就会把lParam的地址传进去,值不对,当然一有鼠标消息就会挂.或者,声明改为:Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, byval Source As long, ByVal Length As Long)
      

  5.   

    缺少mouse_event API函数
    另外声明的API常数与程序中使用的常数无法对应。自定变量是MOUSEMSGS程序中用的却是MouseMsg也无法对应,此程序错误甚多,建议认真对照原作修改。
      

  6.   


    谢谢大家了。问题已经解决了。。由于自己用了大半夜一句一句敲出来的,所以有些地方可能敲错了。
    只能说HOOK这玩意是系统地层的东西,跟一般函数不一样,一旦弄不好整个VB就挂掉了,搞得调试都无从下手,差点把我系统搞坏了,由于调试太多,每次一启动就直接挂掉,还死了一次机。。4楼的哥哥,也许你说的也没错,但是最后我用正确的代码调试了下,不加ByVal也行,加了也行。都正常运行,所以我就把我调试的结果说下,免得有些编友看了对有阴影,非常感谢你的帮助,真心的。猴哥说的解决大部分问题,基本上算是有些东西无法对应上,所以导致出错。。分就给你了,感谢你的两次回复。。到现在还没睡觉呢,所以现在可以安心的去睡了。。3Q谢谢回复的每位朋友。。