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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

VB调用API函数.docx

1、VB调用API函数VB调用API函数发表于2016/1/13 20:17:36 733人阅读分类:APIAPI函数快速入门-怎样在VB中声明和使用API函数-一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General局部声明它:声明的语法是:Private Declare Function .Private Declare Sub.这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。先添加一个模块如图示,然后采用如下语

2、法声明:Public Declare Function.Public Declare Sub.Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置包括所有的窗体和模块都能直接调用它。声明完毕我们就能在程序中使用此API函数了。二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:1忽略函数返回值的调用:SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3注意此时函数的参数是不加括号的。2Call方法调用:Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)注意这里需要加上括号

3、,但我们不取回函数的返回值。3取得函数返回值的调用:MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)此时需要加上括号,而且我们必须事先定义一个变量变量的类型与函数返回值类型一样来存储API函数的返回值。三、几个问题的说明:1声明中的Lib 和 Alias 是怎么回事一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL动态连接库文件的路径,这样VB才能找到这个DLL文件,然件所在目录、当前工作目录、WINDOWSSYSTEM目录、WINDOWS目录

4、下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串参数中包含String型的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。2常见的API参数类型的说明API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常

5、见的参数类型有:整型Integer、Byte型、String型等。3声明中的ByVal是作什么用的这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值。这样就会发生错误,解决的方法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。4怎样得到完整的API函数声明VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。什么是API首先,有必要向大家讲

6、一讲,什么是API。所谓API本来是为C和C+程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DL

7、L的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否认的不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。尽管人们说VB和

8、WINDOWS具有密切的关系,但我认为,API更接近WINDOWS。如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的本书内容中指明本书的阅读对象是具有一定VB根底的读者的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。唯一的途径也许就是向别人求救我快死了,快来救救我呀,这个怎么办,那个怎么办?烦不烦呢?当然,现在网上好人太多(包括我在内,嘻嘻),但,你应当明白,通过此途径,你的手中出

9、不了好的作品。这是因为缺乏这些知识你的脑子里根本行不成一种总体的设计构思。API文本游览器很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClientTransaction函数Declare Function DdeClientTransaction Lib user32 (pData As Byte, ByVal cbData As Long,ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByValdwTimeout As Long, pd

10、wResult As Long) As Long哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API文本查看器。通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们参加到程序段中,从而程序中可以使用这些函数了。这些是学习API最根本的常识问题,它远远占不到API的庞大的体系内容。

11、今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。API函数声明让我们回想一下。在VB中,如何声明函数呢?我想,如果你正在看此文,那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明Function SetFocus (ByVal hwnd As Long) As Long即,这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。API函数的声明也很类似,如,API中的SetFocus 函数是这样写的Declare Funct

12、ion SetFocus Lib user32 Alias SetFocus (ByVal hwnd As Long) As Long有点复杂了一些。是的,是复杂了点。但我可以告诉你,除了这些多出来的局部,其他局部还是和你以前学到的东西是一样的。函数在程序中的调用也是一样。如:Dim dl As Longdl&=SetFoucs(Form1.Hwnd)但,一点是清楚的。它不象你自己写的程序那样能够看到里面的运行机理,也不像VB自带的函数那样,能够从VB的联机帮助中查到其用法。唯一的方法就是去学、查VB以外的资料。Declare 语句用于在模块级别中声明对动态库 (DLL) 中外部过程的引用。对

13、此,你只要记住任何API函数声明都必须写这个语句就可以了。Iib 指明包含所声明过程或函数的动态库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。如在上例中,SetFocus Lib user32说明 函数 SetFocus 来自 user32.dll文件。主要的dll动态连接库文件有user32.dll Windows管理。生成和管理应用程序的用户接口。GDI32.dll 图形设备接口。产生Windows设备的图形输出Kernel32.dll 系统服务。访问操作系统的计算机资源。注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处(路径)。如,

14、SetFocus Lib c:Mydlluser32函数声明中的Alias 是可选的。表示将被调用的过程在动态库 (DLL)中还有另外的名称(别名)。如,Alias SetFocus ,说明SetFocus函数在User32.dll中的另外一个名称是,SetFocus。怎么两个名都一样呢?当然,也可以是不同的。在很多情况下,Alias说明的函数名,即别名最后一个字符经常是字符A,如SetWindowsText函数的另一个名称是SetWindowsTextA,表示为Alias SetWindowsTextA。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。那么,别名终究有什么用

15、途呢?从理论上讲,别名提供了用另一个名子调用API的函数方法。如果你指明了别名,那么 尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要选择的。如,以下两个函数(Function,ABCD)声明都是有效的,他们调用的是同一个 SetFocus函数Declare Function SetFocus Lib user32 SetFocus (ByVal hwnd As Long) As LongDeclare ABCD SetFocus Lib user32Alias SetFocus (ByVal hwnd As Long) As Long需要注意的是,选用

16、Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从API文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的通用(General Declarations)段。数据类型与类型安全API函数中使用的数据类型根本上和VB中的一样。但作为WIN32的API函数中,不存在Integer数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data

17、As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。为了强制执行严格的类型检查,并防止上面提到的问题,一个方法是在函数里使用上面提到到Alias技术。如对API函数 GetDIBits 可进展另外一种声明方法。如下GetDIBits函数的原型Public Declare Function GetDIBits Lib gdi32 Alias GetDIBits (ByVal aHDC As Long, ByValhBitmap As Long,

18、ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI AsBITMAPINFO, ByVal wUsage As Long) As LongGetDIBits函数的改型Public Declare Function GetDIBitsLong Lib gdi32 Alias GetDIBits (ByVal aHDC As Long,ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long

19、,lpBI As BITMAPINFO, ByVal wUsage As Long) As Long通过本课程前面所学到的知识,我们已经可以得知原型 GetDIBits函数也好,改型 GetDIBitsLong函数也好,实际将调用的都是Alias所指定的 GetDIBits原函数。但你应当看到,两者的区别在于,我们在改型的函数中强制指定lpBits参数为Long形。这样就会使得函数调用中发生的错误机率减少到了最小。这种方法叫做安全类型声明。常 数对于API常数来讲,没有什么太特别的学问。请看VB中的以下代码Msg = MsgBox(您好, vbOKCancel)我们知道, vbOKCancel

20、这个常数的值等于1。对上面的代码我们完全可以这样写,而不会影响代码的功能Msg = MsgBox(您好, 1)但你大概不太愿意选择后一种,因为这会使得看懂代码费劲起来。这种方法也被API采取了。只是API常数必须在事情之前做好初始化声明VB本身是看不懂的。其内容仍然来自与API文本游览器。具体形式如下等等Public Const ABM_ACTIVATE = &H6Public Const RIGHT_CTRL_PRESSED = &H4Public Const RPC_E_SERVER_DIED = &H80010007Private Const RPC_S_CALL_FAILED_DNE

21、= 1727&在常数的初始化中,有些程序使用Global,如Global Const ABM_ACTIVATE = &H6,但我认为Public完全可以代替它。过去我也用过Global,但现在不大用了。一会儿用这个,一会儿用那个,各程序之间不能保持一致性了,起码看起来别扭。结 构结构是C和C+语言中的说法。在VB中一般称为自定义数据类型。想必很多朋友都已经认识它。在API领域里,我更喜欢把它叫做结构,因为API各种结构类型根本不是我定义(自定义)的。在VB中,API结构同样由TYPE.END TYPE语句来定义。如,在API中,点(Point)结构的定义方法如下:Public Type POI

22、NTAPIX As Long 点在X坐标(横坐标)上的坐标值Y As Long 点在Y坐标(纵坐标)上的坐标值End Type又如,API中矩形(Rect)结构的定义如下Public Type RECTLeft As Long 矩形左上角的X坐标Top As Long 矩形左上角的Y坐标Right As Long 矩形右下角的X坐标Bottom As Long 矩形右下角的Y坐标End Type这些内容同样可以从API文本游览器中拷贝过来。这些结构中的变量名可随意改动,而不会影响结构本身。也就是说,这些成员变量都是虚拟的。如,POINTAPI结构可改为如下Public Type POINTAP

23、IMyXAs Long 点在X坐标(横坐标)上的坐标值MyY As Long 点在Y坐标(纵坐标)上的坐标值End Type不过,一般来讲,是没有这种必要的。结构本身是一种数据类型,因此,使用时必须声明具体变量为该结构型,才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样,如,以下语句把变MyPoint声明为POINTAPI结构类型MyPoint As POINTAPI引用结构中的成员变量也十分简单,在结构名后面加上一个,然后紧接着写要引用的成员变量即可。这很象VB中的引用一个对象的某个属性。如,假设我们把上面已经声明的MyPoint结构中的X变量的值赋给变量Temp&如此代

24、码如下Temp&=MyPoint.X但,特别注意的是,你千万不要认为上例中的MyPoint是一个值。它不是值,而是地址(指针)。值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数,即所有API函数中,结构都是按ByRef传递的(在Declare语句 中ByRef是默认型)。对于结构的传递,你不要试图采用ByVal,你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。由于结构传送的是指针,所以函数将直接对结构进展读写操作。这种特性很适合于把函数执行的结果装载在结构小 结以下的程

25、序是为了总结本课中学到的内容而给出的。启动VB,新建一个项目,添加一个命令按钮,并把下面的代码拷贝到代码段中,运行它。Private Declare Function GetCursorPos Lib user32 (lpPoint AsPOINTAPI) As LongPrivate Type POINTAPI 定义点(Point)结构X As Long 点在X坐标(横坐标)上的坐标值Y As Long 点在Y坐标(纵坐标)上的坐标值End TypeSub PrintCursorPos( )Dim dl AS LongDim MyPoint As POINTAPIdl&= GetCursor

26、Pos(MyPoint) 调用函数,获取屏幕鼠标坐标Debug.Print X= & Str(MyPoint.X) & and & Y= & Str(MyPoint.Y)End SubPrivate Sub mand1_Click()PrintCursorPosEnd Sub输出结果为(每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处的位置而决定)X= 240 and Y= 151程序中,GetCursorPos函数用来获取鼠标指针在屏幕上的位置。以上例子中,你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生了实质性变化。一些API函数集Windows APIA

27、djustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWindows 排列一个父窗口的最小化子窗口AttachThreadInput 连接线程输入函数BeginDeferWindowPos 启动构建一系列新窗口位置的过程BringWindowToTop 将指定的窗口带至窗口列表顶部CascadeWindows 以层叠方式排列窗口ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标C

28、loseWindow 最小化指定的窗口CopyRect 矩形内容复制DeferWindowPos 该函数为特定的窗口指定一个新窗口位置DestroyWindow 去除指定的窗口以与它的所有子窗口DrawAnimatedRects 描绘一系列动态矩形EnableWindow 指定的窗口里允许或禁止所有鼠标与键盘输入EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置与状态EnumChildWindows 为指定的父窗口枚举子窗口EnumThreadWindows 枚举与指定任务相关的窗口EnumWindows 枚举窗口列表中的所有父窗口EqualRe

29、ct 判断两个矩形结构是否一样FindWindow 寻找窗口列表中第一个符合指定条件的顶级窗口FindWindowEx 在窗口列表中寻找与指定条件相符的第一个子窗口FlashWindow 闪烁显示指定窗口GetActiveWindow 获得活动窗口的句柄GetCapture 获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获鼠标活动由它接收GetClassInfo 取得WNDCLASS结构或WNDCLASSEX结构的一个副本,结构中包含了与指定类有关的信息GetClassLong 取得窗口类的一个Long变量条目GetClassName 为指定的窗口取得类名GetClassWord

30、为窗口类取得一个整数变量GetClientRect 返回指定窗口客户区矩形的大小GetDesktopWindow 获得代表整个屏幕的一个窗口桌面窗口句柄GetFocus 获得拥有输入焦点的窗口的句柄GetForegroundWindow 获得前台窗口的句柄GetLastActivePopup 获得在一个给定父窗口中最近激活过的弹出式窗口的句柄GetLastError 针对之前调用的api函数,用这个函数取得扩展错误信息GetParent 判断指定窗口的父窗口GetTopWindow 搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄GetUpdateRect 获得一个矩形,它描叙了指定窗口

31、中需要更新的那一局部GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系GetWindowContextHelpId 取得与窗口关联在一起的帮助场景IDGetWindowLong 从指定窗口的结构中取得信息GetWindowPlacement 获得指定窗口的状态与位置信息GetWindowRect 获得整个窗口的X围矩形,窗口的边框、标题栏、滚动条与菜单等都在这个矩形内GetWindowText 取得一个窗体的标题caption文字,或者一个控件的内容GetWindowTextLength 调查窗口标题文字或控件内容的长短GetWindowWord 获得指定窗口结构的信息InflateRect 增大或减小一个矩形的大小IntersectRect 这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集InvalidateRect 屏蔽一个窗口客户区的全部或局部区域IsChild 判断一个窗口是否为另一窗口的子或隶属窗口IsIconic 判断窗口是否已最小化IsRectE

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

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