|
本帖最后由 3721 于 2011-5-14 12:05 编辑
第二课:API的声明
这是使用API的一个重要的环节,为了说明API是如何声明的,下面请看一个有趣的程序,请在窗体中放一个按钮,并将下面的代码复制到VB的代码框内。代码如下:
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Const delayTime = 0.4 '延时的秒数
Const secondsInDay = 24& * 60& * 60& '一天的秒数
Sub Delay(delayTime)
'用Do While循环来实现延时
loopFinish = Timer + delayTime
If loopFinish > secondsInDay Then
loopFinish = loopFinish - secondsInDay
Do While Timer > loopFinish
Loop
End If
Do While Timer < loopFinish
Loop
End Sub
Private Sub Command1_Click()
Form1.Caption = "演示进行中"
Delay delayTime
SetCursorPos 200, 200
Delay delayTime
SetCursorPos 300, 300
Delay delayTime
SetCursorPos 400, 400
Delay delayTime
SetCursorPos 300, 400
Delay delayTime
SetCursorPos 300, 500
Delay delayTime
SetCursorPos 400, 600
Delay delayTime
SetCursorPos 300, 500
Delay delayTime
SetCursorPos 400, 400
Form1.Caption = "演示结束"
End Sub
按F5运行,点击一下Command1,你会发现鼠标会自己移动位置,当你看到窗体的标题为演示结束里就可以自主移动鼠标了。
实际上这个程序只有两个核心的东西,一个是用来延时的Sub过程Delay,另一个就是用来控制鼠标位置的API函数SetCursorPos。(注:Delay过程来源于全国计算机等级考试二级教程—Visual Basic语言程序设计)。
我们知道,如果不借助API,光在Visual Basic中来控制鼠标的移动是不可能,API的功能让你有点吃惊了吧,是不是觉得自己又开始进入了一个新的领域?现在来看看API的声明吧:
Public|Private Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type
Public|Private:如何果你把API放在[标准模块(即module中)]中,则可以用Public或不用,不过如果用在窗体模块中,则一定要加上Private。
Declare:用来说明模块级别中声明对动态链接库dll中外部过程的一个引用,API的声明必须用Declare。
Function:这个就不用多说了,说明这是一个函数。如果过程没有返回值,可将其声明为Sub。如果你对Function不了解,点击这里。
Lib:表示指明所声明的外部过程或函数的动态链接或代码的资源来源于何处,在紧接着Lib的后面就指出源DLL文件。指定方法:如果DLL文件是Windows核心库(在Windows或system32文件夹下),则不用加上路径或扩展名(*.dll),但如果DLL文件不是Windows核心库则要使用绝对路径,如Lib "D:\Private\mydll.dll" ,对于常见的系统DLL文件说明如吓:
GDI32.dll:图形设备接口,产生Windows 设备的图形输出
kernd32.dll :系统服务,访问计算机资源
Alias:如果调用的Windows API过程要使用字符串,那么在声明语句中必须增加一个Alias子句,以指定正确的字符集。
ByVal:确保函数声明的完整性ByVal是“按值”调用,参数传递时,不将指向DLL的指针传递给参数变量本身,而是将传递参数值的一份拷贝传递给DLL。比如传递字符串参数时,VB与DLL之间的接口支持两种类型的字符串,如未使用ByVal关键字,VB将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型),而Windows API函数往往不支持这种数据类型,导致错误。而使用ByVal关键字后VB将字符串转变换成C语言格式的“空终止”串,被API正确使用。
对于返回值,如何这个返回值对你有用的话,你可以用一个变量来接收,但如果这个返回值对你没什么用的话,也可以不用,如上例的SetCursorPos。当前如果没有返回值的话可以当Sub过程来调用,即用Call来调用API,如ShellExecute这个API,可以用来打开一个网页,如要打开本站则可以用: Call ShellExecute(Me.hWnd, "open", "http://www.goole.com.cn", "", "", SW_SHOWMAXIMIZED)(注:SW_SHOWMAXIMIZED是常量3)
再次返回到SetCursorPos函数来分析API的声明方法:
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private说明API用在窗体模块,Declare说明这是一个对DLL的引用,Lib说明链接的DLL是user32.dll(一个重要的Windows核心库的一员,手头上暂无其资料),两个ByVal及As Long说明要API将按值调用两个Long对数,即鼠标的X,Y,最后的As Long表明这个函数返回的是Long。
再说明一点,虽然在Window环境下不区分大小写,但由于API由C语言所写,而在C中是区分大小写的,因此在声明时请写API文件阅览器中函数大小写保持一致,以免产生不必要的错误。(即从API文本阅览器中复制过来后不要改变大小写)
有了API阅览器后,我们不能再手动输入长长的API声明了,只要从阅览器中复制过来,这样不是说我们懒,因为这样我们一来节省时间二来减少错误。当然我们对一些功能强大的API名字是要记住的,详细声明就不用了,要的时候再来个复制就好了。
|
评分
-
查看全部评分
|