API函数入门资料.docx
- 文档编号:24450329
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:102
- 大小:82.47KB
API函数入门资料.docx
《API函数入门资料.docx》由会员分享,可在线阅读,更多相关《API函数入门资料.docx(102页珍藏版)》请在冰豆网上搜索。
API函数入门资料
API函数快速入门--API函数简介--
下一节
作为一个编程初学者来说,API函数也许是一个时常耳闻却感觉有些神秘的东西。
单看它的复杂语法,就足令人望而生畏,但是任何事物在我们深入了解它之前,总是会有这种感觉的。
我们这篇API入门教程的目的,就是要把API函数的来龙去脉告诉大家,破除对API函数的畏惧,使它成为我们编程的好助手。
大家可能在许多书上看到过API的英文全称(ApplicationProgrammingInterface),WIN32API也就是MicrosoftWindows32位平台的应用程序编程接口。
对这个定义的理解,需要追溯到操作系统的发展历史上,当WINDOWS操作系统开始占据主导地位的时候,开发WINDOWS平台下的应用程序成为人们的需要。
而在WINDOWS程序设计领域处于发展的初期,WINDOWS程序员所能使用的编程工具唯有API函数,这些函数是WINDOWS提供给应用程序与操作系统的接口,他们犹如“积木块”一样,可以搭建出各种界面丰富,功能灵活的应用程序。
所以可以认为API函数是构筑整个WINDOWS框架的基石,在它的下面是WINDOWS的操作系统核心,而它的上面则是所有的华丽的WINDOWS应用程序。
(配图1)
但是,那时的WINDOWS程序开发还是比较复杂的工作,程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。
然而随着软件技术的不断发展,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“即见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。
这些优秀可视化编程环境操作简单、界面友好(诸如VB、VC++、DELPHI等),在这些工具中提供了大量的类库和各种控件,它们替代了API的神秘功能,事实上这些类库和控件都是构架在WIN32API函数基础之上的,是封装了的API函数的集合。
它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WINDOWS应用程序开发的过程。
有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。
实际上如果我们要开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用API函数,虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。
这也是API函数使用的场合,所以我们对待API函数不必刻来研究每一个函数的用法,那也是不现实的(能用的到的API函数有几千个呢)。
正如某位大虾所说:
API不要去学,在需要的时候去查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文件,然后才能使用其中的API函数。
如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、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函数的完整声明,然后把它粘贴到程序中即可。
实际上,在DELPHI中调用WIN32API函数与在C或C++中调用WIN32API函数没有大的区别。
DELPHI中将C或C++中引用的WINDOWS.H头文件改写为WINDOWS.PAS单元,使WINDOWSAPI函数的定义符合PASCAL语法。
而其他的头文件在DELPHI中也都有相应的.PAS单元一一对应,所以在DELPHI中调用API函数时,只须将相应的API函数单元加入到USES语句的单元之中,便可直接调用相应的函数了。
下面我们来看一个简单的例子,程序的作用是改变桌面墙纸:
unitUnit1;
interface
{Windows.PAS是DELPHI提供的标准单元,我们要调用API函数,需要引用这个单元}
usesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;
type
TForm1=class(TForm);
Button1:
TButton;
procedureButton1Click(Sender:
TObject);
private{Privatedeclarations}
public{Publicdeclarations}
end;
varForm1:
TForm1;
implementation{$R*.DFM}
procedureTForm1.Button1Click(Sender:
TObject);
varfilename1:
string;
begin
filename1:
='c:
\windows\mywallpaper.bmp';
{调用API函数SystemParametersInfo来设置桌面墙纸的图片文件为'c:
\windows\mywallpaper.bmp'}
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,pchar(filename1),SPIF_UPDATEINIFILE);
end;
end.
其中SystemParametersInfo函数的参数的意义如下表:
参数:
意义
uAction
Longint,指定要设置的参数。
参考uAction常数表
uParam
Longint,参考uAction常数表
lpvParam
不定,按引用调用的Integer、Longint和数据结构。
fuWinIni
参数规定了在设置系统参数的时候,是否应更新用户设置参数
常数SPIF_UPDATEINIFILE表示更新
下面是本例的uAction常数,和使用它的方法:
参数
意义和使用方法
SPI_SETDESKWALLPAPER
设置桌面背景墙纸,用法为:
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,图片路径,1)
好了在DELPHI中调用API函数就是这样简单,我们需要知道的只是API函数的意义和参数列表,然后把它用到程序中就可以了。
需要提醒的是C的数据类型可能会与DELPHI的数据类型有些不同,而调用API函数时必须保证类型一致才行,这是我们必须注意的一点。
今天我们把标准WIN32API函数分类介绍一下,虽然我们不必去刻意研究每个API函数的用法,但是在需要的时候,至少应该知道它属于哪一类的API函数,这样才能正确查找和使用。
按照通常的划分标准,WIN32API函数分为七大类:
1、窗口管理类:
这类API函数向应用程序提供了一些创建和管理用户界面的方法,我们可以使用它们来做出程序的界面。
2、窗口通用控制类:
系统SHELL提供了一些控制,使用这些控制可以使窗口具有与众不同的外观,通用控制是由通用控制库COMCTL32.DLL提供的。
3、SHELL特性类:
应用程序可以使用它们来增强系统SHELL各方面的功能。
4、图形设备接口(GDI):
提供绘图、图形处理、使用显示设备等一系列的API函数。
5、系统服务类:
为计算机提供了访问计算机资源以及底层操作的手段。
6、国际特性类:
有助于我们编写国际化的应用程序,提供Unicode字符集和多语种支持。
7、网络服务类:
允许网络上的不同计算机之间的不同应用程序之间进行通讯,用于在各计算机上创建和管理共享资源的连接。
使窗体右上角的X按钮失效
上面的分类对于我们来说还是显得宽泛了一些,所以本节以后的各节会采用小分类的方法,也就是按具体功能的划分为大家介绍一些常用的API函数的用法。
窗体右上角的X按钮通常用来关闭一个程序,这个小X按钮实际上是和系统菜单的“关闭”菜单项关联在一起的,什么?
不知道什么是系统菜单,系统菜单是指我们点击窗体左上角的小图标时所弹出的菜单,其中好象有“恢复”、“移动”、“最大化”、“最小化”、“关闭”这么几个按钮。
这个菜单用普通的方法是不能编辑和改变的,但是我们可以通过API函数GetSystemMenu来得到它的句柄,然后通过菜单相关的API函数就能改变它了,下面一起看看怎么做吧。
为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:
'-------------------------------------------
'使窗体右上角的X按钮失效
'-------------------------------------------
'洪恩在线求知无限
'-------------------------------------------
'程序说明:
'本例利用API函数GetSystemMenu得到系统菜单的句柄
'X按钮是系统菜单的一菜单项,然后用RemoveMenu函数
'删去这一菜单项,也就是使X按钮失效了。
'-------------------------------------------
'【VB声明】
'PrivateDeclareFunctionGetSystemMenuLib"user32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong
'【说明】
'取得指定窗口的系统菜单的句柄。
在vb环境,“系统菜单”的正式名称为“控制菜单”,即单击窗口左上角的控制框时出现的菜单
'【返回值】
'Long,如执行成功,返回系统菜单的句柄;零意味着出错。
如bRevert设为TRUE,也会返回零(简单的恢复原始的系统菜单)
'【备注】
'在vb里使用:
系统菜单会向窗口发送一条WM_SYSCOMMAND消息,而不是WM_COMMAND消息
'【参数表】
'hwnd-----------Long,窗口的句柄
'bRevert--------Long,如设为TRUE,表示接收原始的系统菜单
PrivateDeclareFunctionGetSystemMenuLib"user32"(_
ByValhwndAsInteger,_
ByValbRevertAsInteger_
)AsInteger
'-------------------------------------------
'【VB声明】
'PrivateDeclareFunctionRemoveMenuLib"user32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong
'【说明】
'删除指定的菜单条目。
如删除的条目属于一个弹出式菜单,那么这个函数不会同时删除弹出式菜单。
首先应该用GetSubMenu函数取得弹出式菜单的句柄,再在以后将其删除
'【返回值】
'Long,非零表示成功,零表示失败。
会设置GetLastError
'【备注】
'强烈建议大家使用vb菜单的visible属性从菜单中删除条目,而不要用这个函数,否则会造成指定菜单中其他菜单条目的visible属性对错误的菜单条目产生影响
'【参数表】
'hMenu----------Long,菜单的句柄
'nPosition------Long,欲改变的菜单条目的标识符。
如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。
如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
'wFlags---------Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数
PrivateDeclareFunctionRemoveMenuLib"user32"(_
ByValhMenuAsInteger,_
ByValnPositionAsInteger,_
ByValwFlagsAsInteger_
)AsInteger
PrivateSubCommand1_Click()
UnloadMe
EndSub
PrivateSubForm_Load()
DimRAsInteger
MyMenu=GetSystemMenu(Me.hwnd,0)
RemoveMenuMyMenu,&HF060,R
EndSub
程序中用到了两个API函数GetSystemMenu、RemoveMenu,其中GetSystemMenu函数用来得到系统菜单的句柄,RemoveMenu用来删除指定的菜单条目,我们先来看看这个函数的声明和参数:
PrivateDeclareFunctionGetSystemMenuLib"user32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong
PrivateDeclareFunctionRemoveMenuLib"user32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong
其中各GetSystemMenu参数的意义如下表:
参数:
意义
hwnd
Long,系统菜单所在窗口的句柄
bRevert
Long,如设为TRUE,表示恢复原始的系统菜单
返回值
Long,如执行成功,返回系统菜单的句柄;零意味着出错。
如bRevert设为TRUE,也会返回零(简单的恢复原始的系统菜单)
而RemoveMenu参数的意义如下表:
参数:
意义
hMenu
Long,菜单的句柄
nPosition
Long,欲改变的菜单条目的标识符。
如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。
如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
wFlags
Long,常数MF_BYCOMMAND=&H0&或MF_BYPOSITION=&H400&,取决于nPosition参数
返回值
Long,非零表示成功,零表示失败。
然后就可以在程序中使用这两个函数了,我们在窗体的Form_Load()过程中加入如下代码:
MyMenu=GetSystemMenu(Me.hwnd,0) '得到系统菜单的句柄,Me.hwnd表示当前窗体的句柄
RemoveMenuMyMenu,&HF060,MF_BYCOMMAND '移去“关闭”菜单项,&HF060“关闭”菜单项的命令ID
接着我们运行程序,看看窗体右上角的X按钮是不是已经不可点击了,系统菜单中的“关闭”项也消失了,很有趣,不过一定记着为程序留一个“退出”按钮哦!
创建和删除快捷方式
OSfCreateShellGroup,OSfCreateShellLink,OSfRemoveShellLink三个API函数存在于VB的一个动态连接库Vb5stkit.dll中,使用它们可以方便的创建桌面上或是开始菜单中的快捷方式。
为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:
'-----------------------------------------------------
'创建和删除快捷方式
'-----------------------------------------------------
'洪恩在线求知无限
'-----------------------------------------------------
'------名称-------------------作用--------------------
'CmdAdd1"创建test程序组快捷方式"按钮
'CmdAdd2"创建桌面快捷方式"按钮
'CmdAdd3"创建开始菜单快捷方式"按钮
'CmdAdd4"创建Test程序组下的快捷方式"按钮
'CmdDel"删除所有快捷方式"按钮
'-----------------------------------------------------
'要在VB中创建Windows的快捷方式,需要用到VB的一个动态链接库
'Vb5stkit.dll。
在该动态链接库中提供了三个函数
'OSfCreateShellGroup、OSfCreateShellLink、OSfRemoveShellLink
'分别用于创建快捷方式程序组、创建快捷方式和删除快捷方式。
'-----------------------------------------------------
PrivateDeclareFunctionOSfCreateShellGroupLib"Vb5stkit.dll"_
Alias"fCreateShellFolder"(ByVallpstrDirNameAsString)AsLong
'lpstrDirName指定了程序组的名称
'-----------------------------------------------------
PrivateDeclareFunctionOSfCreateShellLinkLib"Vb5stkit.dll"_
Alias"fCreateShellLink"(ByVallpstrFolderNameAsString,_
ByVallpstrLinkNameAsString,ByVallpstrLinkPathAsString,ByVallpstrLinkArgumentsAsString)AsLong
'lpstrfoldername指定保存快捷方式的文件夹,默认为“c:
\Windows\startmenu\programs”
'lpstrlinkname指定快捷方式的文件名
'lpstrpathname指定快捷方式所指向的应用程序或文件
'-----------------------------------------------------
PrivateDeclareFunctionOSfRemoveShellLinkLib"Vb5stkit.dll"_
Alias"fRemoveShellLink"(ByVallpstrFolderNameAsString,ByVallpstrLinkNameAsString)AsLong
DimlresultAsLong
PrivateSubCmdAdd1_Click()
DimlresultAsLong
'在程序菜单中添加一个名为Test的程序组
lresult=OSfCreateShellGroup("Test")
EndSub
PrivateSubCmdDel_Click()
DimlresultAsLong
'删除开始菜单上的快捷方式
lresult=OSfRemoveShellLink("..\..\startmenu","记事本")
'删除桌面上的快捷方式
lresult=OSfRemoveShellLink("..\..\deskt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- API 函数 入门 资料