手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

在VB中“遥控”鼠标

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  把这两个消息发送给一个按钮,按钮就会像真的被鼠标左键单击了一样。SendMessage函数中的后两个参数在本例中可以不理,简单置0即可。

  还有一点细节需注意。如果连续给按钮发送一对WM_LBUTTONDOWN和WM_LBUTTONUP消息,Windows会来不及进行一些必要的系统操作,这样在视觉上就看不出按钮被按下后又放开的效果,好像按钮没有按动。但按钮的Click事件处理过程被激活执行表明按钮确实被按过。为了达到视觉上的完美效果,我们不妨在WM_LBUTTONDOWN和WM_LBUTTONUP两个消息之间插入一段短短的延时,比如说200毫秒,在这段延时期间,把处理权交给Windows,这样Windows就有时间显示按钮被按下的效果了。插入延时的办法有很多,可以加入一段空循环或利用计时器控件,这里再介绍一个API函数GetTickCount,该函数获取自Windows启动至被调用时所经过的毫秒数。利用这个函数控制延时,不仅精确,而且节省资源。GetTickCount函数的接口声明如下:

Declare Function GetTickCount Lib “kernel32  () As Long  

  下面进行窗体设计。我们在窗体Form1中安插一个按钮Command1。Command1的Click事件处理过程调用VB的Beep产生一声蜂鸣。另外在Form1的主菜单上加上一个ClickButton的菜单命令,热键设为Alt-C,该菜单命令的事件处理过程完成对鼠标光标的遥控。 

  最后给出Form1的完整程序清单:

Begin VB.Form Form1
BorderStyle = 1 Fixed Single
Caption = “Auto-click demonstration 
ClientHeight = 3195
ClientLeft = 150
ClientTop = 720
ClientWidth = 4680
LinkTopic = “Form1 
MaxButton = 0 False
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 Windows Default
Begin VB.CommandButton Command1
Caption = “Click me! 
Height = 495
Left = 1740
TabIndex = 0
Top = 1380
Width = 1215
End
Begin VB.Menu mnuClickButton
Caption = “&ClickButton 
End
End
Attribute VB_Name = “Form1 
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Type POINTAPI
X As Long
Y As Long
End Type
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
Dim ButtonPos As POINTAPI
Private Declare Function GetCursorPos Lib “ user32  (lpPoint As POINTAPI) As
ongPrivate Declare Function SetCursorPos Lib “user32  (ByVal X As Long,
yVal Y As Long) As Long
Private Declare Function SendMessage Lib “ user32  Alias “SendMessageA 
ByValhwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
s LongPrivate Declare Function ClientToScreen Lib “user32  (ByVal hwnd As
ong, lpPoint As POINTAPI) As Long
Private Declare Function GetTickCount Lib “ kernel32  () As Long
Private Sub Command1_Click()
Beep
End Sub
Private Sub Form_Load()
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
Private Sub mnuClickButton_Click()
Const MoveStep As Integer = 50
Dim CursorPos As POINTAPI
Dim DistX As Double, DistY As Double
Dim tmp As Long
Dim i As Integer
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 MoveStep
PosX = CursorPos.X+DistX*i / MoveStep
PosY = CursorPos.Y+DistY*i / MoveStep
tmp = SetCursorPos(PosX, PosY)
Next i
tmp = SendMessage(Command1.hwnd,
M_LBUTTONDOWN, 0, 0)
TickCount = GetTickCount()
While GetTickCount() - TickCount < 200
mp = DoEvents()
Wend
tmp = SendMessage(Command1.hwnd,
WM_LBUTTONUP, 0, 0)
End Sub  

  笔者所用的操作系统为Windows 95,开发环境为VB企业版5.0。以上两例已调试运行成功,所介绍的方法同样适用于Windows 3.x下的VB 3.0和VB 4.0。

  API函数在Windows程序开发中的地位就相当于DOS的INT 21H系统功能调用,无论高级语言、可视平台,最终都要归结于对这些底层功能的调用。我们开发高级的应用软件不能纯粹依赖这些底层调用(当然不是技术上实现不了,而是工作量吃不消),但也不能彻底撇开,就像盖楼时既要充分利用大量的预制件,也要用最基本的泥砂砖石一样。

155

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!