在VB中“遥控”鼠标(2)
2008-04-09 04:39:34来源:互联网 阅读 ()
把这两个消息发送给一个按钮,按钮就会像真的被鼠标左键单击了一样。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标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用VB 5.0设计屏幕保护程序
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
