VB的API編程精粹(2)
發(fā)布時(shí)間:2008-08-06 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
在上篇的中我們介紹了API編程的基礎(chǔ)知識(shí)和一些比較“酷”的API調(diào)用,這期我們將配合專(zhuān)題介紹關(guān)于注冊(cè)表編程的API函數(shù)及其應(yīng)用實(shí)例,使讀者朋友何能夠?qū)⑶懊鎸W(xué)到的注冊(cè)表知識(shí)推廣到VB編程中,繼續(xù)向VB高手邁進(jìn)(路漫漫……)。當(dāng)然,上期說(shuō)過(guò)要介紹更“酷”的API調(diào)用,可不能食言,后半部分介紹的平面工具條的生成定會(huì)使您的程序更“炫”!
一. 注冊(cè)表的API編程
關(guān)于注冊(cè)表的知識(shí)相信您通過(guò)前面專(zhuān)題的介紹已經(jīng)有了較深入的了解。系統(tǒng)有六個(gè)預(yù)定義好的關(guān)鍵字,這六個(gè)關(guān)鍵字是用戶(hù)或系統(tǒng)訪(fǎng)問(wèn)注冊(cè)表的入口點(diǎn)。我們常用到的只有前四個(gè)關(guān)鍵字。而在編程時(shí)我們一般用到只是HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE這兩個(gè)關(guān)鍵字,因?yàn)榕c應(yīng)用程序相關(guān)的數(shù)據(jù)存在于這兩個(gè)關(guān)鍵字下。
許多商品化的軟件或?qū)I(yè)化的軟件在您的機(jī)器上首次安裝的時(shí)候都會(huì)通過(guò)改寫(xiě)注冊(cè)表來(lái)完成軟件的正確安裝運(yùn)行,夢(mèng)想成為編程高手的你當(dāng)然需要掌握讀寫(xiě)注冊(cè)表這一技術(shù)。利用好注冊(cè)表會(huì)為您的應(yīng)用程序增色不少。
雖然VB本身提供了四個(gè)關(guān)于注冊(cè)表的函數(shù)GetSetting,SaveSetting、GetAllSettings、DeleteSetting(這四個(gè)函數(shù)的使用比較簡(jiǎn)單讀者可以參考VB的聯(lián)機(jī)幫助),但是這四個(gè)函數(shù)只能在“HKEY_CURRENT_USER\Software\VB and VBA ProgramSettings”下讀取、刪除、修改鍵值。對(duì)于一般的應(yīng)用程序利用它們可以達(dá)到您的目的,對(duì)于特殊的要求利用它們就顯的無(wú)能為力了。下面舉一個(gè)例子說(shuō)明它們的局限性。
熟悉DOS操作系統(tǒng)的讀者都知道,可以編寫(xiě)一個(gè)“Autoexec.bat”的批處理文件來(lái)實(shí)現(xiàn)某一個(gè)應(yīng)用程序在系統(tǒng)啟動(dòng)的時(shí)候自動(dòng)運(yùn)行,在Win95中我們可以把應(yīng)用程序的快捷方式放到系統(tǒng)的啟動(dòng)組中來(lái)達(dá)到同樣的效果。但是,假如我需要在我的應(yīng)用程序首次安裝以后就能自動(dòng)達(dá)到這種效果,那該如何呢?其實(shí),注冊(cè)表中提供了三個(gè)這樣的鍵:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
這三個(gè)鍵字的區(qū)別是:
Run:此鍵字下的應(yīng)用程序在系統(tǒng)啟動(dòng)的時(shí)候會(huì)自動(dòng)運(yùn)行;
RunOnce:此鍵字下的應(yīng)用程序在系統(tǒng)下一次啟動(dòng)的時(shí)候會(huì)自動(dòng)運(yùn)行,以后不再運(yùn)行;
RunServices:功能和“Run”一樣,只是應(yīng)用程序被啟動(dòng)的時(shí)候不同而已。
現(xiàn)在您一定知道該如何利用注冊(cè)表達(dá)到您的要求了。實(shí)際上許多安裝軟件在安裝向?qū)瓿珊笠匦聠?dòng)才能完成最終的安裝。它就是把安裝向?qū)枳龅淖詈蠊ぷ鞯某绦驅(qū)懙健癛unOnce”下實(shí)現(xiàn)的。但是,若只利用VB本身的那四個(gè)函數(shù)顯然是無(wú)法實(shí)現(xiàn)此功能的。筆者在實(shí)踐中通過(guò)調(diào)用API函數(shù)很好地解決了VB本身訪(fǎng)問(wèn)注冊(cè)表的局限性,并把它做成了一個(gè)類(lèi)模塊。所以調(diào)用起來(lái)非常方便。由于篇幅有限我只能從中抽取一部分來(lái)講,這一部分也是可以獨(dú)立運(yùn)行的。讀者想要完整的源代碼請(qǐng)與我聯(lián)系(yue_xiang@263.net)。
下面是應(yīng)該放到您的模塊中的聲明部分代碼:
Option Explicit
'注冊(cè)表的入口常量
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
'注冊(cè)表的訪(fǎng)問(wèn)權(quán)限常量
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
'打開(kāi)/建立鍵值的可選項(xiàng)常量
Public Const REG_OPTION_NON_VOLATILE = 0&
Public Const REG_OPTION_VOLATILE = &H1
'建立新鍵或打開(kāi)已存在的鍵常量
Public Const REG_CREATED_NEW_KEY = &H1
Public Const REG_OPENED_EXISTING_KEY = &H2
'預(yù)先定義的訪(fǎng)問(wèn)注冊(cè)表的權(quán)限常量
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const SPECIFIC_RIGHTS_ALL = &HFFFF
'API的返回代碼常量
Public Const ERROR_SUCCESS = 0&
Public Const ERROR_ACCESS_DENIED = 5
Public Const ERROR_NO_MORE_ITEMS = 259
'返回?cái)?shù)值類(lèi)型常量
Public Const REG_NONE = (0)
Public Const REG_SZ = (1)
Public Const REG_EXPAND_SZ = (2)
Public Const REG_BINARY = (3)
Public Const REG_DWORD = (4)
PubliC ConSt REG_DWORD_LITTLE_ENDIAN = (4)
Public Const REG_DWORD_BIG_ENDIAN = (5)
Public Const REG_LINK = (6)
Public Const REG_MULTI_SZ = (7)
Public Const REG_RESOURCE_LIST = (8)
Public Const REG_FULL_RESOURCE_DESCRIPTOR = (9)
Public Const REG_RESOURCE_REQUIREMENTS_LIST = (10)
'訪(fǎng)問(wèn)注冊(cè)表的API函數(shù)要用到的結(jié)構(gòu)類(lèi)型
Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'要用到的API函數(shù)聲明
…………
(鑒于篇幅這里只介紹一下各API的作用而不再一一列其聲明;相關(guān)聲明請(qǐng)讀者查閱API瀏覽器)
下面簡(jiǎn)單地介紹一下這幾個(gè)API:
RegOpenKeyEx():打開(kāi)指定的關(guān)鍵字(32位);
RegSetValueEx():在打開(kāi)的注冊(cè)表關(guān)鍵字的值域中存儲(chǔ)數(shù)據(jù);
RegCloseKey():釋放指定的關(guān)鍵字的句柄;
RegQueryValueEx():在注冊(cè)表中查找與您指定的鍵值相關(guān)的值;
RegCreateKeyEx():建立并打開(kāi)指定的關(guān)鍵字,若已存在則打開(kāi)它;
RegEnumKeyEx():枚舉指定的打開(kāi)注冊(cè)表關(guān)鍵字的子關(guān)鍵字(32位);
RegEnumKey():同上功能一樣,區(qū)別在于它是16位的;
RegEnumValue():每次調(diào)用枚舉指定的打開(kāi)注冊(cè)表關(guān)鍵字的值復(fù)制一個(gè)帶索引的值的名稱(chēng)和數(shù)據(jù)塊;
RegDeletekey():刪除一個(gè)關(guān)鍵字以及它的子關(guān)鍵字;
RegDeleteValue():在指定的注冊(cè)表關(guān)鍵字中刪除一個(gè)帶名字的值。
通過(guò)調(diào)用這些API我們可以輕松實(shí)現(xiàn)注冊(cè)表的任意關(guān)鍵字的讀取、查詢(xún)、建立、刪除。筆者在這里只打算介紹一下如何建立和刪除一個(gè)特定的關(guān)鍵字。其它操作讀者可以自己去發(fā)揮。
例如:要在HKEY_LOCAL_MACHINE\Network下建一個(gè)“MyApi”子鍵并在它的下面建立一個(gè)稱(chēng)為“yx”的值域,把它的值設(shè)為“yue1975”。我們應(yīng)該按如下的方法調(diào)用API:
Dim phkResult As Long '保存建立的關(guān)鍵字句柄
Dim Iresult As Long
Dim SA As SECURITY_ATTRIBUTES
Dim 1Create As Long
'建立一個(gè)指定的關(guān)鍵字
caII RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Network\MyApi",0,"",REG_OPTION_NON_VOLATILE, _
KEY_ALL_ACCESS,SA,phkResult,1Create)
1Result=RegSetValueEx(phkResult,"yx",0,REG_SZ,"yue1975",Clng(Len("yue1975")+1))
'關(guān)閉關(guān)鍵字
RegCloseKey phkResult
現(xiàn)在用注冊(cè)表編輯器去查看一下注冊(cè)表,一定生成了您所需的鍵值。
再例如:現(xiàn)在我想把剛才建立的鍵值刪掉,那您只需如下調(diào)用即可:
dim success as long
success=RegDeleteKey(HKEY_LOCAL_MACHINE,"Network\MyApi")
二. 用API生成平面工具條
相信許多VB愛(ài)好者都曾千方百計(jì)地想使自己的工具條像Word97中的工具條一樣COOL起來(lái)。往往我們不得不去借用別人做好的ActiveBar控件,這樣先不說(shuō)自己的程序變得大了,而且說(shuō)實(shí)話(huà)那個(gè)控件并不好用。筆者在用VC5編程的時(shí)候用基類(lèi)函數(shù)SendMessageLong()、FindWindowEx()輕松實(shí)現(xiàn)了這種COOL的效果。受此啟發(fā)在VB5中調(diào)用這兩個(gè)API也實(shí)現(xiàn)了同樣的效果。下面是源代碼:
把以下程序加到您的模塊中:
'----------------------
'常量聲明
'----------------------
Public Const WM_USER = &H400
'用戶(hù)自定義消息的起點(diǎn)
Public Const TB_SETSTYLE = WM_USER + 56
'設(shè)置工具條風(fēng)格消息
Public Const TB_GETSTYLE = WM_USER + 57
'取得工具條風(fēng)格消息
Public Const TBSTYLE_FLAT = &H800
'使工具條COOL起來(lái)
Public Const TBSTYLE_TOOLTTPS = &H100
Public Const TBSTYLE_WRAPABLE = &H200
Public Const TBSTYLE_ALTDRAG = &H400
Public Const TBSTYLE_LIST = &H1000
Public Const TBSTYLE_CUSTOMERASE = &H2000
'-----------------
'API函數(shù)聲明
'-----------------
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,
ByVal wMsg As Long,ByVal wParam As Long,ByVal 1Param As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long,
ByVal hWnd2 As Long,ByVal 1psz1 As String,ByVal 1psz2 As String) As Long
'-----------------------
'通用生成平面工具條過(guò)程
'入口:工具條的名字
'-----------------------
Public Sub FlatBar(ByVal tb As Toolbar)
Dim style As Long
Dim hToolbar As Long
Dim r As Long
'獲的工具條窗口句柄
hToolbar = FindWindowEx(tb.hwnd,0&,"ToolBarWindow32",vbNullString)
'獲的當(dāng)前工具條的風(fēng)格
style = SendMessageLong(hToolbar,TB_GETSTYLE,0&, 0&)
If style And TBSTYLE_FLAT Then
style = style Xor TBSTYLE_FLAT
Else
style = style or TBSTYLE_FLAT
End If
'設(shè)置工具條的平面風(fēng)格
r=SendMessageLong(hToolbar,TB_SETSTYLE,0, style)
tb.Refresh
End Sub
過(guò)程FlatBar()的調(diào)用方法:
1 . 在你的窗體上添加Toolbar控件(命名為:myTB)和ImageList控件。按通常的方法一樣在ImageList中播入幾個(gè)圖標(biāo)并和Toolbar綁定建立一個(gè)平常的工具條。
2 . 在窗體的Load()事件中調(diào)用FlatBar()
Call FlatBar(myTB)
3. 運(yùn)行,您的工具條一定COOL起來(lái)了。