开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5399|回复: 46
收起左侧

API 系列 课程 【第二课】

[复制链接]
发表于 2011-5-14 12:02:21 | 显示全部楼层 |阅读模式   江苏省南京市
本帖最后由 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名字是要记住的,详细声明就不用了,要的时候再来个复制就好了。

评分

参与人数 1精币 +1 收起 理由
bigeq1 + 1 感谢你的支持,精易有你更精彩

查看全部评分

发表于 2011-5-31 16:51:50 | 显示全部楼层   云南省昆明市
神马啊!!还要回复……
回复 支持 反对

使用道具 举报

发表于 2011-6-2 00:48:28 | 显示全部楼层   广西壮族自治区南宁市
接着看第二课
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-7-3 15:21:48 | 显示全部楼层   广东省茂名市
声明..API阅览器可以帮到你
回复 支持 反对

使用道具 举报

签到天数: 24 天

发表于 2011-7-7 06:29:29 | 显示全部楼层   浙江省杭州市
学习了,谢谢楼主分享。
回复 支持 反对

使用道具 举报

发表于 2011-7-7 06:36:44 | 显示全部楼层   湖南省衡阳市
感谢楼主!
回复 支持 反对

使用道具 举报

发表于 2011-7-7 11:56:53 | 显示全部楼层   福建省厦门市
{:3_236:}看了一篇看第二
回复 支持 反对

使用道具 举报

发表于 2011-7-7 23:16:55 | 显示全部楼层   广东省湛江市
点搞呢?我来学习下先
回复 支持 反对

使用道具 举报

发表于 2011-7-13 08:26:12 | 显示全部楼层   广东省湛江市
{:3_227:}{:3_226:}
回复 支持 反对

使用道具 举报

结帖率:29% (9/31)
发表于 2011-7-16 01:46:03 | 显示全部楼层   海南省海口市
学习来了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表