分享
 
 
 

Visual Basic调用Windows API函数的应用举例

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Visual Basic调用Windows API函数的应用举例

【 摘 要】

本 文 介 绍 了 利 用Visual Basic 调 用 Windows API 函 数 的 方 法, 并 通 过 举 例 介 绍 部 分

API 函 数 的 功 能 。 例 如:VB 程 序 私 有 初 始 化 参 数 的 存 取, 及 当 前 系 统 信 息 的 检 测。

【 关 键 字】

Windows Microsoft( 微 软) 公 司 的 视 窗 系 统。

Visual Basic(VB) Microsoft( 微 软) 公 司 的 可 视 化 编 程 工 具。

API(Application Program Interface) 应 用 程 序 接 口。

初 始 化 文 件( 例 如:DEMO.INI)

【 正 文 】

一、 利 用VB 调 用API 函 数 的 方 法。

(1) 用Declare 语 句 申 明 所 要 调 用 的API 函 数, 若 该 函 数 务 返 回 值, 可 申 明 为Sub 过 程; 若 有 返 回 值, 则 可 申 明 为Function 函 数。

注: 所 有 的API 函 数 的 申 明 都 在 .\VB\WINAPI\WIN31API.HLP 中, 只 需 用Copy 和 Paste 的 方 法 即 可 放 到 相 应 的 地 方。

(2) 一 旦 申 明 了 某 一 个API 函 数 后, 就 可 以 象 调 用VB 的 函 数 一 样。 但 需 注 意, 如 果 参 数 传 递 不 对, 可 能 会 导 致 死 机。

二、 VB 程 序 私 有 初 始 化 参 数 的 存 取。

Windows 软 件 的 初 始 化 参 数 的 获 取 与 保 存 是 通 过 读 取 扩 展 名 为 .INI 的 文 本 文 件 来 实 现 的, 即 程 序 运 行 前 先 从 指 定 的INI 文 件 中 搜 索 到 所 需 的 参 数, 并 反 映 到 程 序 的 运 行 环 境 中; 当 程 序 退 出 时 又 将 当 前 的 环 境 参 数 保 存 到 指 定 的INI 文 件 中。Windows 提 供 的API 函 数 中 的GetPrivateProfileString 和WritePrivateProfileString 就 有 这 些 功 能。

说 明:

(1) GetPrivateProfileString 声 明:Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String,ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

功 能: 获 取INI 文 件 中 与 指 定 关 键 字 对 应 的 参 数( 字 符 串 性) 并 将 此 参 数 拷 贝 到lpReturnedString 中。

参 数

类 型

说 明

lpApplicationName

String

待 寻 找 的 关 键 字 所 在 的 段

lpKeyName

String

与 参 数 相 对 应 的 关 键 字 名

lpDefault

String

指 定 的 关 键 字 不 存 在 时 返 回 的 缺 省 值

lpReturnedString

String

预 先 分 配 好 的 长 度 至 少 为nSize 字 节 的 字 符 串 缓 冲 区

nSized

Integer

将 要 装 入lpReturnedString 缓 冲 区 的 最 大 字 符 数

lpFileName

String

初 始 化 文 件 的 名 字

返 回 值

Integer

拷 贝 到lpReturnedString 缓 冲 区 的 字 符 数

(2)WritePrivateProfileString

声 明:Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

功 能: 在 初 始 化 文 件 的 指 定 关 键 字 项 内 设 置 参 数( 字 符 串)。

返 回 值: 如 果 设 置 成 功, 返 回TRUE; 否 则 返 回FALSE。

三、 VB 检 测 当 前 系 统 信 息

所 需 的API 函 数 有GetWindowsDirectory,GetWinFlags,GetVersion,GetSystemDirectory, 等, 具 体 的 使 用 方 法 可 见 举 例。

四、 举 例

DEMO.PRJ

( 一) 建 立 项 目 文 件DEMO.PRJ; 建 立 模 块 文 件DEMO.BAS. 并 将 下 列 声 明 插 入 到DEMO.BAS 中。

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Declare Function GetKeyboardType Lib "user32" (ByVal nTypeFlag As Long) As Long

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Declare Function GetVersion Lib "kernel32" () As Long

Declare Function GetWinflags Lib "kernel32" () As Long

注:

GetWindowsDirectory: 该 函 数 获 取Windows 目 录 的 路 径。

GetSystemDirectory: 该 函 数 获 取Windows 系 统 子 目 录 的 路 径。

GetVersion: 该 函 数 返 回 当 前Windows 版 本 号 和DOS 版 本 号。 返 回 值 的 低 位 字 节 说 明Windows 主 版 本 号, 返 回 值 的 低 位 字 的 高 位 字 节 说 明Windows 副 版 本 号, 高 位 字 的 低 位 字 节 说 明DOS 副 版 本 号, 高 位 字 的 高 位 字 节 说 明DOS 主 版 本 号。

4、 GetWinflags: 该 函 数 返 回Windows 运 行 系 统 上 的 内 存 配 置。

返 回 标 志 值

含 意

WF_80X87

Intel 数 字 协 处 理 器

WF_CPU386

80386 CPU

WF_CPU486

80486 CPU

WF_ENHANCED

Windows 系 统 运 行 在386 增 强 模 式

WF_PMODE

Windows 系 统 运 行 在 保 护 模 式

WF_STANDARD

Windows 系 统 运 行 在 标 准 模 式

WF_WLO

运 行 在OS/2 下

5、GetKeyboardType(): 该 函 数 得 到 系 统 键 盘 类 型,nTypeFlag=0 时 返 回 键 盘 类 型。

返 回 值

含 意

1

IBM PC/XT 或 兼 容 键 盘

2

Olivetti "ICO" 键 盘(102 个 键)

3

IBM 或 兼 容 键 盘(84 个 键)

4

IBM 增 强 型 或 相 似 键 盘(101 或102 个 键)

5

Nokia 1050 或 相 似 键 盘

6

Nokia 9140 或 相 似 键 盘

7

日 本 键 盘

6、 为 了 调 用 这 些API 函 数 更 加 方 便, 可 以 编 写 一 些 包 含 函 数。 这 些 用 户 自 定 义 函 数 的 功 能 也 需 要 在 模 块 中。

Function SysDir()

Temp = Space$(255)

StringLen = GetSystemDirectory(Temp, 255)

SysDir = Left$(Temp, StringLen)

End Function

___________________________________________________________________________

Function WinDir() As String

Temp = Space$(255)

StringLen = GetWindowsDirectory(Temp, 255)

WinDir = Left$(Temp, StringLen)

End Function

___________________________________________________________________________

Function KeyType()

KbType = GetKeyboardType(0)

Select Case KbType

Case 1

KeyType="IBM PC\XT,or compatible(83key)"

Case 2

KeyType="Olivetti 'ICO'(102key)"

Case 3

KeyType="IBM AT,or similar(84key)"

Case 4

KeyType = "IBM Enhance (101 or 102 keys)"

Case 5

KeyType = "Nokia 1050 or similar"

Case 6

KeyType = "Nokia 1050 or similar"

Case 6

KeyType = "Nokia 9140 or similar"

Case 7

KeyType = "Japan Keyboard"

End Select

End Function

___________________________________________________________________________

Function Initial()

Form1.Left = Val(StringFormINI("Form", "left", "0 ", "c:\windows\demo.ini"))

Form1.Top = Val(StringFormINI("Form", "top", "0 ","c:\windows\demo.ini" ))

Form1.WindowState = Val(StringFormINI("Form", "windowstate", "0 ","

c:\windows\demo.ini"))

End Function

_______________________________________________________________________

Function SaveInfor()

x = WritePrivateProfileString("Form", "left", Str$(Form1.Left),

"c:\windows\demo.ini")

x = WritePrivateProfileString("Form", "top", Str$(Form1.Top),

"c:\windows\demo.ini")

x = WritePrivateProfileString("Form", "windowstate", Str$

(Form1.WindowState), "c:\windows\demo.ini")

End Function

___________________________________________________________________________

Function StringFormINI(SectionName As String, KeyName As String,

Default As String, FileName As String) As String

MaxStringLen% = 255

returnedstr$ = Space$(MaxStringLen%)

Result% = GetPrivateProfileString(SectionName, KeyName,

Default, returnedstr$, MaxStringLen%, FileName)

returnedstr$ = LTrim$(RTrim$(returnedstr$))

returnedstr$ = Left$(returnedstr$, Len(returnedstr$) - 1)

StringFormINI = returnedstr$

End Function

__________________________________________________________________________

Function WinVer()

ver& = GetVersion()

winhigh = ver& Mod 256

winlow = Int(ver& / 256) Mod 256

WinVer = ((winhigh * 100) + winlow) / 100

End Function

___________________________________________________________________________

Function DosVer()

ver& = GetVersion()

Temp = ver& / 65536

doshigh = Int(Temp / 256) Mod 256

doslow = Temp Mod 256

DosVer = ((doshigh * 100) + doslow) / 100

End Function

___________________________________________________________________________

Function CPU()

Flags&=GetWinFlags()

Match=1

Select Case Match

Case (Flags& And &H8)\&H8

CPU=486

Case (Flags& And &H4)\&H4

CPU=386

End Select

End Function

___________________________________________________________________________

Function Mode()

Flags&=GetWinFlags()

If flags& And &H20 Then

Mode="Enhanced"

Else

Mode="Standard"

End If

End Function

( 二) 建 立 窗 体 文 件Form1.frm

Form1.Caption="System Information"

Sub Form_Paint()

Cls

Print

Print , "System Information"

Print

Print , "WindowsDir: ", WinDir()

Print , "SystemDir: ", SysDir()

Print , "WindowsVersion: ", WinVer()

Print , "DosVersion: ", DosVer()

Print , "KeyboardType: ", KeyType()

End Sub

Sub Form_Load()

x = Initial()

End Sub

Sub Form_Unload(Cancel As Integer)

x = SaveInfor()

End Sub

( 三) 运 行 本 程 序。( 本 程 序 在486 兼 容 机Windows3.1 下 通 过)

本 程 序 能 够 检 测 当 前 部 分 系 统 信 息, 在 退 出 时 能 将 窗 口 的 左、 上 位 置 及 窗 口 状 态 记 录 在DEMO.INI 文 件 中, 待 下 次 运 行 时, 窗 口 能 保 持 上 次 退 出 时 的 位 置 和 状 态。

注: 需 要 用 文 本 编 辑 器 编 辑DEMO.INI

[Form]

Left=100

Top=100

Windowstate=0

并 存 在 当 前 系 统Windows 目 录 下。

本 文 仅 仅 是 介 绍 了 一 下API 函 数 的 使 用 方 法, 以 作 抛 砖 引 玉 之 用。 真 正 的 应 用API 函 数, 还 需 要 更 详 尽 的 资 料 和 读 者 更 大 的 努 力。

【 参 考 书 目】

《Windows3.1 API 函 数、 数 据 结 构 和 消 息 详 解》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有