?? vb的api編程精粹.txt
字號:
VB的API編程精粹(1)
所謂API就是“應用程序接口”(Application Programing Interface),是一些用C語言編寫,由操作系統自身調用的函數。Windows API函數由許多“動態鏈接庫”或DLL組成。在32位Windows中,核心的Windows
API DLL有如下一些:
gdi32.dll----圖形顯示界面的API。
kernel32.dll----處理低級任務(比如內存和任務管理)的API。
user32.d11----處理窗口和消息(Visual Basic程序員能把其中一些當作事件訪問)的API。
還不斷有新的API出現,處理新的操作系統擴展,比如E-MAIL、聯網和新的外設。
由于Windows API函數不是Visual Basic的內部函數,所以在使用它們之前必須顯式地加以聲明。要想得到正確格式化的函數聲明,可以訪問WINAPI目錄下的文件WIN32API.TXT。
本文只對Win95系統的API函數加以說明并調用Win95的內置功能。
重新啟動計算機的實現
在Windows下安裝過程序的用戶可能都有這樣的體會,當安裝完某些應用程序后,安裝程序會要求重新啟動計算機以使設置生效。那么,如果要用VB程序重新啟動計算機該如何實現呢?其實利用ExitWindowsEx函數即可。
程序的編寫
1.首先運行VB,然后新建一個工程(工程類型為標準EXE),然后雙擊Form1窗體,進入代碼(Code)輸入框,在其中輸入:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved
As Long)As Long
2.點擊“工具箱”中的commandbutton(命令按鈕)工具,即可在窗體Form1中加入一個命令按鈕,然后將該按鈕屬性中的Caption值定義為“重新啟動”。完成之后雙擊該按鈕,進入代碼(code)輸入框輸入以下代碼:
Private Sub Command1_Click()
ExitWindowsEx &H43,0
End Sub
程序的執行
程序輸入完成后,點擊VB“運行”菜單中的“啟動”或“全面編譯”命令,然后點擊“重新啟動”按鈕,即可重新啟動計算機。
磁盤格式化
在Windows 9X中,當用鼠標右鍵單擊“我的電腦”中的“3.5軟盤A”然后在出現的右鍵菜單中選擇“格式化”選項,就將彈出標準的“磁盤格式化”窗口。下面我們來看看如何在應用程序中利用函數輕松調用Windows 95標準的“磁盤格式化”窗口,實現對磁盤相應的操作功能。
程序的編寫
1.與上例相同,首先運行VB,新建一個標準工程,然后利用“工具箱”在Form1窗體中加入一個命令按鈕對象,將該命令按鈕屬性中的Caption值定義為“軟盤格式化”。完成之后雙擊該按鈕,在代碼輸入框中輸入以下代碼:
Private Sub Command1_Click()
Call FormatFloppy '調用FormatFloppy過程
End Sub
2.然后用鼠標右擊窗體,選擇右鍵菜單中的“添加/添加模塊”選項,然后在出現的選擇框中選擇“模塊”類型,接著在出現的模塊代碼輸入框中加入以下代碼:(注:模塊是指一組聲明的集合,其后為過程)
'通用聲明
Public Const WM_CLOSE=&H10
Declare Function FindWindow Lib "user32" Alias"FindWindowA"(ByVal lpClassName As Any, ByVal
lpWindowName As Any)As Long
Delare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer
As String, ByVal nSize As Long) As Long
Declare Function SetWindowPos Lib "user32"(BvVal 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
Declare Function GetDesktopWindow Lib "user32"() As Long
Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long)As Long
Declare Function GetWindowRect Lib "user32"(ByVay hwnd As Long, lpRect As RECT) As Long
Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
TypePOINTAPI
X As Long
y As Long
End Type
Const SWP_NOSIZE=&H1
Const SWP_NOZORDER=&H4
'FormatFloppy()過程聲明
Public Sub FormatFloppy()
Dim sBuffer As String, Windir As String, Procs As String, X
Dim lResult As Long
sBuffer = String$(255,0)
lResult = GetWindowsDirectory(sBuffer, Len(sBuffer))
Windir = Trim(sBuffer)
Procs = Left(Windir, lResult) & " undll32.exe shell32.dll,SHFormatDrive"
Call CenterDialog("Format - 3? Floppy (A:)")
X = Shell(Procs,1)
Call CenterDialog("Format - 3? Floppy (A:)")
k = LockWindowUpdate(0)
End Sub
' CenterDialog 過程聲明
Public Sub CenterDialog(WinText As String)
DoEvents
On Error Resume Next
Dim D3 As Long
D3 = LockWindowUpdate(GetDesktopWindow())
Dim wdth%
Dim hght%
Dim Scrwdth%
Dim Scrhght%
Dim lpDlgRect As RECT
Dim lpdskrect As RECT
Dim hTaskBar As Long
hTaskBar = FindWindow(0&,WinText)
Call GetWindowRect(hTaskBar, lpDlgRect)
wdth% = lpDlgRect.Right - lpDlgRect.Left
hght% = lpDlgRect.Bottom - lpDlgRect.Top
Call GetWindowRect(GetDesktopWindow(),lpdskrect)
Scrwdth% = lpdskrect.Right - lpdskrect.Left
Scrhght% = lpdskrect.Bottom - lpdskrect.Top
X% = (Scrwdth% - wdth%) / 2
y% = (Scrhght% - hght%) / 2
Call SetWindowPos(hTaskBar, 0, X%, y%,0,0, SWP_NOZORDER Or SWP_NOSIZE)
DoEvents
End Sub
程序的執行
程序輸入完成后,點擊VB“運行”菜單中的“啟動”或“全面編譯”命令,點擊“軟盤格式化”按鈕后選擇要格式化的容量,即可對3.5英寸盤進行格式化操作。
調用版本信息框
在Windows程序中,點擊“幫助”菜單中的“關于XXX”選項后,就會彈出該程序的版本信息框。其實,在
VB中,調用shellAbout函數不但可以實現標準的軟件版本信息框,還可以隨意更改其中的內容呢!
程序的編寫
1.與前面類似,首先運行VB并新建一個標準工程,然后雙擊Form1窗口,在代碼輸入框中輸入ShellAbout過
程代碼:
Private Declare Function ShellAbout Lib "shell32.dlI" Alias "ShellAboutA" (ByVal hWnd As Long, ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long
其中ShellAbout聲明如下:
HWnd設置窗口句柄,szApp設置窗口的“Caption”,szOtherStuff在“版權所有”和“使用權”之間的空白
處增加額外說明。
2.然后利用“工具箱”在Form1窗體中加入一個命令按鈕對象,將該命令按鈕屬性中的Caption值定義為“版
本信息框”。完成之后雙擊該按鈕,在代碼輸入框輸入以下代碼:
Private Sub Command1_Click()
Call ShellAbeut(hWnd, "何發武天使工作室!","版本信息框" & VbCrLf & "上帝與你同在!阿彌陀佛!",0)
End Sub
程序的執行
程序輸入完成后,點擊VB“運行”菜單中的“啟動”或“全面編譯”命令,點擊“版本信息框”按鈕,即可查看當前軟件的版本信息。
查看“屬性”
在Windows 9X中,增加了一個全新的概念--“屬性”,每個對象都擁有自己的“屬性”,在“屬性”窗口里是關于對象的詳細描述,并且不同的對象“屬性”窗口的說明是不同的。我們可以用ShellExecuteEX函數直接調用“屬性”標準窗口。下面的程序功能相當于用鼠標右鍵單擊根目錄下的“Autoexec.bat”并選擇“屬性”時,彈出的標準“屬性”窗口。
程序的編寫
1.首先運行VB,然后新建一個標準工程,然后利用“工具箱”在Form1窗體中加入一個命令按鈕對象,將該命令按鈕屬性中的Caption值定義為“屬性按鈕”。完成之后雙擊該按鈕,在代碼輸入框中輸入以下代碼:
VB的API編程精粹(2)
您的支持我們的動力 rosibo Private Sub Command1_Click()
Dim r As Long
Dim FileName As String
FileName = "c:autoexec.bat"
r=ShowProperties(FileName,Me.hwnd)
If r<=32 Then MsgBox "Error! NO c:autoexec.bat File"
End SuB
2.然后用鼠標右擊窗體,選擇右鍵菜單中的“添加/添加模塊”選項,然后在出現的選擇框中選擇“模塊”類型,接著在出現的模塊代碼輸入框中加入以下代碼:
'通用聲明
Option Explicit
Type SHELLEXECUTEINFO
cbSize As long
Fmask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Public Const SEE_MASK_INVOKEIDLIST = &HC
Public Const SESE_MASK_NOCLOSEPROCESS=&H40
Public Const SEE_MASK_FLAG_NO_UI = &H400
Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long
'ShowProperties過程
Public Function ShowProperties(FileName As String, OwnerhWnd As Long) As Long
Dim SEI AS SHELLEXECUTEINFO
Dim r As Long
With SEI
.cbSize = Len(SEI)
.fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI
.hwnd = OwnerhWnd
.lpVerb = "properties"
.lpFile = FileName
.lpParameters = vbNullChar
.lpDirectory = vbNullChar
.nShow = 0
.hInstApp = 0
.lpIDList = 0
End With
r = ShellExecuteEX(SEI)
ShowProperties = SEI.hInstApp
End Function
程序的執行
程序輸入完成后,點擊VB“運行”菜單中的“啟動”或“全面編譯”命令,點擊“屬性按鈕”按鈕,即可查看C:AUTOEXEC.BAT的屬性。
在上篇的中我們介紹了API編程的基礎知識和一些比較“酷”的API調用,這期我們將配合專題介紹關于注冊表編程的API函數及其應用實例,使讀者朋友何能夠將前面學到的注冊表知識推廣到VB編程中,繼續向VB高手邁進(路漫漫……)。當然,上期說過要介紹更“酷”的API調用,可不能食言,后半部分介紹的平面工具條的生成定會使您的程序更“炫”!
一. 注冊表的API編程
關于注冊表的知識相信您通過前面專題的介紹已經有了較深入的了解。系統有六個預定義好的關鍵字,這六個關鍵字是用戶或系統訪問注冊表的入口點。我們常用到的只有前四個關鍵字。而在編程時我們一般用到只是HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE這兩個關鍵字,因為與應用程序相關的數據存在于這兩個關鍵字下。
許多商品化的軟件或專業化的軟件在您的機器上首次安裝的時候都會通過改寫注冊表來完成軟件的正確安裝運行,夢想成為編程高手的你當然需要掌握讀寫注冊表這一技術。利用好注冊表會為您的應用程序增色不少。
雖然VB本身提供了四個關于注冊表的函數GetSetting,SaveSetting、GetAllSettings、DeleteSetting(這四個函數的使用比較簡單讀者可以參考VB的聯機幫助),但是這四個函數只能在“HKEY_CURRENT_USERSoftwareVB and VBA ProgramSettings”下讀取、刪除、修改鍵值。對于一般的應用程序利用它們可以達到您的目的,對于特殊的要求利用它們就顯的無能為力了。下面舉一個例子說明它們的局限性。
熟悉DOS操作系統的讀者都知道,可以編寫一個“Autoexec.bat”的批處理文件來實現某一個應用程序在系統啟動的時候自動運行,在Win95中我們可以把應用程序的快捷方式放到系統的啟動組中來達到同樣的效果。但是,假如我需要在我的應用程序首次安裝以后就能自動達到這種效果,那該如何呢?其實,注冊表中提供了三個這樣的鍵:
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices
這三個鍵字的區別是:
Run:此鍵字下的應用程序在系統啟動的時候會自動運行;
RunOnce:此鍵字下的應用程序在系統下一次啟動的時候會自動運行,以后不再運行;
RunServices:功能和“Run”一樣,只是應用程序被啟動的時候不同而已。
現在您一定知道該如何利用注冊表達到您的要求了。實際上許多安裝軟件在安裝向導完成后要您重新啟動才能完成最終的安裝。它就是把安裝向導所需做的最后工作的程序寫到“RunOnce”下實現的。但是,若只利用VB本身的那四個函數顯然是無法實現此功能的。筆者在實踐中通過調用API函數很好地解決了VB本身訪問注冊表的局限性,并把它做成了一個類模塊。所以調用起來非常方便。由于篇幅有限我只能從中抽取一部分來講,這一部分也是可以獨立運行的。讀者想要完整的源代碼請與我聯系(yue_xiang@263.net)。
下面是應該放到您的模塊中的聲明部分代碼:
Option Explicit
'注冊表的入口常量
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
'注冊表的訪問權限常量
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINk = &H20
Public Const KEY_ALL_ACCESS = &H3F
'打開/建立鍵值的可選項常量
Public Const REG_OPTION_NON_VOLATILE = 0&
Public Const REG_OPTION_VOLATILE = &H1
'建立新鍵或打開已存在的鍵常量
Public Const REG_CREATED_NEW_KEY = &H1
Public Const REG_OPENED_EXISTING_KEY = &H2
'預先定義的訪問注冊表的權限常量
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -