2024年3月16日发(作者:)

API 示例

API(应用程序编程接口)是 DLL 文件中所包含的一种功能。这些功能

通常由 Windows 和其他应用程序使用,但也可以被最终用户所使用。

注释: 使用 API 调用请多加小心。要注意保存以避免丢失所做的工作。

由于这种功能的设计目的是由系统和应用程序所调用,所以许多错误捕获功能并未实施。

这意味着使用 API 调用时,有可能导致系统挂起、崩溃或其他不可预测的副作用。

下面的示例说明了如何使用基本的 API。已经在 Windows98 和 Excel 中测试通过。

使用这些功能的方式很多,程序员可以自行确定哪种方式更为合适。

检查所有的驱动器盘符

Goto Get_Logical_Drive_String

下面的示例使用“GetLogicalDriveStrings”函数循环通过所有逻辑驱动器。

逻辑驱动器是指软盘、硬盘、CD 驱动器及映射的网络共享。

Option Explicit

Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" _

(ByVal nBufferLength As Long, _

ByVal lpBuffer As String) As Long

Goto Get_System_Metrics

Sub Get_Logical_Drive_String()

Dim DrvString As String

转到Get_Logical_Drive_String 示

Dim TotDrvs As Long

例代码

Dim Counter As Integer

'变量“TotDrvs”返回字符串中总的字符数

TotDrvs = GetLogicalDriveStrings(0&, DrvString)

Goto Get_User_Name

'变量“DrvString”是为存放该字符串而创建的缓冲区

DrvString = String(TotDrvs - 1, " ")

'再次调用“GetLogicalDriveStrings”,用有效数据填充字符串

'示例 "a: c: d: e: "

TotDrvs = GetLogicalDriveStrings(TotDrvs, DrvString)

'解析整个返回的字符串,并在“msgbox”中显示每个盘符

For Counter = 1 To TotDrvs Step 4

Goto Get_Short_Name

MsgBox Mid(DrvString, Counter, 3)

Next Counter

End Sub

返回视频分辨率

下面的示例代码返回当前的屏幕视频分辨率并在消息框中显示信息。

Goto Get_Computer_Name

Option Explicit

Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

'“GetSystemMetrics”中将用到的常数

Const SM_CXSCREEN = 0 ' 屏幕宽度

Const SM_CYSCREEN = 1 ' 屏幕高度

Goto GetDiskFreeSpace

Sub Get_System_Metrics()

转到Get_System_Metrics 示例

Dim XVal As Long, YVal As Long

代码

YVal = GetSystemMetrics(SM_CYSCREEN)

Goto GetSystemDirectory

XVal = GetSystemMetrics(SM_CXSCREEN)

MsgBox "您的屏幕分辨率为:" & XVal & " X " & YVal

End Sub

提取登录名称

Goto Num_Devs

下面的代码将返回当前登录的用户名。

Option Explicit

Private Declare Function GetUserName Lib "" Alias "GetUserNameA" _

(ByVal lpBuffer As String, _

nSize As Long) As Long

Sub Get_User_Name()

Dim lpBuff As String * 25

Goto SetOnTop

转到Get_User_Name 示例代

Dim ret As Long, UserName As String

ret = GetUserName(lpBuff, 25)

UserName = Left(lpBuff, InStr(lpBuff, Chr(0)) - 1)

MsgBox UserName

End Sub

返回长路径和文件名的短路径名

下面的函数获取“长文件名”,返回“短文件名”,并在消息框中

显示两种名称。

Private Declare Function GetShortPathName Lib "" Alias "GetShortPathNameA" _

(ByVal lpctstrLongName As String, _

ByVal lptstrShortName As String, _

ByVal bufLen As Long) As Long

Sub Get_Short_Name()

转到Get_Short_Name 示例

Dim LongStr As String, ShortStr As String

代码

Dim lStrLen As Long, lRet As Long

'变量“LongStr”为指向某一文件的任意长度文件名或变量

LongStr = me

lRet = GetShortPathName(LongStr, ShortStr, lStrLen)

'可以创建一个与返回的字符串长度相同的缓冲区,这样将不必再截去缓冲区左侧即可获取字符串

ShortStr = String(lRet, " ")

lRet = GetShortPathName(LongStr, ShortStr, lRet)

MsgBox LongStr & " 被转换为 " & ShortStr

End Sub

返回计算机名称

下面的代码示例说明如何使用“GetComputerName”函数获取计算机名称。

Option Explicit

Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, _

nSize As Long) As Long

转到Get_Computer_Name

Sub Get_Computer_Name()

示例代码

Dim Comp_Name_B As String * 255

Dim Comp_Name As String

GetComputerName Comp_Name_B, Len(Comp_Name_B)

'但是该字符串始终以空的终止字符串结尾,因此可以用“Chr(0)”函数找到末尾

Comp_Name = Left(Comp_Name_B, InStr(Comp_Name_B, Chr(0)))

'并仅返回计算机名称

MsgBox Comp_Name

End Sub

查找硬盘上的可用自由空间

下面的示例代码说明如何查找可用自由空间及总的硬盘大小。

Option Explicit

Private Declare Function GetDiskFreeSpace Lib "" Alias "GetDiskFreeSpaceA" (ByVal lpRoot As String, _

dwSectors As Long, _

dwBytes As Long, _

dwFreeClusters As Long, _

dwTotalClusters As Long) As Long

Sub Get_Disk_Free_Space()

Dim f As Long, iSectors As Long

转到Get_Disk_Free_Space 示

Dim iTotal As Long, rTotal As Long

例代码

Dim iFree As Long, rFree As Long

Dim iBytes As Long

Dim sName As String, s As String

sName = "C:"

f = GetDiskFreeSpace(sName, iSectors, iBytes, iFree, iTotal)

rFree = iSectors * iBytes * CDbl(iFree)

rTotal = iSectors * iBytes * CDbl(iTotal)

If f Then

s = sName

s = s & " 有 " & Format(rFree, "#,###,###,##0")

s = s & " 字节自由空间,总共有 " & Format(rTotal, "#,###,##0") & " 字节。"

End If

MsgBox s

End Sub

返回系统文件夹位置

下面的代码示例说明如何提取系统文件夹位置。

Option Explicit

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, _

ByVal nSize As Long) As Long

Sub Get_System_Directory()

Dim Sys_Dir As String, Res As Long

Res = GetSystemDirectory(Sys_Dir, 0&)

Sys_Dir = String(Res - 1, " ")

Res = GetSystemDirectory(Sys_Dir, Res)

MsgBox Sys_Dir

End Sub

转到GetSystemDirectory 示

例代码

查找系统有无播放 WAV 文件的能力

下面的示例代码遍历系统以查看是否有播放 WAV 文件的设备能力。

Option Explicit

Declare Function waveOutGetNumDevs Lib "winmm" () As Long

Sub Num_Devs()

Dim i As Long

i = waveOutGetNumDevs()

If i > 0 Then ' 至少有一种设备。

MsgBox "可以播放 Wave 数据"

Else

MsgBox "无法播放 Wave 数据"

End If

End Sub

转到Num_Devs 示例

代码

将 Excel 设置为“总在前面”

下面的示例代码说明如何使 Microsoft Excel“总在前面”。这可以防止其他应用程序

显示在 Microsoft Excel 前面。

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _

ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, _

ByVal hWndInsertAfter As Long, _

ByVal x As Long, _

转到SetOnTop

ByVal y As Long, _

示例代码

ByVal cx As Long, _

ByVal cy As Long, _

ByVal wFlags As Long) As Long

Global Const HWND_TOPMOST = -1

Global Const HWND_NOTOPMOST = -2

Sub SetOnTop()

Dim WinHnd As Long, SUCCESS As Long

WinHnd = FindWindow("xlmain", n)

SUCCESS = SetWindowPos(WinHnd, HWND_TOPMOST, 0, 0, 0, 0, Flags)

'下面一行只是为了 20 秒之后将 Excel 切换回正常操作状态

Now + TimeValue("00:00:20"), "NotOnTop"

End Sub

Sub NotOnTop()

Dim WinHnd As Long, SUCCESS As Long

WinHnd = FindWindow("xlmain", n)

SUCCESS = SetWindowPos(WinHnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags)

End Sub