VB调用API函数.docx

上传人:b****5 文档编号:6776046 上传时间:2023-01-10 格式:DOCX 页数:13 大小:30.79KB
下载 相关 举报
VB调用API函数.docx_第1页
第1页 / 共13页
VB调用API函数.docx_第2页
第2页 / 共13页
VB调用API函数.docx_第3页
第3页 / 共13页
VB调用API函数.docx_第4页
第4页 / 共13页
VB调用API函数.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

VB调用API函数.docx

《VB调用API函数.docx》由会员分享,可在线阅读,更多相关《VB调用API函数.docx(13页珍藏版)》请在冰豆网上搜索。

VB调用API函数.docx

VB调用API函数

VB调用API函数

发表于2016/1/1320:

17:

36 733人阅读

分类:

 API

API函数快速入门--怎样在VB中声明和使用API函数--    一、在VB中声明API函数有两种方法:

如果我们只在某个窗体中使用API函数,我们可以在窗体代码的

General局部声明它:

 

  声明的语法是:

  PrivateDeclareFunction...  PrivateDeclareSub.....  这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。

 

  如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中

声明了。

  先添加一个模块〔如图示〕,  然后采用如下语法声明:

  PublicDeclareFunction....  PublicDeclareSub....  Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置〔包括所有的窗

体和模块〕都能直接调用它。

声明完毕我们就能在程序中使用此API函数了。

 

  二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:

  〔1〕忽略函数返回值的调用:

    SetWindowPosForm1.hWnd,-2,0,0,0,0,3  注意此时函数的参数是不加括号的。

  〔2〕Call方法调用:

    CallSetWindowPos(Form1.hWnd,-2,0,0,0,3)  注意这里需要加上括号,但我们不取回函数的返回值。

  〔3〕取得函数返回值的调用:

    MyLng=SetWindowPos(Form1.hWnd,-2,0,0,0,3)  此时需要加上括号,而且我们必须事先定义一个变量〔变量的类型与函数返回值类型一样〕来存储

API函数的返回值。

 

  三、几个问题的说明:

 

  〔1〕声明中的Lib和Alias是怎么回事  一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而

Declare语句中的Lib关键字就用来指定DLL〔动态连接库〕文件的路径,这样VB才能找到这个DLL文件,然

件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。

所以如果所要使用

DLL文件不在上述几个目录下的话,我们应该指明其完整路径。

  Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串〔参数中包含String型〕的话

,Alias关键字是必须的。

这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了

保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数

名后加一个大写A作为别名即可。

 

  〔2〕常见的API参数类型的说明  API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回

值都是此类型的值;另外几种常见的参数类型有:

整型Integer、Byte型、String型等。

 

  〔3〕声明中的ByVal是作什么用的  这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数

要求必须采用传值方式来传递函数参数〔这两种参数传递方式是不同的,前者传递的是一个指针,而后者

要求是参数真实的值〕。

这样就会发生错误,解决的方法是在API函数参数声明的前面加上ByVal关键字,

这样VB就采用传值方式传递参数了。

 

  〔4〕怎样得到完整的API函数声明  VB自带了API文本查看器APITEXTVIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴

到程序中即可。

 什么是API

首先,有必要向大家讲一讲,什么是API。

所谓API本来是为C和C++程序员写的。

API说来说去,就是一种

函数,他们包含在一个附加名为DLL的动态连接库文件中。

用标准的定义来讲,API就是Windows的32位应

用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出

的运行在Windows95和WindowsNT操作系统上的应用程序。

可以说,如果你曾经学过VC,那么API对你来说

不是什么问题。

但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将

是一件很辛苦的事情。

如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。

一个DLL中包含的API函

数并不只是一个,数十个,甚至是数百个。

我们能都掌握它嘛?

回答是否认的∶不可能掌握。

但实际上,

我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。

但,在其中还应当抛开

掉同VB本身自有的函数重复的函数。

如,VB的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。

对API来讲也有对应的函数GetFileAttributes和SetFileAttributes,性能都差不多。

如此地一算,剩下来的也就5、600个。

是的,

也不少。

但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。

管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近WINDOWS。

如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。

这个收获是来自不易的。

如果你不依靠API会怎么样?

我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的

,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定VB根底的读者》的那些书),首先提

的问题一般大都是从API开始。

因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。

唯一

的途径也许就是向别人求救∶我快死了,快来救救我呀,这个怎么办,那个怎么办?

烦不烦呢?

当然,现在

网上好人太多(包括我在内,嘻嘻),但,你应当明白,通过此途径,你的手中出不了好的作品。

这是因为

缺乏这些知识你的脑子里根本行不成一种总体的设计构思。

API文本游览器 很多API函数都是很长很长的。

想看什么样子吗?

如下就是作为例子的APIDdeClientTransaction函数∶DeclareFunctionDdeClientTransactionLib"user32"(pDataAsByte,ByValcbDataAsLong,

ByValhConvAsLong,ByValhszItemAsLong,ByValwFmtAsLong,ByValwTypeAsLong,ByVal

dwTimeoutAsLong,pdwResultAsLong)AsLong哇!

这么长?

如果你从来没有接触过API,我想你肯定被吓住了。

你也许考虑,该不该继续学下去。

不过不

要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API文本查看器。

通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪

贴板,最后再粘贴到VB程序的代码段中。

在大多数情况下,只要我们确定了程序所需要的函数、结构和常

数这三个方面后,就可以通过对API文本游览器的以上操作将他们参加到程序段中,从而程序中可以使用

这些函数了。

这些是学习API最根本的常识问题,它远远占不到API的庞大的体系内容。

今后我们把精力浪

费(这绝不是浪费)在哪里呢?

那就是∶什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。

 API函数声明

  

 让我们回想一下。

在VB中,如何声明函数呢?

我想,如果你正在看此文,那么你绝对能够回答得出这个问

题。

以下便是你应该很熟悉的函数声明∶FunctionSetFocus(ByValhwndAsLong)AsLong即,这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),

函数执行后将返回一个Long型数据。

API函数的声明也很类似,如,API中的SetFocus函数是这样写的∶

DeclareFunctionSetFocusLib"user32"Alias"SetFocus"(ByValhwndAsLong)AsLong有点复杂了一些。

是的,是复杂了点。

但我可以告诉你,除了这些多出来的局部,其他局部还是和你以前

学到的东西是一样的。

函数在程序中的调用也是一样。

如:

DimdlAsLongdl&=SetFoucs(Form1.Hwnd)但,一点是清楚的。

它不象你自己写的程序那样能够看到里面的运行机理,也不像VB自带的函数那样,能够从VB的联机帮助中查到其用法。

唯一的方法就是去学、查VB以外的资料。

Declare语句用于在模块级别中声明对动态库(DLL)中外部过程的引用。

对此,你只要记住任何API

函数声明都必须写这个语句就可以了。

Iib指明包含所声明过程或函数的动态库或代码资源。

也就是说,它说明的是,函数或过程从何而来

的问题。

如在上例中,SetFocusLib"user32"说明函数SetFocus来自user32.dll文件。

主要的dll动态连接库

文件有∶user32.dllWindows管理。

生成和管理应用程序的用户接口。

GDI32.dll图形设备接口。

产生Windows设备的图形输出Kernel32.dll系统服务。

访问操作系统的计算机资源。

注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处(路径)。

如,SetFocusLib"c:

\Mydll\user32"函数声明中的Alias是可选的。

表示将被调用的过程在动态库(DLL) 中还有另外的名称(别名)。

,Alias"SetFocus",说明SetFocus函数在User32.dll中的另外一个名称是,SetFocus。

怎么两个名都一样呢?

当然,也可以是不同的。

在很多情况下,Alias说明的函数名,即别名最

后一个字符经常是字符A,如SetWindowsText函数的另一个名称是SetWindowsTextA,表示为Alias"SetWindowsTextA"。

这个A只不过是设计家们的习惯的命名约定,表示函

数属于ANSI版本。

那么,别名终究有什么用途呢?

从理论上讲,别名提供了用另一个名子调用API的函数方法。

如果你指明了

别名,那么尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要

选择的。

如,以下两个函数(Function,ABCD)声明都是有效的,他们调用的是同一个SetFocus函数∶DeclareFunctionSetFocusLib"user32""SetFocus"(ByValhwndAsLong)AsLongDeclareABCDSetFocusLib"user32" Alias"SetFocus"(ByValhwndAsLong)AsLong

需要注意的是,选用Alias的时候,应注意别名的大小写;如果不选用Alias时的时候,函数名必须注意

大小写,而且不能改动。

当然,在很多情况下,由于函数声明是直接从API文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。

最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(GeneralDeclarations)段。

 数据类型与"类型安全" API函数中使用的数据类型根本上和VB中的一样。

但作为WIN32的API函数中,不存在Integer数据类型。

另外一点是在API函数中看不到Boolean数据类型。

Variant数据类型在API函数中是以Any的形

式出现,如DataAsAny。

尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在

一定的缺点。

其原因是,这将会使得对目标参数的所有类型检查都会被关闭。

这自然会给各种类型的参数

调用带来了产生错误的机会。

为了强制执行严格的类型检查,并防止上面提到的问题,一个方法是在函数里使用上面提到到Alias技术

如对API函数GetDIBits可进展另外一种声明方法。

如下∶GetDIBits函数的原型∶PublicDeclareFunctionGetDIBitsLib"gdi32"Alias"GetDIBits"(ByValaHDCAsLong,ByVal

hBitmapAsLong,ByValnStartScanAsLong,ByValnNumScansAsLong,lpBitsAsAny,lpBIAs

BITMAPINFO,ByValwUsageAsLong)AsLongGetDIBits函数的改型∶

PublicDeclareFunctionGetDIBitsLongLib"gdi32"Alias"GetDIBits"(ByValaHDCAsLong,

ByValhBitmapAsLong,ByValnStartScanAsLong,ByValnNumScansAsLong,lpBitsAsLong,

lpBIAsBITMAPINFO,ByValwUsageAsLong)AsLong通过本课程前面所学到的知识,我们已经可以得知原型GetDIBits函数也好,改型GetDIBitsLong函数也

好,实际将调用的都是Alias所指定的GetDIBits原函数。

但你应当看到,两者的区别在于,我们在改型

的函数中强制指定lpBits参数为Long形。

这样就会使得函数调用中发生的错误机率减少到了最小。

这种方

法叫做"安全类型"声明。

常数

  

 对于API常数来讲,没有什么太特别的学问。

请看VB中的以下代码∶Msg=MsgBox("您好",vbOKCancel)我们知道,vbOKCancel这个常数的值等于1。

对上面的代码我们完全可以这样写,而不会影响代码的功能

∶Msg=MsgBox("您好",1)但你大概不太愿意选择后一种,因为这会使得看懂代码费劲起来。

这种方法也被API采取了。

只是API常数

必须在事情之前做好初始化声明VB本身是看不懂的。

其内容仍然来自与API文本游览器。

具体形式如下等等∶

PublicConstABM_ACTIVATE=&H6PublicConstRIGHT_CTRL_PRESSED=&H4PublicConstRPC_E_SERVER_DIED=&H80010007PrivateConstRPC_S_CALL_FAILED_DNE=1727&在常数的初始化中,有些程序使用Global,如GlobalConstABM_ACTIVATE=&H6,但我认为Public完全

可以代替它。

过去我也用过Global,但现在不大用了。

一会儿用这个,一会儿用那个,各程序之间不能保

持一致性了,起码看起来别扭。

 结构

  

 结构是C和C++语言中的说法。

在VB中一般称为自定义数据类型。

想必很多朋友都已经认识它。

在API领域

里,我更喜欢把它叫做结构,因为API各种结构类型根本不是我定义(自定义)的。

在VB中,API结构同样由TYPE.......ENDTYPE语句来定义。

如,在API中,点(Point)结构的定义方法如下

:

PublicTypePOINTAPIXAsLong'点在X坐标(横坐标)上的坐标值

YAsLong'点在Y坐标(纵坐标)上的坐标值EndType又如,API中矩形(Rect)结构的定义如下∶PublicTypeRECTLeftAsLong'矩形左上角的X坐标TopAsLong'矩形左上角的Y坐标RightAsLong'矩形右下角的X坐标BottomAsLong'矩形右下角的Y坐标

EndType这些内容同样可以从API文本游览器中拷贝过来。

这些结构中的变量名可随意改动,而不会影响结构本身

也就是说,这些成员变量都是虚拟的。

如,POINTAPI结构可改为如下∶PublicTypePOINTAPIMyX AsLong'点在X坐标(横坐标)上的坐标值MyYAsLong'点在Y坐标(纵坐标)上的坐标值EndType不过,一般来讲,是没有这种必要的。

结构本身是一种数据类型,因此,使用时必须声明具体变量为该结

构型,才能在程序中真正使用到该结构。

结构的声明方法和其他数据的声明方法一样,如,以下语句把变

MyPoint声明为POINTAPI结构类型∶

MyPointAsPOINTAPI引用结构中的成员变量也十分简单,在结构名后面加上一个".",然后紧接着写要引用的成员变量即可。

这很象VB中的引用一个对象的某个属性。

如,假设我们把上面已经声明的MyPoint结构中的X变量的值赋给

变量Temp&如此代码如下∶Temp&=MyPoint.X但,特别注意的是,你千万不要认为上例中的MyPoint是一个值。

它不是值,而是地址(指针)。

值和地址是完全不同的概念。

结构要求按引用传递给WINDOWS函数,即所有API函数中,结构都是按ByRef传递的(在Declare语句中ByRef是默认型)。

对于结构的传递,你不要试图采用

ByVal,你将一无所获。

由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就

传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。

由于结构传送的是指针,所以函数将直接对结构进展读写操作。

这种特性很适合于把函数执行的结果装载

在结构 小结

 以下的程序是为了总结本课中学到的内容而给出的。

启动VB,新建一个项目,添加一个命令按钮,并把下

面的代码拷贝到代码段中,运行它。

PrivateDeclareFunctionGetCursorPosLib"user32"(lpPointAs POINTAPI)AsLongPrivateTypePOINTAPI'定义点(Point)结构XAsLong'点在X坐标(横坐标)上的坐标值YAsLong'点在Y坐标(纵坐标)上的坐标值EndTypeSubPrintCursorPos()DimdlASLongDimMyPointAsPOINTAPIdl&=GetCursorPos(MyPoint)'调用函数,获取屏幕鼠标坐标

Debug.Print"X="&Str(MyPoint.X)&"and"&"Y="&Str(MyPoint.Y)EndSubPrivateSubmand1_Click()PrintCursorPos

EndSub

输出结果为(每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处的位置而决定)∶X=240andY=151

程序中,GetCursorPos函数用来获取鼠标指针在屏幕上的位置。

以上例子中,你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生了实质性变化。

一些API函数集

WindowsAPI

 

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

ClientToScreen判断窗口内以客户区坐标表示的一个点的屏幕坐标CloseWindow最小化指定的窗口CopyRect矩形内容复制DeferWindowPos该函数为特定的窗口指定一个新窗口位置DestroyWindow去除指定的窗口以与它的所有子窗口DrawAnimatedRects描绘一系列动态矩形EnableWindow指定的窗口里允许或禁止所有鼠标与键盘输入EndDeferWindowPos同时更新DeferWindowPos调用时指定的所有窗口的位置与状态EnumChildWindows为指定的父窗口枚举子窗口

EnumThreadWindows枚举与指定任务相关的窗口EnumWindows枚举窗口列表中的所有父窗口EqualRect判断两个矩形结构是否一样FindWindow寻找窗口列表中第一个符合指定条件的顶级窗口FindWindowEx在窗口列表中寻找与指定条件相符的第一个子窗口FlashWindow闪烁显示指定窗口GetActiveWindow获得活动窗口的句柄GetCapture获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获〔鼠标活动由它接收〕GetClassInfo取得WNDCLASS结构〔或WNDCLASSEX结构〕的一个副本,结构中包含了与指定类有关的信息

GetClassLong取得窗口类的一个Long变量条目GetClassName为指定的窗口取得类名GetClassWord为窗口类取得一个整数变量GetClientRect返回指定窗口客户区矩形的大小GetDesktopWindow获得代表整个屏幕的一个窗口〔桌面窗口〕句柄GetFocus获得拥有输入焦点的窗口的句柄GetForegroundWindow获得前台窗口的句柄GetLastActivePopup获得在一个给定父窗口中最近激活过的弹出式窗口的句柄GetLastError针对之前调用的api函数,用这个函数取得扩展错误信息

GetParent判断指定窗口的父窗口GetTopWindow搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄GetUpdateRect获得一个矩形,它描叙了指定窗口中需要更新的那一局部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