Visual Basic調用Windows API函數的應用舉例

來源:互聯網
上載者:User

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

       註:

  1. GetWindowsDirectory: 該 函 數 獲 取Windows 目 錄 的 路 徑。
  2. GetSystemDirectory: 該 函 數 獲 取Windows 系 統 子 目 錄 的 路 徑。
  3. 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 函 數、 數 據 結 構 和 消 息 詳 解》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.