ImageVerifierCode 换一换
格式:DOCX , 页数:59 ,大小:75.27KB ,
资源ID:6271239      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6271239.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(在VB中使用API函数资料.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

在VB中使用API函数资料.docx

1、在VB中使用API函数资料在VB中使用API函数什么是API-API的描述API声明-如何声明API-API函数-函数的类型消息句柄,坐标,数据结构,.API参数类型-VB中的等价类型Any参数传递-按值调用(ByVal),按引用调用(ByRef),结构,字符串,数组.回调WinProc子类处理-获取错误结果-组合标志位处理参数如何认识API函数?-一个例子结束语什么是API?API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB

2、中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print.VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用Te

3、xtOut 这个API函数.同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll.).API 声明正如在什么是API中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32a

4、pi.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择声明,找到所需函数,点击添加(Add)并复制(Copy),然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.你将会遇到一些问题:假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误.Declare 语句不允许作为类或对象模块中的 Public 成员.看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function.).-不要忘了,可是这将

5、使该函数只在该窗体模块可用.在有些情况下,你会得到不明确的名称这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.消息(Messages)好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用

6、户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.所有发送的消息都有四个参数-一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)但是,当消息发送给你时你为什么看不到呢-就象有人在偷你的信一样?请先别恼火,让我告诉你.小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Ev

7、ent).这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB好意地进行了转换而使你不得不重新转换.你可能会问-我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass

8、)的方法.但你除非必须否则最好不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB的断点调试功能,这可能会导致VB崩溃!)需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通

9、过API Text Viewer查得)以及两个32位的参数.技术文档2.针对API初学者的教程第二篇【 返回首页 】 【上一章】 【下一章】Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句

10、柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3-(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的国际单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValueScreen.TwipsPerPixelXPixelYValue=TwipYValueScreen.TwipsPerPixelYTwipXValue=PixelXVa

11、lue*Screen.TwipsPerPixelXTwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和 TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是 (整除) 而不是 / ,这是因为像素值必须是整数.另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了-API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).V

12、B 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用-是否缺少 ByVal,或者是错误的类型,参数等等.从哪里得到有关函数的说明?这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档.为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M-我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C+中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于

13、与 Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自 VBBooks Online(标题是:C语言声明到Visual Basic的转换)C 语言数据类型在VB中的声明Call withATOMByVal variable As IntegerAn expression that evaluates to an IntegerBOOLByVal variable As LongAn ex

14、pression that evaluates to a LongBYTEByVal variable As Byte An expression that evaluates to a ByteCHARByVal variable As Byte An expression that evaluates to a ByteCOLORREFByVal variable As Long An expression that evaluates to a LongDWORDByVal variable As Long An expression that evaluates to a LongHW

15、ND, HDC,HMENU,etc.(Windows handles)ByVal variable As Long An expression that evaluates to a LongINT, UINTByVal variable As LongAn expression that evaluates to a LongLONGByVal variable As LongAn expression that evaluates to a LongLPARAM ByVal variable As Long An expression that evaluates to a LongLPD

16、WORDvariable As LongAn expression that evaluates to a LongLPINT, LPUINTvariable As LongAn expression that evaluates to a LongLPRECTvariable As typeAny variable of that user-defined typeLPSTR, LPCSTRByVal variable As StringAn expression that evaluates to a StringLPVOIDvariable As AnyAny variable (use

17、 ByVal when passing a string)LPWORDvariable As IntegerAn expression that evaluates to an IntegerLRESULTByVal variable As LongAn expression that evaluates to a LongNULLAs Any orByVal variable As Long ByVal Nothing or ByVal 0& or vbNullStringSHORT ByVal variable As IntegerAn expression that evaluates

18、to an IntegerVOIDSub procedureNot applicableWORDByVal variable As IntegerAn expression that evaluates to an IntegerWPARAMByVal variable As LongAn expression that evaluates to a Long注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示假(False),其他任何值表示真(True).HWND,HDC,HMENU,etc.-etc.指其他所有与于前面所述相似的类型.它们都以

19、H开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以LP开头.LP 是Long Pointer的缩写.因此LPWORD实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以LP开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与 Lparam 很相似但不是Lpara

20、m,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从 VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用 ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在 VB 中把它声明为 SUB.技术文档3.针对API初学者的教程第三篇【 返回首页 】 【上一章】 【下一章】Any有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,

21、用户自定义或其他的类型来传递).这有一个这样的例子:Public Declare Function SendMessage Lib User32 Alias SendMessageA ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as LonglParam 声明为Any并按引用(ByRef)传递.这里是在这个函数中如果lParam是不同类型的值时应遵循的规则:如果该值是传递形式numericByVal(as Long,or as Any)NullByVal(as Long,or as A

22、ny)String ByRef(as String,or as Any)TypeByRef(as Any)array of TypeByRef(as Any)如果你的函数声明同上面的一个而且你想传递一个Long型数,你应该这样写:Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue)注意尽管头三个参数也是数值,但它们前边并没有ByVal.这是因为在函数声明中它们已经被声明为按值传递(ByVal).第四个参数,由于是按引用传递(ByRef)(VB并不知道你要传递参数的类型),因此你必须加上ByVal 你可以使用别名技术来传递不同类型的参数:Pub

23、lic Declare Function SendMessageLng Lib User32 Alias SendMessageA(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long或:Public Declare Function SendMessageStr Lib User32 Alias SendMessageA(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as

24、String) as Long注意API参数类型本身是不会改变的.例子中的第四个参数总是一个4字节的长型数.当你按值(ByVal)传递一个Long或 Null时,该4字节长的数值就直接传递给函数.如果你传递一个String或其他的什么,你是按引用(ByRef)传递,VB传递的实际上是变量的地址,也是4个字节.参数传递你已经知道如何传递参数了,只需把他放到调用的函数中即刻.然而,当你使用API函数时,在传递参数是有一些你应该注意的 细节. ByVal还是ByRef.通常情况下,你不用为此担心,VB的API浏览器已经为你做好了一切,只需你输入数值它就会照所声明的方式传递.总的来说,ByVal是把实

25、际的数值传递给函数,而ByRef是把地址传给函数.唯一的麻烦就是 Any 类型. 把字符串传递给API函数也并不难.API函数需要的是字符串首字符的地址,然后读取该地址直到遇到一个Null字符.听起来很糟糕,但只是VB处理字符串的实际方法.你唯一要记住的是一定要按引用传递(ByRef)字符串 当你想得到所需的函数返回值信息时,情况有稍微的一点不同.这里是GetComputerName函数的声明:Declare Function GetComputerName Lib kernel32 Alias GetComputerNameA(ByVal lpBuffer As String, nSize

26、As Long) As Long第一个参数是一个指向字符串的远程指针,第二个参数是字符串的长度.如果你只是简单的声明一个字符串类型的变量并把它传递给函数,就会出现错误.因此,你首先需要初始化字符串.这里是如何得到计算机名字的例子: Dim Buffer As StringBuffer = Space(255)Ret& = GetComputerName(Buffer, Len(Buffer)if Ret& 0 then CompName$ = Left(Buffer, Ret&)在这里,待传递的字符串被初始化为有255个空格的字符串.我们把它传递给函数同时还有它的长度.如果出错则返回值为0.C

27、ompName中将保存计算机名. 有些函数也需要传递数组,这里是一个例子:Declare Function SetSysColors Lib user32 Alias SetSysColors (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long最后两个参数是Long型数组.为了传递数组,你只需传递它的第一个元素.下面是示例代码:Const COLOR_ACTIVECAPTION = 2Const COLOR_INACTIVECAPTION = 3Const COLOR_CAPTIONTEXT =

28、 9Const COLOR_INACTIVECAPTIONTEXT = 19Dim SysColor(3) As LongDim ColorValues(3) As LongDim Ret& SysColor(0) = COLOR_ACTIVECAPTIONSysColor(1) = COLOR_INACTIVECAPTIONSysColor(2) = COLOR_CAPTIONTEXTSysColor(3) = COLOR_INACTIVECAPTIONTEXTColorValues(0) = RGB(58, 158, 58) 深绿ColorValues(1) = RGB(93, 193,

29、93) 浅绿ColorValues(2) = 0 黑色ColorValues(3) = RGB(126, 126, 126) 灰色Ret& = SetSysColors(4&, SysColor(0), ColorValues(0)该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.技术文档4.针对API编程初学者的教程第四篇【 返回首页 】 【上一章】 【下一章】回调(CallBacks)所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处

30、理参数,并给你返回值.回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:Declare Function EnumWindows Lib User32ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.VB 5.0已经提供了一个很有用的操作符 AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错:FuncP = AddressOf MyFunction因此你必须这样调用EnumWindows函数:Success& = EnumWindows(AddressOf cbFunc, 58&)你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:Function cbFunc (ByVal Hwnd, ByVal lParam) as Long这里是一个回调的例子:Private Declare Function GetWindowText Lib user32 Alias GetWindowText

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1