用自己的意识去“遥控”鼠标

发表于:2007-07-14来源:作者:点击数: 标签:
遥远 所谓用意识去遥控鼠标就是在特定的环境下,通过某种命令,让无论在哪里的鼠标指针都会乖乖的回到你指定的区域里,并执行相应的动作。当然,这一切虽然都是按你的意识去做但绝不会是你自己用手来控制鼠标完成的。说了这些大家可能迷糊了,其实这只是一种
遥远  

所谓"用意识去遥控鼠标"就是在特定的环境下,通过某种命令,让无论在哪里的鼠标指针都会乖乖的回到你指定的区域里,并执行相应的动作。当然,这一切虽然都是按你的意识去做但绝不会是你自己用手来控制鼠标完成的。说了这些大家可能迷糊了,其实这只是一种遥控鼠标的技术,在很多流行的电脑教学软件中常会应用到此技术,比如在软件中进行某种讲解时,里面的鼠标指针不通过鼠标器指令也会伴随着讲解来执行一步一步的动作。这下大家明白了吧,其实在Windows系统中,利用
API就可以轻松的实现上面的遥控鼠标过程!
下面我们就开始对上述过程通过一段程序进行讲解,我们这段程序的目的就是:通过按下键盘的一个组合键,鼠标指针缓慢的移动到指定的按钮上并自动按下相应的按钮来激发某种事件。
就是这么一段过程,明白了吧,下面我们就开始做准备工作吧。首先,我们应该认识在以下程序中要用到的几个API函数,这几个函数,也就是程序的关键所在了:
1 GetCursorPos 获取鼠标指针在屏幕位置的函数。
2 SetCursorPos 移动鼠标指针函数,其参数X,Y指定了鼠标指针在屏幕上的坐标,GetCursorPos函数把鼠标指针当前位置存到了变量lpPoint中。
Private Type POINTAPI
X As Long
Y As Long
End Type
3 ClientToScreen 坐标平移变换函数,引入该函数就是为了取得我们目标按钮控件中心相对于屏幕坐标系的坐标位置。
4 SendMessage 向目标按钮发送执行鼠标左键按下和放开命令的函数,其中设置wMsg参数的取值分别为:WM_LBUTTONDOWN 和 WM_LBUTTONUP。
5 GetTickCount 延时函数,获取Windows启动至被调用时所经过的毫秒数。
然后在窗体中放置两个按钮控件与一个文本控件,再利用VB中的菜单编辑器完成一个热键为Alt-A的菜单。完成后就可以编写代码了:
先利用API查看器写下如下API声明:
Private Type POINTAPI
x As Long
y As Long
End Type

Dim Buttonpos As POINTAPI

Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long

在程序运行时,我们首先要知道目标按钮控件相对于屏幕的坐标,所以在窗体运行时就应该执行如下的代码:
Private Sub Form_Load()
Text1.Text = "按Alt-A组合键开始演示"
Dim tmp As Long
With Command1
Buttonpos.x = (.Left + .Width / 2) / Screen.TwipsPerPixelX
Buttonpos.y = (.Top + .Height / 2) / Screen.TwipsPerPixelY
End With
tmp = ClientToScreen(Me.hwnd, Buttonpos)
End Sub

在本程序运行时,我们要遥控我们的鼠标,所以,我们通过键盘的快截键Alt-A激活菜单Clickbutton的Click事件进行鼠标指针的移动及单击左键运动:
Private Sub numyanshi_Click()
Dim Cursorpos As POINTAPI
Dim DistX As Double, DistY As Double
Dim tmp As Long
Dim i As Long
Dim PosX As Integer, PosY As Integer
Dim TickCount As Long
tmp = GetCursorPos(Cursorpos)
DistX = Buttonpos.x - Cursorpos.x
DistY = Buttonpos.y - Cursorpos.y
For i = 1 To 40000'解释:数值越大,鼠标运动越慢,相应的执行时间也就越长。 
PosX = Cursorpos.x + DistX * i / 40000
PosY = Cursorpos.y + DistY * i / 40000
tmp = SetCursorPos(PosX, PosY)
Next i
tmp = SendMessage(Command1.hwnd, WM_LBUTTONDOWN, 0, 0)
TickCount = GetTickCount()
While GetTickCount() - TickCount < 200
tmp = DoEvents()
Wend
tmp = SendMessage(Command1.hwnd, WM_LBUTTONUP, 0, 0)
End Sub
当按下组合键后,我们会见到鼠标指针慢慢的移动到Command1按钮即目标按钮上,并按下按钮:
Private sub command1_Click()
Beep
text1.text="鼠标左键已经按下,演示完毕!"
End sub
单击Command2按钮退出程序:
Private sub command2_Click()
Unload Me
End sub
好了,以上程序完全完成了我们所期待的一段过程。在W98,VB6.0下调试通过,如果有任何问题欢迎与我联系。(email:mrdayuan@163.net

原文转自:http://www.ltesting.net