-
API
函数详解
API
函数详解
摘
要
:
p>
什么是
API
你不学
API
,你大概将停留在初级水平,无法往上攀登
API
文本游览器
< br>什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数
<
/p>
一些
API
函数集
正
文
:
API
函数详解
(
转载自红尘如烟
)
标签
:
首先,
有必要向大家讲一讲,什么是
API
。所谓
API
本来是为
C
和
C++
程序员写的。
API
说来说去,就是一种函数,他们包含在一个附加名为
DLL
的动
态连接库文件中。用标
准的定义来讲,
API
< br>就是
Windows
的
32
p>
位应用程序编程接口,是一系列很复杂的函数,
消息和结构,
它使编程人员可以用不同类型的编程语言编制出的运行在
Window
s95
和
Wi
ndows
NT
操作系统上的应用程序。可以说,如果你曾经学过
VC
,那么
API
对你来说不
p>
是什么问题。但是如果你没有学过
VC
,或
者你对
Windows95
的结构体系不熟悉,那么可
以说,学习
API
将是一件很辛苦的事情。
p>
如果你打开
WINDOWS
的
SYSTEM
文
件夹,你可以发现其中有很多附加名为
DLL
的
文件。一个
DLL
中包含的
A
PI
函数并不只是一个,数十个,甚至是数百个。我们能都掌握
它嘛
?
回答是否定的∶不可能掌握。但实际上,我们真的没必要
都掌握,只要重点掌握
Wi
ndos
系
统本身自带的
API
函数就可以了。但,在其中还应当抛开掉同
VB
本身自有的函数
重复的函数。如,
VB
的
etAttr
< br>命令可以获得文件属性,
SetAttr
可以设置文件属
性。
对
A
PI
来讲也有对应的函数
GetFileAttributes
和<
/p>
SetFileAttributes
,
性能都差不多。
如此地
一算,剩下来的也就
5
、
600
个。是的,也不少。但
,我可以敢跟你说,只要你熟悉地掌握
100
个,
那么你的编程水平比现在高出至少要两倍。
尽管人们说
VB
和
WINDOWS
具有密
切的关系,但我认为,
API
更接近
WINDOWS
。如果你学会了
API
,首要的收获便是对
W
INDOWS
体系结构的认识。这个收获是来自不易的。
如果你不依靠
API
会怎么样
?
我可以跟你说,绝大多是高级编程书本
p>
(
当然这不是书的
名程叫高级而高级的,而
是在一开始的《本书内容》中指明《本书的阅读对象是具有一定
V
B
基础的读者》的那些书
)
,首先提
的问题一般大都是从
API
开始。因此可以说,你不学
A
PI
,
你大概将停留
在初级水平,
无法往上攀登。
唯一的途径也许就是向别人求救∶
我快死了,
1-18
API
函数详解
快来救救我呀,
这个怎么办,
那个怎么办
< br>?
烦不烦呢
?
当然,
现在网上好人太多
(
包括我在内,
嘻嘻
)
,但,你应当明白,通过此途径,你的手中出不
了好的作品。这是因为缺乏这些知识
你的脑子里根本行不成一种总体的设计构思。
API
文本游览器
很多<
/p>
API
函数都是很长很长的。
想看什么样
子吗
?
如下就是作为例子的
API <
/p>
DdeClien
tTransaction
函数∶
Declare
Function
DdeClientTransaction
Lib
(pData
As
Byte,
ByVal
cbData
As
Long,
ByVal
hConv
As
Long,
ByVal
hszItem
As
Long,
ByVal
wF
mt
As
Long,
ByVal
wType
As
Long,
ByVal
dwTimeout
As
Long,
pdwResult
As
Long)
As
Long
哇!这么长
?
如果你从来没有接触过
API
,我
想你肯定被吓住了。你也许考虑,该不该
继续学下去。
不过不要
担心,
幸运的是
Microsoft
的
设计家们为我们提供了有用的工具,
这
便是
API
文本查看器。
通过
API
文本查看器,
我们可以方便地查找程序所需要的函数声明、
结构
类型和常数,
然后将它复制到剪贴板,最后再粘贴到
VB
程序的代码段中。在大多数情况下,只要我们确
定了程序所需要的函数
、结构和常数这三个方面后,就可以通过对
API
文本游览器的
以上
操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习
API
最基本的
常识问题,它远远占不到
API
的庞大的体系内容。今后我们把精力浪费
(
这绝不是浪费
)
在
哪里呢
?
那就是∶
什么时候使用什么函数,什么时候
使用什么结构类型,什么时候使用什么常数。
API
函数声明
让我们
回想一下。在
VB
中,如何声明函数呢
?
我想,如果你正在看此文,那么你绝对
能够回答得出这个问题
。以下便是你应该很熟悉的函数声明∶
Function
SetFocus
(ByVal
hwnd
As
Long)
As
Long
即,
这行代码定义了名为
SetFocus
的函数
,
此函数具有一个
Long
型数据类型的参数,
并按值传递
(ByVal),
函数执行后将返回一个<
/p>
Long
型数据。
API
函
数的声明也很类似,如,
API
中的
S
etFocus
函数是这样写的∶
Declare
Function
SetFocus
Lib
Alias
(ByVal
hwnd
As
L
ong)
As
Long
2-18
API
函数详解
有点复杂了一些。是的,是复杂了
点。但我可以告诉你,除了这些多出来的部分,其
他部分还是和你以前学到的东西是一样
的。函数在程序中的调用也是一样。如
:
Dim
dl
As
Long
dl&=SetFoucs()
它不象你自己写的程序那样能够看到里面的运行机理,
也不像<
/p>
VB
自带的函数那样,
能
够从
VB
的联机帮助中查到其用法。唯一的方法就是去
学、查
VB
以外的资料。
Declare
语句用于在模块级别中声明对动态链接库
(DLL)
中外部过程的引用。对此,
你只要记住任何
API
函数声明都必须写这个语句就可以了。
Iib
指明包含所声明过程或函数的动态链接库或代码资源。
也就是说
,
它说明的是,
函
数或过程从何而来的
问题。
如在上例中,
SetFocus Lib
说明
函数
SetFocus
来自
文件。
主要的
dll
动态连接库文件有∶
p>
Windows
管理。生成和管理应用程序的用户接口。
图形设备接口。产生
Windows
设备的图形输出<
/p>
系统服务。访问操作系统的计算机资源。
注意,当
DLL
文件不在
Windows
或
p>
System
文件夹中的时候,必须在函数中说明其
出处
(
路径
)
。如,
SetFocus
Lib
函数声明中的
Alias
是可选的。表示
将被调用的过程在动态链接库
(DLL)
中还有另外的名称
(
p>
别名
)
。
如,
p>
Alias
,
说
明
SetFocus
函数在
中的另外一个名称是,
SetFocus
。怎么两个名都一样呢
?
当然,也可以是不同
的。在很多情况下,
Alias
说明的函
数名,即别名最后一个字符经常是字符
A
,如
SetWindowsText
函数的另一个名称是
S
et
WindowsTextA,
表示为
Alias
。
这个
A
只不过是设计家们的习惯的
命名约定,表示函数属于
ANSI
版本。
那么,
别
名究竟有什么用途呢
?
从理论上讲,
别
名提供了用另一个名子调用
API
的函数
方法。如果你指明了别名,那么
尽管我们按
Declare
语句后面的函数来调用该函数,但在
函
数的实际调用上是以别名作为首要选择的。如,以下两个函数
(Function,AB
CD)
声明都
是有效的,他们调用的是同一个
< br>
SetFocus
函数∶
Declare
Function
SetFocus
Lib
(ByVal
hwnd
As
Long)
As
Long
Declare
ABCD
SetFocus
Lib
Alias
(ByVal
hwnd
As
Long)
As
Long
3-18
API
函数详解
需要注意的是,
< br>选用
Alias
的时候,
应注意
别名的大小写;
如果不选用
Alias
时的时候,
函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声
明是直接从
AP
I
文本游览器中拷贝过
来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。
< br>最后提醒你一句,
API
声明
(
包括结构、常数
)
必须放在窗体或模块
的
通用
(General
Decl
arations)
段。
数据类型与
类型安全
API
函
数中使用的数据类型基本上和
VB
中的一样。
< br>但作为
WIN32
的
API
p>
函数中,
不
存在
I
nteger
数据类型。另外一点是在
API
< br>函数中看不到
Boolean
数据类型。
Variant
数据类型在
API
函数中是以
Any
的形式出现,
如
Data
As
Any
。尽管其含义是允许任意
参数类型作为一个该
AP
I
函数的参数传递,但这样做存在一定的缺点。其原因是,这将会
使得对目标参数的所有类型检查都会被关闭。
这自然会给各种类型的参数调用带来了产
生错
误的机会。
为了强制执行严格的类型检查,并避免上面提到的问题,一个
办法是在函数里使用上
面提到到
Alias
技术。如对
API
函数
GetDIBits
可进行另外一种声明方法。如下∶
GetDIBits
函数的原型∶
Public
Declare
Function
GetDIBits
Lib
Alias
(ByVal
aHD
C
As Long,
ByVal
hBitmap
As
Long, ByVal
nStartScan
As
Long,
ByVal
nNu
mScans
As
Long,
lpBits As Any,
lpBI
As
BITMAPINFO,
ByVal
wUsage
As
Lo
ng)
As
Long
GetDIBits
函数的改型∶
Public
Declare
Function
GetDIBitsLong
Lib
Alias
(ByVal
aHDC
As
Long,
ByVal
hBitmap
As
Long,
ByVal
nStartScan
As
Long,
ByVal
nNumScans
As
Long,
lpBits
As
Long,
lpBI
As
BITMAPINFO,
ByVal
wUsage
As
Long)
As
Long
通过本课程前面所学到的知识,我们已经可以得知原型
GetDIBits
函数也好,改型
GetDIBitsLong
函数也好,
实际将调用的都是
Alias
所指定的
GetDIBits
原函数。
但你
应
当看到,两者的区别在于,我们在改型的函数中强制指定
lp
Bits
参数为
Long
形。这样就<
/p>
会使得函数调用中发生的错误机率减少到了最小。这种方法叫做
<
/p>
安全类型
声明。
API
函
数中经常看到的数据类型有∶
Long,String,Byte,Any....(<
/p>
也就这些吧。
)
4-18
API
函数详解
常
数
对于
API
常数来讲,没有什么太特别的学问。请看
VB
中的以下代码∶<
/p>
Msg
=
MsgBox(
您好
vbOKCanc
el)
我们知道,
vbOKCan
cel
这个常数的值等于
1
。对上面的
代码我们完全可以这样写,而不
会影响代码的功能∶
Msg
=
MsgBox(
您好
1)
但你大概不太愿意选择后一种,因为这会使得看懂代码费劲起
来。这种方法也被
API
采取了。只是
API
常数必须在事情之前做好初始化声明
VB
本身是看不懂的。其内容仍然
来自与
API
文本游览器。具体形式如下等等∶
Public
Const
ABM_ACTIVATE
=
&H6
Public
Const
RIGHT_CTRL_PRESSED
=
&H4
Public
Const
RPC_E_SERVER_DIED
=
&H80010007
Private
Const
RPC_S_CALL_FAILED_DNE
=
1727&
在常数的初始化中,
有
些程序使用
Global
,
如
Global
Const ABM_ACTIVATE
=
&H6
,
但我认为
Public
完全可以代替它。
过去我也用过
Global
,
但现在
不大用了。
一会儿用这个,
一会儿用那个,各程序之间不能保持
一致性了,起码看起来别扭。
结
构
结构是
C
和
C++
语言中的说法。在
VB
中一般称为自定义数据类型。想必很多朋友都
已经认识它。在
API
领域里,我更喜欢把它叫做结构,因为<
/p>
API
各种结构类型根本不是我
定义
p>
(
自定义
)
的。<
/p>
在
VB
中,
API
结构
同样由
TYPE.......END
TYPE
语句来定义。如,在
API
中,点
< br>(P
oint)
结构的定义方法如下
:
Public
Type
POINTAPI
X
As
Long
'
点在
X
坐标
(
横坐标
< br>)
上的坐标值
Y
As
Long
'
< br>点在
Y
坐标
(
< br>纵坐标
)
上的坐标值
End
Type
又如,
API
中矩形
(Rect)
结构的定义如下∶
Public
Type
RECT
Left
As
Long
'
矩形左上角的
X
坐标
5-18
API
函数详解
Top As
Long '
矩形左上
角的
Y
坐标
Right
As Long
'
p>
矩形右下角的
X
坐标
Bottom
As
Long
'
矩形右下角的
Y
坐标
End
Type
这些内容同样可以从
API
文本游览器中拷贝过来。这些结构中的变量名可随意改动,
而不会影响结构本身。也就是说,这些成员变量都是虚拟的。如,
POIN
TAPI
结构可改为
如下∶
Public
Type
POINTAPI
MyX
As
Long
'
点在
X
坐标
(
横坐标
< br>)
上的坐标值
MyY
As
Long
'
< br>点在
Y
坐标
(
< br>纵坐标
)
上的坐标值
End
Type
不过,一般来讲,是没有这种必要的。结构本身是一种数据类
型,因此,使用时必须
声明具体变量为该结构型,
才能在程序中
真正使用到该结构。
结构的声明方法和其他数据的
声明方法一样
,如,以下语句把变
MyPoint
声明为
POINTAPI
结构类型∶
MyPoint
As
POINTAPI
引用结构中的成员变量也十分简单,在结构名后面加上一个
< br>.
然后紧接着写要引用
的成员变
量即可。这很象
VB
中的引用一个对象的某个属性。如,假如我
们把上面已经声明
的
MyPoint
结
构中的
X
变量的值赋给变量
Temp&
则代码如下∶
Temp&=MyPoint.X
但需要特别注意的是,你千万不要认为上例中的
MyPoint
是一个值。它不是值,而是
地址
(
p>
指针
)
。值和地址是完全不同的概念。结构
要求按引用传递给
WINDOWS
函数,即所
< br>有
API
函数中,结构都是按
B
yRef
传递的
(
在
< br>Declare
语句
中
ByRef
是默认型
)
。对于结
构的传递,你不要试图采用
ByVal
,你将一无所获。由于结构名实际上就是指向这个结构
的指针
(
这个结构的首地址
)
,所以
,你也就传送特定的结构名就可以了
(
参见小结,我用红
色字体来突出了这种传递方式
)
。
由于结构传送的是
指针,所以函数将直接对结构进行读写操作。这种特性很适合于把
函数执行的结果装载在
结构之中。
小
结
以下的
程序是为了总结本课中学到的内容而给出的。启动
VB
,新建一
个项目,添加一
6-18
API
函数详解
个命令按钮,并把下面的代码拷贝到代码段中,运行它。
Private
Declare
Function
GetCursorPos
Lib
(lpPoint
As
POINTAPI)
As
Long
Private
Type
POINTAPI
'
定义点
(Point)
结构
X
As
Long
'
点在
X
坐标
(
横坐标
)
上的坐标值
Y
As
Long
'
点在
Y
坐标
(
纵坐标
< br>)
上的坐标值
End
Type
Sub
PrintCursorPos(
)
Dim
dl
AS
Long
Dim
MyPoint
As
POINTAPI
dl&=
GetCursorPos(MyPoint)
'
调用函数,获取屏幕鼠标坐标
&
Str(MyPoint.X)
&
and
&
&
Str(MyPoint.Y)
End
Sub
Private
Sub
Command1_Click()
PrintCursorPos
End
Sub
输出结果为
(
每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处的
位
置而决定
)
∶
X=
240
and
Y=
151
程序中,
GetCursorPos
函数用来获取鼠标指针在屏幕上的位置。
以上例子中,你
可以发现,以参数传递的
MyPpint
结构的内容在函数调用
后发生了实
质性变化。这是由于结构是按
ByRef
传递的原因。
一些
API
函数集
1.
控件与消息函数
AdjustWindowRect
给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小
AnyPopup
判断屏幕上是否存在任何弹出式窗口
ArrangeIconicWindows
排列一个父窗口的最小化子窗口
AttachThreadInput
连接线程输入函数
BeginDeferWindowPos
启动构建一系列新窗口位置的过程
BringWindowToTop
将指定的窗口带至窗口列表顶部
7-18
API
函数详解
CascadeWindows
以层叠方式排列窗口
ChildWindowFromPoint
返回父窗口中包含了指定点的第一个子窗口的句柄
ClientToScreen
判断窗口内以客户区坐标表示的一个点的屏幕坐标
CloseWindow
最小化指定的窗口
CopyRect
矩形内容复制
DeferWindowPos
该函数为特定的窗口指定一个新窗口位置
DestroyWindow
清除指定的窗口以及它的所有子窗口
DrawAnimatedRects
描绘一系列动态矩形
EnableWindow
指定的窗口里允许或禁止所有鼠标及键盘输入
EndDeferWindowPos
同时更新
DeferWindowPos
调用时指定的所有
窗口的位置及状态
EnumChildWindows
为指定的父窗口枚举子窗口
EnumThreadWindows
枚举与指定任务相关的窗口
EnumWindows
枚举窗口列表中的所有父窗口
EqualRect
判断两个矩形结构是否相同
FindWindow
寻找窗口列表中第一个符合指定条件的顶级窗口
FindWindowEx
在窗口列表中寻找与指定条件相符的第一个子窗口
FlashWindow
闪烁显示指定窗口
GetActiveWindow
获得活动窗口的句柄
GetCapture
获得一个窗口的句柄,这个窗口位于当
前输入线程,且拥有鼠标捕获(鼠标
活动由它接收)
GetClassInfo
取得<
/p>
WNDCLASS
结构(或
WNDCLA
SSEX
结构)的一个副本,结构中包
含了与指定类有关的信息
GetClassLong
p>
取得窗口类的一个
Long
变量条目
GetClassName
为指定的窗口取得类名
GetClassWord
为窗口类取得一个整数变量
GetClientRect
返回指定窗口客户区矩形的大小
GetDesktopWindow
获得代表整个屏幕的一个窗口(桌面窗口)句柄
GetFocus
获得拥有输入焦点的窗口的句柄
GetForegroundWindow
获得前台窗口的句柄
GetLastActivePopup
获得在一个给定父窗口中最近激活过的弹出式窗口的句柄
GetLastError
针对之
前调用的
api
函数,用这个函数取得扩展错误信息
8-18
API
函数详解
GetParent
判断指定窗口的父窗口
GetTopWindow
搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄
GetUpdateRect
获得一个矩形,它描叙了指定窗口中需要更新的那一部分
GetWindow
获得一个窗口的句柄,该窗口与某源窗口有特定的关系
GetWindowContextHelpId
取得与窗口关联在一起的帮助场景
ID
GetWindowLong
从指定窗口的结构中取得信息
GetWindowPlacement
获得指定窗口的状态及位置信息
GetWindowRect
获得整个窗口的范围矩形,窗口
的边框、标题栏、滚动条及菜单等都在
这个矩形内
GetWindowText
取得
一个窗体的标题(
caption
)文字,或者一个控件的内容
GetWindowTextLength
调查窗口标题文字或控件内容的长短
GetWindowWord
获得指定窗口结构的信息
InflateRect
增大或减小一个矩形的大小
IntersectRect
这个函数在
lpDestRect
里载入一个矩形,
它是
lpSrc1Rect
与
lpSrc2Re
ct
两个矩形的交集
InvalidateRect
屏蔽一个窗口客户区的全部或部分区域
IsChild
判断一个窗口是否为另一窗口的子或隶属窗口
IsIconic
判断窗口是否已最小化
IsRectEmpty
判断一个矩形是否为空
IsWindow
判断一个窗口句柄是否有效
IsWindowEnabled
判断窗口是否处于活动状态
IsWindowUnicode
判断一个窗口是否为
Unicode
窗口。
这意味着窗口为所有基
于文本的
消息都接收
Unicode
文
字
IsWindowVisible
判断窗口是否可见
IsZoomed
判断窗口是否最大化
LockWindowUpdate
锁定指定窗口,禁止它更新
MapWindowPoints
将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统
MoveWindow
改变指定窗口的位置和大小
OffsetRect
通过应用一个指定的偏移,从而让矩形移动起来
OpenIcon
恢复一个最小化的程序,并将其激活
PtInRect
判断指定的点是否位于矩形内部
9-18
-
-
-
-
-
-
-
-
-
上一篇:刘一男1575考研词汇讲义
下一篇:张起灵的尸化变得频繁