窗体
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不久,所以我找了几小时没找到答案,来请教各位高手了。。有时间帮我看下,谢谢大家了。。
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不久,所以我找了几小时没找到答案,来请教各位高手了。。有时间帮我看下,谢谢大家了。。
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
这是我复制的模块中的源码,没改过,看看有错没
另外声明的API常数与程序中使用的常数无法对应。自定变量是MOUSEMSGS程序中用的却是MouseMsg也无法对应,此程序错误甚多,建议认真对照原作修改。
谢谢大家了。问题已经解决了。。由于自己用了大半夜一句一句敲出来的,所以有些地方可能敲错了。
只能说HOOK这玩意是系统地层的东西,跟一般函数不一样,一旦弄不好整个VB就挂掉了,搞得调试都无从下手,差点把我系统搞坏了,由于调试太多,每次一启动就直接挂掉,还死了一次机。。4楼的哥哥,也许你说的也没错,但是最后我用正确的代码调试了下,不加ByVal也行,加了也行。都正常运行,所以我就把我调试的结果说下,免得有些编友看了对有阴影,非常感谢你的帮助,真心的。猴哥说的解决大部分问题,基本上算是有些东西无法对应上,所以导致出错。。分就给你了,感谢你的两次回复。。到现在还没睡觉呢,所以现在可以安心的去睡了。。3Q谢谢回复的每位朋友。。