国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

VB的API編程精粹(二)

2019-11-18 17:46:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
VisualBasic以友好易學(xué)的可視化開(kāi)發(fā)環(huán)境聞名于世,成為人們學(xué)習(xí)計(jì)算機(jī)編程的首選語(yǔ)言。目前,全世界大概有300多萬(wàn)人使用著VisualBasic語(yǔ)言。如果您想在這茫茫眾生中出類(lèi)拔萃,那么您就不得不學(xué)習(xí)API(applicationPRogramlnterface,即Windows的應(yīng)用程序編程接口)編程。不懂API,那可成不了高手。
第一節(jié):API基礎(chǔ)
API說(shuō)到底就是一系列的底層函數(shù),是系統(tǒng)提供給用戶用于進(jìn)入操作系統(tǒng)核心,進(jìn)行高級(jí)編程的途徑。通過(guò)在VisualBasic應(yīng)用程序中聲明外部過(guò)程就能夠訪問(wèn)WindowsAPI(以及其它的外部DLLs)。在聲明了過(guò)程之后,調(diào)用它的方法與調(diào)用VisualBasic自己的過(guò)程相同。要聲明一個(gè)DLL過(guò)程,需要在代碼窗口的"聲明"部分增加一個(gè)Declare語(yǔ)句,如果該過(guò)程返回一個(gè)值,應(yīng)將其聲明為Function。例如:
DeclareFunctionpublicnameLib"libname"[Alias"alias"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]AsType
如果過(guò)程沒(méi)有返回值,可將其聲明為Sub。
缺省情況下,在標(biāo)準(zhǔn)模塊中聲明的DLL過(guò)程,可以在應(yīng)用程序的任何地方調(diào)用它。在其他類(lèi)型的模塊中定義的DLL過(guò)程是模塊私有的,必須在它們前面加上Private關(guān)鍵字,以示區(qū)分。特別提請(qǐng)注意的是,在32位的VisualBasic中過(guò)程名是區(qū)分大小寫(xiě)的。而在以前的16位版本中并不區(qū)分大小寫(xiě),這是初學(xué)者容易出錯(cuò)的地方。
Declare語(yǔ)句中的Lib子句用來(lái)告訴VisualBasic如何找到包含該過(guò)程的dll文件。如果引用的過(guò)程屬于Windows核心庫(kù)(User32、Kernel32或GDI32),則可以不包含文件擴(kuò)展名。例如:
DeclareFunctionGetTickCountLib"kernel32"Alias"GetTickCount"()AsLong。對(duì)于其它DLL,Lib子句須指定文件的路徑及擴(kuò)展名。
如果調(diào)用的WindowsAPI過(guò)程要使用字符串,那么在聲明語(yǔ)句中必須增加一個(gè)Alias子句,以指定正確的字符集。包含字符串的WindowsAPI函數(shù)實(shí)際有兩種格武ANSI格式Unicode格式。因此,在Windows頭文件中,每個(gè)包含字符串的函數(shù)都同時(shí)有ANSI版本和Unicode版本。
例如,下面是SetWindowText函數(shù)的兩種C語(yǔ)言描述??梢钥吹?,第一個(gè)描述將函數(shù)定義為SetWindowTextA,尾部的"A"表明它是一個(gè)ANSI函數(shù):
SetWindowTextA(HWNDhWnd,LPCSTRlpString);
第二個(gè)描述將它定義為SetWindowTextW,尾部的"w"表明它是一個(gè)Unicode函數(shù):
SetWindowTextW(HWNDHwnd,LPCWSTRlpString);
因?yàn)閮蓚€(gè)函數(shù)實(shí)際的名稱(chēng)都不是"SetWindowText",要引用正確的函數(shù)就必須增加一個(gè)Alias子句:
PrivateDeclareFunctionSetwindowTextLib"user32"Alias"SetWindowTextA"(ByValhwndAsLongg,ByVallpStringAsString)AsLong
請(qǐng)注意,Alias子句后面的字符串必須是過(guò)程的真正名稱(chēng),必須是區(qū)分大小寫(xiě)的。事實(shí)上,您只需要記住,只有WindowsNT才支持Unicode格式,而Windows95只支持ANSI格式就行了。至于兩者的區(qū)別,作一般的應(yīng)用程序開(kāi)發(fā)是不需要了解的。
VB5專(zhuān)業(yè)版在VB目錄的/Winapi子目錄下,用幾個(gè)文件提供了關(guān)于API的信息。Win32api.txt文件中包含了32位WindowsAPI函數(shù)中用到的函數(shù)和類(lèi)型的結(jié)構(gòu)聲明以及全局常量的值。用戶可以用VB本身帶的外接程序"API瀏覽器"來(lái)方便地使用Win32api.Txt,如下所示:
點(diǎn)擊菜單文件項(xiàng)的"加載文本文件…"從VB目錄下的WINAPI目錄中選擇"WIN32API.TXT",就可以查看WINDOWS95系統(tǒng)的API函數(shù)的聲明、常數(shù)定義和數(shù)據(jù)類(lèi)型了。例如,我們打算查看函數(shù)InverRect()的聲明。首先,點(diǎn)擊"搜索"按鈕,輸入字符串"InverRect"。在"可選項(xiàng)"欄中,蘭色的亮度條將移動(dòng)到"InverRect"項(xiàng)上。再點(diǎn)按"添加"按鈕,在"選定項(xiàng)"中就出現(xiàn)"InverRect"在VisualBasic中的聲明了。接下來(lái)自然是點(diǎn)按"復(fù)制"按鈕,然后將窗口切換到VisualBasic開(kāi)發(fā)環(huán)境中,在需要聲明API函數(shù)的地方Ctrl+V(粘貼)即可。
上面所講的聲明方法雖然簡(jiǎn)單,但只有使用WINDOWS本身的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ù)聲明
DeclareFunctionSetWindowPosLib"user32"Alias"SetWindowPos"(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong
'常量聲明
GlobalConstSWP_HIDEWINDOW=&H80
GlobalConstSWP_NOACTIVATE=&H10
GlobalConstSWP_NOCOPYBITS=&H100
GlobalConstSWP_NOMOVE=&H2
GlobalConstSWP_NOOWNERZORDER=&H200
GlobalConstSWP_NOREDRAW=&H8
GlobalConstSWP_NOREPOSITION=SWP_NOOWNERZORDER
GlobalConstSWP_NOSIZE=&H1
GlobalConstSWP_NOZORDER=&H4
GlobalConstSWP_SHOWWINDOW=&H40
GlobalConstHWND_BOTTOM=1
GlobalConstHWND_BROADCAST=&HFFFF&
GlobalConstHWND_DESKTOP=0
GlobalConstHWND_NOTOPMOST=-2
GlobalConstHWND_TOPMOST=-1
GlobalConstHWND_TOP=0
GlobalConstFlags=SWP_NOMOVEOrSWP_NOSIZE
這里以"SWP_"開(kāi)頭的常量是表示窗體所具有的風(fēng)格,這些常量可以通過(guò)VB中的"OR"操作符組合在一起。而以"HWND_"開(kāi)頭的常量表示窗體在桌面上的位置。從這些常量的英文單詞的意義上讀者應(yīng)該很容易理解他們所具有的風(fēng)格了。所以筆者就不一一去說(shuō)明了。至于為什么要添加這些常量而不是別的這就要您去查看WindowsSDK關(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)用的方法如:
DimSuccessasLong
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如下代碼入模塊中:
PublicDeclareFunctionSystemParametersInfoLib"user32"Ahias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,lpvParamAsAny,ByValfuWinIniAsLong)ASLong
PublicConstSPI_SCREENSAVERRUNNING=97
在窗體的代碼編輯區(qū)Copy如下代碼:
'使三組熱鍵失效
PrivateSubcmdDisable_click()
SystemParametersInfo
SPI_SCREENSAVERRUNNING,True,byVal1&,0
EndSub

PrivateSubForm_Unload(CancelAsInteger)
'程序退出前是熱鍵有效
CndEnable_Click
EndSub
若將此功能和屏幕保護(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)用的例子只是為了帶您去WindowsAPI世界中去探索一下。相信您已探索到了一點(diǎn)眉目并想去實(shí)現(xiàn)一些更"好玩"的東西了。好!下面就向您介紹一個(gè)很"好玩"同時(shí)又會(huì)使您的程序看起來(lái)更專(zhuān)業(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),這樣您的程序多具有專(zhuān)業(yè)水準(zhǔn)!
下面是此功能的實(shí)現(xiàn)步驟:
1.這里我們調(diào)用的API函數(shù)是:"Shell_NotifyIcon",在您的模塊中添加如下的函數(shù)聲明和常量聲明:
'以下常量告訴系統(tǒng)在托盤(pán)中您的圖標(biāo)上發(fā)生了什么操作
'常量聲明
PublicConstWM_MOUSEMOVE=&H200'在圖標(biāo)上移動(dòng)鼠標(biāo)
PublicConstWM_LBUTTONDOWN=&H201'鼠標(biāo)左鍵按下
PublicConstWM_LBUTTONUP=&H202'鼠標(biāo)左鍵釋放
PublicConstWM_LBUTTONDBLCLK=&H203'雙擊鼠標(biāo)左鍵
PublicConstWM_RBUTTONDOWN=&H204'鼠標(biāo)右鍵按下
PublicConstWM_RBUTTONUP=&H205'鼠標(biāo)右鍵釋放
PublicConstWM_RBUTTONDBLCLK=&H206'雙擊鼠標(biāo)右鍵
PublicConstWM_SETHOTKEY=&H32'響應(yīng)您定義的熱鍵
'API函數(shù)聲明
PublicDeclareFunctionShell_NotifyIconLib"shell32.dll"Alias"Shell_NotifyIconA"(ByValdwMessageAsLong,lpDataAsNOTIFYICONDATA)AsLong
'自定義一個(gè)調(diào)用APIShell_NotifyIcon要用到的類(lèi)型"NOTIFYICONDATA"
PublicTypeNOTIFYICONDATA
cdSizeAsLong'NOTIFYICONDATA類(lèi)型的大小
hwndAsLong'你的應(yīng)用程序窗體的名柄
uIdAsLong'應(yīng)用程序圖標(biāo)資源的ID號(hào)
uFlagsAsLong'使那些參數(shù)有效它是以下枚舉類(lèi)型中的
'NIF_MESSAGE、NIF_ICON、NIF_TEndSub
4.Run你的程序,您是不是看到了象“金山詞霸”一樣的功能?相信你此時(shí)的感覺(jué)一定特別“爽”!
API的世界j是豐富多彩的,只要你肯細(xì)心地去探索它你一定會(huì)獲得許多意想不到的好東西。所以筆者覺(jué)得定值得每一個(gè)具有“好奇”精神的人去探索它。后續(xù)的期刊筆者會(huì)向讀者詳細(xì)介紹一些更好更“?!钡腁PI調(diào)用。->


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岢岚县| 章丘市| 赤城县| 佛学| 宁明县| 稻城县| 中牟县| 蕲春县| 军事| 临朐县| 高雄市| 彝良县| 呼伦贝尔市| 馆陶县| 麻城市| 惠州市| 夏邑县| 宁城县| 苗栗市| 体育| 三穗县| 富民县| 东阿县| 太谷县| 云南省| 张家口市| 石阡县| 怀柔区| 饶河县| 潮州市| 怀仁县| 岢岚县| 手游| 磴口县| 连云港市| 扬州市| 礼泉县| 慈利县| 城市| 彭泽县| 尼玛县|