VB怎么用API函数·详细的?

包括 声明

一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:

声明的语法是:

Private Declare Function ...

Private Declare Sub.....

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

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

先添加一个模块(如图示),

然后采用如下语法声明:

Public Declare Function....

Public Declare Sub....

Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 å£°æ˜Žå®Œæ¯•æˆ‘们就能在程序中使用此API函数了。

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

(1)忽略函数返回值的调用:

SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3

注意此时函数的参数是不加括号的。

(2)Call方法调用:

Call SetWindowPos(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文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。

如下所示:

Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-05-06
API说到底就是一系列的底层函数,是系统提供给 用户用于进入操作系统核心,进行高级编程的途径。通 过在Visual Basic应用程序中声明外部过程就能够 访问Windows API(以及其它的外部DLLs)。在声明 了过程之后,调用它的方法与调用Visual Basic自 己的过程相同。要声明一个DLL过程,需要在代码窗 口的"声明"部分增加一个Declare语句,如果该过 程返回一个值,应将其声明为Function。例如:

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

如果过程没有返回值,可将其声明为Sub。

缺省情况下,在标准模块中声明的DLL过程,可 以在应用程序的任何地方调用它。在其他类型的模块 中定义的DLL过程是模块私有的,必须在它们前面 加上Private关键字,以示区分。特别提请注意的 是,在32位的Visual Basic中过程名是区分大小 写的。而在以前的16位版本中并不区分大小写,这 是初学者容易出错的地方。

Declare语句中的Lib子句用来告诉Visual Basic如何找到包含该过程的dll文件。如果引用的过 程属于Windows核心库(User32、Kernel32或 GDI32),则可以不包含文件扩展名。例如:

Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount"() As Long。对于其它DLL, Lib子句须指定文件的路径及扩展名。

如果调用的Windows API过程要使用字符串,那 么在声明语句中必须增加一个Alias子句,以指定 正确的字符集。包含字符串的Windows API函数实 际有两种格武ANSI格式Unicode格式。因此,在 Windows头文件中,每个包含字符串的函数都同时有 ANSI版本和Unicode版本。

例如,下面是SetWindowText函数的两种C语言描 述。可以看到,第一个描述将函数定义为SetWindowTextA, 尾部的"A"表明它是一个ANSI函数:

SetWindowTextA(HWND hWnd,LPCSTR lpString);

第二个描述将它定义为SetWindowTextW,尾部的 "w"表明它是一个Unicode函数:

SetWindowTextW(HWND Hwnd,LPCWSTR lpString);

因为两个函数实际的名称都不是"SetWindow Text",要引用正确的函数就必须增加一个Alias子句:

Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA"(ByVal hwnd As Longg,ByVal lpString As String) As Long

请注意, Alias子句后面的字符串必须是过程的 真正名称,必须是区分大小写的。事实上,您只需要 记住,只有Windows NT才支持Unicode格式,而 Windows 95只支持ANSI格式就行了。至于两者的区 别,作一般的应用程序开发是不需要了解的。

VB5专业版在VB目录的\Winapi子目录下,用几 个文件提供了关于API的信息。 Win32api.txt文件中 包含了32位Windows API函数中用到的函数和类型的 结构声明以及全局常量的值。用户可以用VB本身带的外 接程序"API浏览器"来方便地使用Win32api.Txt,如下 所示:

点击菜单文件项的"加载文本文件…"从VB目 录下的WINAPI目录中选择"WIN32API.TXT",就可以 查看WINDOWS 95系统的API函数的声明、常数定义和 数据类型了。例如,我们打算查看函数InverRect() 的声明。首先,点击"搜索"按钮,输入字符串 "InverRect"。在"可选项"栏中,兰色的亮度条将移 动到"InverRect"项上。再点按"添加"按钮,在"选 定项"中就出现"InverRect"在Visual Basic中的 声明了。接下来自然是点按"复制"按钮,然后将窗 口切换到Visual Basic开发环境中,在需要声明API 函数的地方Ctrl+V(粘贴)即可。

上面所讲的声明方法虽然简单,但只有使用WIN DOWS本身的API函数才能这样。对于第三方提供的动 态链接库(DLL)您只有用键盘老老实实地敲了。

第二节:牛刀小试

现在读者一定很想自己亲自试一下,下面举两个 实际应用的例子让大家体会一下API的妙用吧!

1.使一个窗体始终保持在屏幕的最上面

我们知道VB本身自带的函数是难以完成此功能 的,我们可以通过调用Windows的API函数: SetWindowPos达到我们的要求。操作步骤如下:

(1)启动VB5建立一个新工程,在该工程中添加一 个模块(Moudel),在该模块中用上述的"API例览器" 添加如下的该API函数的函数声明和常量声明部分:

'API函数声明

Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

'常量声明

Global Const SWP_HIDEWINDOW = &H80

Global Const SWP_NOACTIVATE = &H10

Global Const SWP_NOCOPYBITS = &H100

Global Const SWP_NOMOVE = &H2

Global Const SWP_NOOWNERZORDER = &H200

Global Const SWP_NOREDRAW = &H8

Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER

Global Const SWP_NOSIZE = &H1

Global Const SWP_NOZORDER = &H4

Global Const SWP_SHOWWINDOW = &H40

Global Const HWND_BOTTOM = 1

Global Const HWND_BROADCAST = &HFFFF&

Global Const HWND_DESKTOP = 0

Global Const HWND_NOTOPMOST = -2

Global Const HWND_TOPMOST = -1

Global Const HWND_TOP = 0

Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE

这里以"SWP_"开头的常量是表示窗体所具有的 风格,这些常量可以通过VB中的"OR"操作符组合在 一起。而以"HWND_"开头的常量表示窗体在桌面上的 位置。从这些常量的英文单词的意义上读者应该很容 易理解他们所具有的风格了。所以笔者就不一一去说 明了。至于为什么要添加这些常量而不是别的这就要 您去查看Windows SDK关于该函数的帮助文档了。当 然这对于初学者来说有一定的难度,但不要畏惧,只 要您仔细看帮助就会慢慢搞懂的。因为这些API函数 是为C和C++的编程人员编写的,所以如果您懂一点 C++的话会很容易理解的。

(2)现在只要在您想要此功能的地方调用该函数 就可以了,调用的方法如:

Dim Success as Long

SuccesS=SetwindowPos(me.HWnd. HWND_TOPMOST,0,0,0,0,FLAGS)

若Success返回的值不等于零则表示调用成功。

比如在某个窗体的Load事件中加入上述的两行代 码,就可以达到使该窗体始终位于屏幕最上面的目的。

细心的读者可能已经发现上面的例子中的模块声 明中声明了好几个常量,可为什么只用到三个呢?现 在您可以试着改变一下API函数"SetWindowPos"中 的第二个参数或常量FLAGS中的项,看看您的窗体会 出现什么样的效果?

2.VB5中如何屏蔽掉win95中的CTRL_ALT_DEL, CTRL_ESC, ALT_TAB三组热键通过调用API函数"SystemParametersInfo"来实 现。

首先创建一新工程;在此工程中添加一个窗体和 一个模块;在窗体上拖放两个按钮分别命名为 "cmdDisable","cmdEnable";Copy如下代码入模块中:

Public Declare Function SystemParametersInfo Lib "user32" Ahias "SystemParametersInfoA" (ByVal uAction As Long,ByVal uParam As Long, lpvParam As Any,ByVal fuWinIni As Long)AS Long

Public Const SPI_SCREENSAVERRUNNING=97

在窗体的代码编辑区Copy如下代码:

'使三组热键失效

Private Sub cmdDisable_click()

SystemParametersInfo

SPI_SCREENSAVERRUNNING,True,byVal 1&,0

End Sub

Private Sub Form_Unload(Cancel As Integer)

'程序退出前是热键有效

CndEnable_Click

End Sub

若将此功能和屏幕保护程序结合到一起,那您的屏幕 保护程序一定增色许多。

API函数的简单调用例子就是这么容易,相信现在您 对API的调用已不再感到神秘了,接下来我们就看看一个 比较复杂的应用。

第三节:高手进阶

上面的关于API的调用的例子只是为了带您去Win dows API世界中去探索一下。相信您已探索到了一点眉 目并想去实现一些更"好玩"的东西了。好!下面就向您 介绍一个很"好玩"同时又会使您的程序看起来更专业化 的一个API调用。

相信您的机器上一定装有"金山词霸",试着启动它 您发现了什么?启动画面过后它"不见了"。把鼠标移到 桌面的右下角,原来它以图标的形式"藏在" Windows 的托盘中。用鼠标右击它还会弹出一个菜单功能项供您 选择。现在您一定想把自己的程序也放到托盘,这样您的 程序多具有专业水准!

下面是此功能的实现步骤:

1.这里我们调用的API函数是: "Shell_NotifyIcon",在您的模块中添加如下的函数声明 和常量声明:

'以下常量告诉系统在托盘中您的图标上发生了什么 操作

'常量声明

Public Const WM_MOUSEMOVE = &H200 '在图标上移动鼠标

Public Const WM_LBUTTONDOWN = &H201 '鼠标左键按下

Public Const WM_LBUTTONUP = &H202 '鼠标左键释放

Public Const WM_LBUTTONDBLCLK = &H203 '双击鼠标左键

Public Const WM_RBUTTONDOWN = &H204 '鼠标右键按下

Public Const WM_RBUTTONUP = &H205 '鼠标右键释放

Public Const WM_RBUTTONDBLCLK = &H206 '双击鼠标右键

Public Const WM_SETHOTKEY = &H32 '响应您定义的热键

'API函数声明

Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

'自定义一个调用API Shell_NotifyIcon要用到的类 型"NOTIFYICONDATA"

Public Type NOTIFYICONDATA

cdSize As Long 'NOTIFYICONDATA类型的大小

hwnd As Long '你的应用程序窗体的名柄

uId As Long '应用程序图标资源的ID号

uFlags As Long '使那些参数有效它是以下枚举类型中的

'NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合

uCallbackMessage As Long '鼠标移动时把此消息发给该图标的窗体

hIcon As Long '图标名柄

szTip As String*64 '当鼠标在图标上时显示的Tip文本

End Type

'这是一个枚举类型它告诉API Shell_NotifyIcon去做什么操作

Public Enum enm_NIM_Shell

NIM_ADD=&H40 '在“金碟”中加一图标

NIM_MODIFY=&H1 '修改“金碟”中的图标

NIM_DELETE=&H2 '删除“金碟”中的图标

NIF_MESSAGE=&H1 '使类型"NOTIFYICONDATA"中的uCallbackMessage有效

NIF_ICON=&H2 '使类型"NOTIFYICONDATA"中的hIcon有效

NIF_TIP=&H4 '使类型"NOTIFYICONDATA"中的szTip有效

WM_MOUSEMOVE=&H200 '使鼠标移动消息有效

End Enum

'定义一个"NOTIFYICONDATA"类型的变量

Public nidProgramData As NOTIFYICONDATA

以上是函数及常量声明和自定义的一个类型变量,下 面是此API函数的调用方法:

2. 在窗体上用菜单编辑一个具有如下信息的菜单项:

主菜单:无标题、名称(mainMenu)

子菜单:标题(API编程)、名称(submnul);

标题(退出)、名称(submnu2).

这里只是举个例子,具体的功能你可以根据你的具体需要来编辑此菜单项

3. 在窗体的Load事件中添加如下代码:

Private Sub Form_Load()

'隐藏窗体

With Me

.Top =-10000

.Left = -10000

.WindowState = vbMinimized

End With

'设置类型NOTIFYICONDATA所具有的特征

With nidprogramData

.cbSize = Len(nidProgramData)

.hwnd = Me.hwnd .uld = vbNull

.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE

'触发鼠标移动消息

.uCallbackMessage = WM_MOUSEMOVE

.hIcon = Me.Icon '“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的图标

.szTip ="VB 的 Win32 API 编程" & vbNullChar

End With

'调用该函数

Shell_NotifyIcon NIM_ADD,nidprogramData

End Sub

'根据不同的鼠标消息做不同的操作

Private Sub Form_MouseMove(Button As inte ger, Shift As lnteger, x As Single, Y As Single)

On Error GoTo Form_MouseMove_err:

Dim Result As Long

Dim msg As Long

'X的值依赖与显示模式的设置

If Me.ScaleMode = vbpixels Then

msg = x

Else

msg = x/Screen.TwipsPerPixe1X

End If

Select Case msg

Case WM_LBUTTONUP

'在这里加入鼠标左键释放时你想做的操作

Case WM_LBUTTONDBLCLK

'在这里加入双击鼠标左键时你想做的操作

Case WM_RBUTTONUP

'通常这里弹出你的功能菜单

PopupMenu mainMenu

Case WM_MOUSEISMOVING

'在这里加入鼠标正在移动时你想做的操作

End Select

Exit Sub

Form_MouseMove_err:

'在这里加入你的处理异常错误的代码

End Sub

4.Run你的程序,您是不是看到了象“金山词霸”一样的功能?相信你此时的感觉一定特别“爽”!

API的世界j是丰富多彩的,只要你肯细心地去探索它你一定会获得许多意想不到的好东西。所以笔者觉得定值得每一个具有“好奇”精神的人去探索它。后续的期刊笔者会向读者详细介绍一些更好更“牛”的API调用本回答被网友采纳
第2个回答  2020-03-27

1、在进行Windows系统的编程过程中,如果想要改变标题栏的背景颜色,使其不随系统主题变化,一般来说有两个方法:自己设计标题栏和调用系统API进行处理。

2、要自己设计标题栏,可以设置窗口的边界属性(FormBorderStyle)为None,即不显示边界,此种情况下,窗体默认的标题栏就不会显示。

3、若要调用系统API函数来处理,就需要引入相关API。

4、引入API方法:Declare   Function   SetSysColors   Lib   "user32"   Alias   "SetSysColors"   (ByVal   nChanges   As   Long,   lpSysColor   As   Long,   lpColorValues   As   Long)   As   Long   定义标题栏系统常量:Public   Const   COLOR_ACTIVECAPTION   =   2。

5、在引入API相关函数及定义了要求的系统常量后,直接调用函数即可设置标题栏的背景色,如设置标题栏背景色为红色。

本回答被网友采纳
第3个回答  2013-09-10
我就以获取Windows目录的路径为例子说明一下把先创建一个模块(模块是放全局公用的函数、过程、常数、自定义结构、全局变量等等东西的地方),'声明函数
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
'创建函数过程
Public Function abs1() As String
Dim sBuffer As String '定义
Dim lSize As String '定义
sBuffer = String(255, 0) 'sBuffer为预定预留255个字符,因为在Windows文件名限为255个字符
lSize = GetWindowsDirectory(sBuffer, Len(sBuffer)) '这里sBuffer获得WINDOWS的路径了,Len(sBuffer)是路径的长度,Len(sBuffer)=10
abs1 = sBuffer '命令给出Function abs1()过程的返回值,试试将sBuffer改成lSize
End Function到这里,abs1()已经返回得到了WINDOWS的路径了最后回到工程里调用函数Private Sub Command1_Click()
'调用函数
Label1.Caption = abs1()
End SubAPI函数在VB就是这样用的了
第4个回答  2013-09-10
相似回答