在VB中“遥控”鼠标

2008-04-09 04:39:34来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  尽管Windows的API函数在当今“Visual”成风的时代正渐渐被人们忘却,但是正如当年开发高技巧的DOS软件离不开汇编语言和DOS系统功能调用一样,无论开发平台高级到什么地步,只要Windows还在最底层运作,就要用到API函数。无论VB的开发手段多么高明,功能多么强大,但是在现实应用中,总有一些功能的实现是VB无能为力的。微软也早意识到这一点,在VB的诸多版本中始终为API留有一席之地。根据笔者多年的VB开发经验,每当我们为了实现一个功能在VB浩瀚的对象、属性、方法、函数中苦苦搜索最终无功而返时,如果换一个角度,到API函数库中去探寻,往往能得到一个惊喜。

  API函数是应用程序接口函数的缩写。Windows在API函数库中,为用户开发基于Windows的应用程序提供了所需的各种基本功能。API函数库的几百个函数分布在Windows系统的三个动态链接库中。这三个库在Windows3.x中名为“KERNEL”、“USER”和“GDI”,在Windows 95中名为“KERNEL32”、“USER32”和“GDI32”。这些API函数的功能和接口在Windows的编程手册中有系统详尽的说明,也可以从Visual C++ for Windows或Borland C++ for Windows的联机帮助手册中查到。  

  在VB中引用API函数,就像混合语言编程一样,要声明所引用的函数调用接口以及函数所在的动态链接库。声明一个API函数的语法为:

Declare Function 函数名
Lib “库名  ([参数表])
As 返回类型

  如果一个API函数返回值为空(void),可以把它声明为过程:

Declare Sub 过程名
Lib “库名  ([参数表])

  此外,相当一部分API函数的调用参数中用到了Windows系统定义的结构数据类型,这些类型在VB中也要用Type语句定义。 

  好在VB在提供访问API函数功能的同时,也给用户提供了一个友好的工具,可以省去我们声明API函数、定义结构数据类型的绝大部分工作。这个工具在VB5.0中叫“API Text Viewer”。在该工具中,载入“Win32api.txt”后,就可以在“Declares”类中搜索API函数声明,在“Types”类中搜索结构数据类型的定义,或在“Costants”类中搜索API函数中用到的常量定义。把搜索到的声明、定义直接通过剪贴板复制 B程序中比较省力省心。 

  把需要用到的函数声明和相关的数据结构定义以及常数定义加到窗体(Form)的General部分,就可以在程序中像调用普通VB函数一样方便地调用API函数。

  以下从实用的角度出发,援引笔者在实际工作开发中的API应用一例,谨供参考。

  漫游过Windows 3.2的五分钟教程的用户,大概还记得演示鼠标用法。鼠标指针自动随教程的指令移动,自动点开菜单、按动按钮,完全脱离了对物理鼠标器的依赖。这种高级控制技巧在VB的函数和方法中是找不到的,仍然要借助于API函数。  

  本例用API函数实现对鼠标的“遥控”:无论鼠标指针在何处,一个菜单命令Alt-C就能使鼠标指针自动平滑移动到窗口中一个按钮的中心,然后自动按动按钮,激活按钮的Click事件处理过程。掌握了本例的方法后,前面提到的五分钟教程软件就不难制作了。

  本例中,以下几个功能的实现至关重要:获取鼠标光标在屏幕上的位置、获取按钮在屏幕上(注意:不是在窗口中)的位置、移动鼠标光标、自动按下和放开按钮,下面分别介绍。  

  获取鼠标光标在屏幕上的位置和移动鼠标光标,分别需调用API函数GetCursorPos和SetCursorPos。这两个函数的接口声明如下:

Declare Function GetCursorPos Lib “user32  (lpPoint As POINTAPI) As Long Declare Function SetCursorPos Lib “user32  (ByVal X As Long, ByVal Y As Long) As Long

  在SetCursorPos函数中,参数X和Y指定了鼠标光标在屏幕上的坐标。GetCursorPos函数把鼠标光标的当前位置存到结构变量lpPoint中。结构变量的定义如下:

Private Type POINTAPI
X As Long
Y As Long
End Type

  按钮的Left和Top属性给出的是按钮的左上角在窗口客户区坐标系中的坐标位置。要把鼠标光标移到按钮正中,需要得到按钮中心在屏幕坐标系中的坐标位置。窗口客户区坐标系与屏幕坐标系不仅坐标原点不同,二者的坐标单位(scale)也不同。窗口客户区坐标系的单位是Twip,屏幕坐标系单位是Pixel,二者的关系可以从屏幕对象Screen的TwipsPerPixelX和TwipsPerPixelY属性获取。这两个属性分别代表了水平和垂直两个方向上的单位转换比例。  

  把按钮中心在窗口客户区中的坐标单位转换为屏幕坐标系的单位后,还要通过一个API函数进行坐标平移变换,最终取得按钮中心在屏幕坐标系中的坐标位置。这个API函数的接口声明如下:

Declare Function ClientToScreen Lib “user32  (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

  最后一步是自动按下和放开按钮,这是通过模拟鼠标左键的按下和放开来实现的。该功能需调用API函数SendMessage向按钮发一对鼠标左键按下和放开的消息,函数接口声明如下:

Declare Function SendMessage Lib “user32  Alias “SendMessageA  (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

  SendMessage函数的hwnd参数为接收消息的窗口或控件的hwnd句柄。wMsg参数指定具体的消息值。在本例中,要发送鼠标左键按下和释放的消息,wMsg的取值分别为WM_LBUTTONDOWN和WM_LBUTTONUP,这两个常量定义如下:

Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用VB 5.0设计屏幕保护程序

下一篇:利用FormQueryUnload询问视窗