網(wǎng)站運(yùn)營(yíng)seo文章大全提供全面的站長(zhǎng)運(yùn)營(yíng)經(jīng)驗(yàn)及seo技術(shù)!第一節(jié):api基礎(chǔ) 
api說(shuō)到底就是一系列的底層函數(shù),是系統(tǒng)提供給 用戶用于進(jìn)入操作系統(tǒng)核心,進(jìn)行高級(jí)編程的途徑。通 過(guò)在visual basic應(yīng)用程序中聲明外部過(guò)程就能夠 訪問(wèn)windows api(以及其它的外部dlls)。在聲明 了過(guò)程之后,調(diào)用它的方法與調(diào)用visual basic自 己的過(guò)程相同。要聲明一個(gè)dll過(guò)程,需要在代碼窗 口的"聲明"部分增加一個(gè)declare語(yǔ)句,如果該過(guò) 程返回一個(gè)值,應(yīng)將其聲明為function。例如: 
declare function publicname lib "libname" [alias "alias"] [([[byval] variable [as type] [,[byval] variable [as type]]...])] as type 
如果過(guò)程沒(méi)有返回值,可將其聲明為sub。 
缺省情況下,在標(biāo)準(zhǔn)模塊中聲明的dll過(guò)程,可 以在應(yīng)用程序的任何地方調(diào)用它。在其他類型的模塊 中定義的dll過(guò)程是模塊私有的,必須在它們前面 加上private關(guān)鍵字,以示區(qū)分。特別提請(qǐng)注意的 是,在32位的visual basic中過(guò)程名是區(qū)分大小 寫(xiě)的。而在以前的16位版本中并不區(qū)分大小寫(xiě),這 是初學(xué)者容易出錯(cuò)的地方。 
declare語(yǔ)句中的lib子句用來(lái)告訴visual basic如何找到包含該過(guò)程的dll文件。如果引用的過(guò) 程屬于windows核心庫(kù)(user32、kernel32或 gdi32),則可以不包含文件擴(kuò)展名。例如: 
declare function gettickcount lib "kernel32" alias "gettickcount"() as long。對(duì)于其它dll, lib子句須指定文件的路徑及擴(kuò)展名。 
如果調(diào)用的windows api過(guò)程要使用字符串,那 么在聲明語(yǔ)句中必須增加一個(gè)alias子句,以指定 正確的字符集。包含字符串的windows api函數(shù)實(shí) 際有兩種格武ansi格式unicode格式。因此,在 windows頭文件中,每個(gè)包含字符串的函數(shù)都同時(shí)有 ansi版本和unicode版本。 
例如,下面是setwindowtext函數(shù)的兩種c語(yǔ)言描 述??梢钥吹?,第一個(gè)描述將函數(shù)定義為setwindowtexta, 尾部的"a"表明它是一個(gè)ansi函數(shù): 
setwindowtexta(hwnd hwnd,lpcstr lpstring); 
第二個(gè)描述將它定義為setwindowtextw,尾部的 "w"表明它是一個(gè)unicode函數(shù): 
setwindowtextw(hwnd hwnd,lpcwstr lpstring); 
因?yàn)閮蓚€(gè)函數(shù)實(shí)際的名稱都不是"setwindow text",要引用正確的函數(shù)就必須增加一個(gè)alias子句: 
private declare function setwindowtext lib "user32" alias "setwindowtexta"(byval hwnd as longg,byval lpstring as string) as long 
請(qǐng)注意, alias子句后面的字符串必須是過(guò)程的 真正名稱,必須是區(qū)分大小寫(xiě)的。事實(shí)上,您只需要 記住,只有windows nt才支持unicode格式,而 windows 95只支持ansi格式就行了。至于兩者的區(qū) 別,作一般的應(yīng)用程序開(kāi)發(fā)是不需要了解的。 
vb5專業(yè)版在vb目錄的/winapi子目錄下,用幾 個(gè)文件提供了關(guān)于api的信息。 win32api.txt文件中 包含了32位windows api函數(shù)中用到的函數(shù)和類型的 結(jié)構(gòu)聲明以及全局常量的值。用戶可以用vb本身帶的外 接程序"api瀏覽器"來(lái)方便地使用win32api.txt,如下 所示: 
點(diǎn)擊菜單文件項(xiàng)的"加載文本文件…"從vb目 錄下的winapi目錄中選擇"win32api.txt",就可以 查看windows 95系統(tǒng)的api函數(shù)的聲明、常數(shù)定義和 數(shù)據(jù)類型了。例如,我們打算查看函數(shù)inverrect() 的聲明。首先,點(diǎn)擊"搜索"按鈕,輸入字符串 "inverrect"。在"可選項(xiàng)"欄中,蘭色的亮度條將移 動(dòng)到"inverrect"項(xiàng)上。再點(diǎn)按"添加"按鈕,在"選 定項(xiàng)"中就出現(xiàn)"inverrect"在visual basic中的 聲明了。接下來(lái)自然是點(diǎn)按"復(fù)制"按鈕,然后將窗 口切換到visual basic開(kāi)發(fā)環(huán)境中,在需要聲明api 函數(shù)的地方ctrl+v(粘貼)即可。 
上面所講的聲明方法雖然簡(jiǎn)單,但只有使用win dows本身的api函數(shù)才能這樣。對(duì)于第三方提供的動(dòng) 態(tài)鏈接庫(kù)(dll)您只有用鍵盤(pán)老老實(shí)實(shí)地敲了。 
第二節(jié):牛刀小試 
現(xiàn)在讀者一定很想自己親自試一下,下面舉兩個(gè) 實(shí)際應(yīng)用的例子讓大家體會(huì)一下api的妙用吧! 
1.使一個(gè)窗體始終保持在屏幕的最上面 
我們知道vb本身自帶的函數(shù)是難以完成此功能 的,我們可以通過(guò)調(diào)用windows的api函數(shù): setwindowpos達(dá)到我們的要求。操作步驟如下: 
(1)啟動(dòng)vb5建立一個(gè)新工程,在該工程中添加一 個(gè)模塊(moudel),在該模塊中用上述的"api例覽器" 添加如下的該api函數(shù)的函數(shù)聲明和常量聲明部分: 
'api函數(shù)聲明 
declare function setwindowpos lib "user32" alias "setwindowpos" (byval 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 
'常量聲明 
global const swp_hidewindow = &h80 
global const swp_noactivate = &h10 
global const swp_nocopybits = &h100 
global const swp_nomove = &h2 
global const swp_noownerzorder = &h200 
global const swp_noredraw = &h8 
global const swp_noreposition = swp_noownerzorder 
global const swp_nosize = &h1 
global const swp_nozorder = &h4 
global const swp_showwindow = &h40 
global const hwnd_bottom = 1 
global const hwnd_broadcast = &hffff& 
global const hwnd_desktop = 0 
global const hwnd_notopmost = -2 
global const hwnd_topmost = -1 
global const hwnd_top = 0 
global const flags=swp_nomove or swp_nosize 
這里以"swp_"開(kāi)頭的常量是表示窗體所具有的 風(fēng)格,這些常量可以通過(guò)vb中的"or"操作符組合在 一起。而以"hwnd_"開(kāi)頭的常量表示窗體在桌面上的 位置。從這些常量的英文單詞的意義上讀者應(yīng)該很容 易理解他們所具有的風(fēng)格了。所以筆者就不一一去說(shuō) 明了。至于為什么要添加這些常量而不是別的這就要 您去查看windows sdk關(guān)于該函數(shù)的幫助文檔了。當(dāng) 然這對(duì)于初學(xué)者來(lái)說(shuō)有一定的難度,但不要畏懼,只 要您仔細(xì)看幫助就會(huì)慢慢搞懂的。因?yàn)檫@些api函數(shù) 是為c和c++的編程人員編寫(xiě)的,所以如果您懂一點(diǎn) c++的話會(huì)很容易理解的。 
(2)現(xiàn)在只要在您想要此功能的地方調(diào)用該函數(shù) 就可以了,調(diào)用的方法如: 
dim success as long 
success=setwindowpos(me.hwnd. hwnd_topmost,0,0,0,0,flags) 
若success返回的值不等于零則表示調(diào)用成功。 
比如在某個(gè)窗體的load事件中加入上述的兩行代 碼,就可以達(dá)到使該窗體始終位于屏幕最上面的目的。 
細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn)上面的例子中的模塊聲 明中聲明了好幾個(gè)常量,可為什么只用到三個(gè)呢?現(xiàn) 在您可以試著改變一下api函數(shù)"setwindowpos"中 的第二個(gè)參數(shù)或常量flags中的項(xiàng),看看您的窗體會(huì) 出現(xiàn)什么樣的效果? 
2.vb5中如何屏蔽掉win95中的ctrl_alt_del, ctrl_esc, alt_tab三組熱鍵通過(guò)調(diào)用api函數(shù)"systemparametersinfo"來(lái)實(shí) 現(xiàn)。 
首先創(chuàng)建一新工程;在此工程中添加一個(gè)窗體和 一個(gè)模塊;在窗體上拖放兩個(gè)按鈕分別命名為 "cmddisable","cmdenable";copy如下代碼入模塊中: 
public declare function systemparametersinfo lib "user32" ahias "systemparametersinfoa" (byval uaction as long,byval uparam as long, lpvparam as any,byval fuwinini as long)as long 
public const spi_screensaverrunning=97 
在窗體的代碼編輯區(qū)copy如下代碼: 
'使三組熱鍵失效 
private sub cmddisable_click() 
systemparametersinfo 
spi_screensaverrunning,true,byval 1&,0 
end sub 
private sub form_unload(cancel as integer) 
'程序退出前是熱鍵有效 
cndenable_click 
end sub 
若將此功能和屏幕保護(hù)程序結(jié)合到一起,那您的屏幕 保護(hù)程序一定增色許多。 
api函數(shù)的簡(jiǎn)單調(diào)用例子就是這么容易,相信現(xiàn)在您 對(duì)api的調(diào)用已不再感到神秘了,接下來(lái)我們就看看一個(gè) 比較復(fù)雜的應(yīng)用。 
第三節(jié):高手進(jìn)階 
上面的關(guān)于api的調(diào)用的例子只是為了帶您去win dows api世界中去探索一下。相信您已探索到了一點(diǎn)眉 目并想去實(shí)現(xiàn)一些更"好玩"的東西了。好!下面就向您 介紹一個(gè)很"好玩"同時(shí)又會(huì)使您的程序看起來(lái)更專業(yè)化 的一個(gè)api調(diào)用。 
相信您的機(jī)器上一定裝有"金山詞霸",試著啟動(dòng)它 您發(fā)現(xiàn)了什么?啟動(dòng)畫(huà)面過(guò)后它"不見(jiàn)了"。把鼠標(biāo)移到 桌面的右下角,原來(lái)它以圖標(biāo)的形式"藏在" windows 的托盤(pán)中。用鼠標(biāo)右擊它還會(huì)彈出一個(gè)菜單功能項(xiàng)供您 選擇?,F(xiàn)在您一定想把自己的程序也放到托盤(pán),這樣您的 程序多具有專業(yè)水準(zhǔn)! 
下面是此功能的實(shí)現(xiàn)步驟: 
1.這里我們調(diào)用的api函數(shù)是: "shell_notifyicon",在您的模塊中添加如下的函數(shù)聲明 和常量聲明: 
'以下常量告訴系統(tǒng)在托盤(pán)中您的圖標(biāo)上發(fā)生了什么 操作 
'常量聲明 
public const wm_mousemove = &h200 '在圖標(biāo)上移動(dòng)鼠標(biāo) 
public const wm_lbuttondown = &h201 '鼠標(biāo)左鍵按下 
public const wm_lbuttonup = &h202 '鼠標(biāo)左鍵釋放 
public const wm_lbuttondblclk = &h203 '雙擊鼠標(biāo)左鍵 
public const wm_rbuttondown = &h204 '鼠標(biāo)右鍵按下 
public const wm_rbuttonup = &h205 '鼠標(biāo)右鍵釋放 
public const wm_rbuttondblclk = &h206 '雙擊鼠標(biāo)右鍵 
public const wm_sethotkey = &h32 '響應(yīng)您定義的熱鍵 
'api函數(shù)聲明 
public declare function shell_notifyicon lib "shell32.dll" alias " shell_notifyicona" (byval dwmessage as long, lpdata as notifyicondata) as long 
'自定義一個(gè)調(diào)用api shell_notifyicon要用到的類 型"notifyicondata" 
public type notifyicondata 
cdsize as long 'notifyicondata類型的大小 
hwnd as long '你的應(yīng)用程序窗體的名柄 
uid as long '應(yīng)用程序圖標(biāo)資源的id號(hào) 
uflags as long '使那些參數(shù)有效它是以下枚舉類型中的 
'nif_message、nif_icon、nif_tip三組的組合 
ucallbackmessage as long '鼠標(biāo)移動(dòng)時(shí)把此消息發(fā)給該圖標(biāo)的窗體 
hicon as long '圖標(biāo)名柄 
sztip as string*64 '當(dāng)鼠標(biāo)在圖標(biāo)上時(shí)顯示的tip文本 
end type 
'這是一個(gè)枚舉類型它告訴api shell_notifyicon去做什么操作 
public enum enm_nim_shell 
nim_add=&h40 '在“金碟”中加一圖標(biāo) 
nim_modify=&h1 '修改“金碟”中的圖標(biāo) 
nim_delete=&h2 '刪除“金碟”中的圖標(biāo) 
nif_message=&h1 '使類型"notifyicondata"中的ucallbackmessage有效 
nif_icon=&h2 '使類型"notifyicondata"中的hicon有效 
nif_tip=&h4 '使類型"notifyicondata"中的sztip有效 
wm_mousemove=&h200 '使鼠標(biāo)移動(dòng)消息有效 
end enum 
'定義一個(gè)"notifyicondata"類型的變量 
public nidprogramdata as notifyicondata 
以上是函數(shù)及常量聲明和自定義的一個(gè)類型變量,下 面是此api函數(shù)的調(diào)用方法: 
2. 在窗體上用菜單編輯一個(gè)具有如下信息的菜單項(xiàng): 
主菜單:無(wú)標(biāo)題、名稱(mainmenu) 
子菜單:標(biāo)題(api編程)、名稱(submnul); 
標(biāo)題(退出)、名稱(submnu2). 
這里只是舉個(gè)例子,具體的功能你可以根據(jù)你的具體需要來(lái)編輯此菜單項(xiàng) 
3. 在窗體的load事件中添加如下代碼: 
private sub form_load() 
'隱藏窗體 
with me 
.top =-10000 
.left = -10000 
.windowstate = vbminimized 
end with 
'設(shè)置類型notifyicondata所具有的特征 
with nidprogramdata 
.cbsize = len(nidprogramdata) 
.hwnd = me.hwnd .uld = vbnull 
.uflags = nif_icon or nif_tip or nif_message 
'觸發(fā)鼠標(biāo)移動(dòng)消息 
.ucallbackmessage = wm_mousemove 
.hicon = me.icon '“托盤(pán)”中放入窗體圖標(biāo),你可以把窗體的圖標(biāo)換成你所喜歡的圖標(biāo) 
.sztip ="vb 的 win32 api 編程" & vbnullchar 
end with 
'調(diào)用該函數(shù) 
shell_notifyicon nim_add,nidprogramdata 
end sub 
'根據(jù)不同的鼠標(biāo)消息做不同的操作 
private sub form_mousemove(button as inte ger, shift as lnteger, x as single, y as single) 
on error goto form_mousemove_err: 
dim result as long 
dim msg as long 
'x的值依賴與顯示模式的設(shè)置 
if me.scalemode = vbpixels then 
msg = x 
else 
msg = x/screen.twipsperpixe1x 
end if 
select case msg 
case wm_lbuttonup 
'在這里加入鼠標(biāo)左鍵釋放時(shí)你想做的操作 
case wm_lbuttondblclk 
'在這里加入雙擊鼠標(biāo)左鍵時(shí)你想做的操作 
case wm_rbuttonup 
'通常這里彈出你的功能菜單 
popupmenu mainmenu 
case wm_mouseismoving 
'在這里加入鼠標(biāo)正在移動(dòng)時(shí)你想做的操作 
end select 
exit sub 
form_mousemove_err: 
'在這里加入你的處理異常錯(cuò)誤的代碼 
end sub 
4.run你的程序,您是不是看到了象“金山詞霸”一樣的功能?相信你此時(shí)的感覺(jué)一定特別“爽”! 
api的世界j是豐富多彩的,只要你肯細(xì)心地去探索它你一定會(huì)獲得許多意想不到的好東西。所以筆者覺(jué)得定值得每一個(gè)具有“好奇”精神的人去探索它。后續(xù)的期刊筆者會(huì)向讀者詳細(xì)介紹一些更好更“?!钡腶pi調(diào)用。 
一. 注冊(cè)表的api編程 
關(guān)于注冊(cè)表的知識(shí)相信您通過(guò)前面專題的介紹已經(jīng)有了較深入的了解。系統(tǒng)有六個(gè)預(yù)定義好的關(guān)鍵字,這六個(gè)關(guān)鍵字是用戶或系統(tǒ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本身訪問(wèn)注冊(cè)表的局限性,并把它做成了一個(gè)類模塊。所以調(diào)用起來(lái)非常方便。由于篇幅有限我只能從中抽取一部分來(lái)講,這一部分也是可以獨(dú)立運(yùn)行的。讀者想要完整的源代碼請(qǐng)與我聯(lián)系([email protected])。 
下面是應(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è)表的訪問(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ù)先定義的訪問(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ù)值類型常量 
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) 
'訪問(wèn)注冊(cè)表的api函數(shù)要用到的結(jié)構(gòu)類型 
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è)帶索引的值的名稱和數(shù)據(jù)塊; 
regdeletekey():刪除一個(gè)關(guān)鍵字以及它的子關(guān)鍵字; 
regdeletevalue():在指定的注冊(cè)表關(guān)鍵字中刪除一個(gè)帶名字的值。 
通過(guò)調(diào)用這些api我們可以輕松實(shí)現(xiàn)注冊(cè)表的任意關(guān)鍵字的讀取、查詢、建立、刪除。筆者在這里只打算介紹一下如何建立和刪除一個(gè)特定的關(guān)鍵字。其它操作讀者可以自己去發(fā)揮。 
例如:要在hkey_local_machine/network下建一個(gè)“myapi”子鍵并在它的下面建立一個(gè)稱為“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í)話那個(gè)控件并不好用。筆者在用vc5編程的時(shí)候用基類函數(shù)sendmessagelong()、findwindowex()輕松實(shí)現(xiàn)了這種cool的效果。受此啟發(fā)在vb5中調(diào)用這兩個(gè)api也實(shí)現(xiàn)了同樣的效果。下面是源代碼: 
把以下程序加到您的模塊中: 
'---------------------- 
'常量聲明 
'---------------------- 
public const wm_user = &h400 
'用戶自定義消息的起點(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)了。