版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
10.1WindowsAPI與DDL
WindowsAPI是WindowsApplicationProgrammingInterface的簡稱,中文為“應(yīng)用程序接口”,它包含成千上萬的函數(shù)、例程、類型和常數(shù)定義,包含在不同的動態(tài)鏈接庫DLL文件中,可以提供在Windows操作系統(tǒng)下不同開發(fā)語言共享調(diào)用。MicrosoftWindows本身就是由若干個DLL組成的,其它應(yīng)用程序可以調(diào)用這些庫中的過程,完成窗口與圖形的顯示、內(nèi)存管理或其他任務(wù)。這些過程有時被稱為WindowsAPI,或應(yīng)用程序接口。表10-1列出部分常用的操作系統(tǒng)環(huán)境庫的DLL文件。表10-1常用的操作系統(tǒng)環(huán)境庫的DLL文件動態(tài)鏈接庫描述Advapi32.dll高級API服務(wù),支持大量的API(其中包括許多安全與注冊方面的調(diào)用)Comdlg32.dll通用對話框API庫Gdi32.dll圖形設(shè)備接口API庫Kernel32.dllWindows32位核心的API支持Lz32.dll32位壓縮例程Mpr.dll多接口路由器庫Netapi32.dll32位網(wǎng)絡(luò)API庫Shell32.dll32位ShellAPI庫User32.dll用戶接口例程庫Version.dll版本庫Winmm.dllWindows多媒體庫如果需要使用MicrosoftVisualBasic核心語言和控件未包含的功能,例如:讀寫系統(tǒng)注冊表、實現(xiàn)屏幕拷貝等功能,這些功能VisualBasic本身沒有提供。對VisualBasic內(nèi)部未提供的功能,可以考慮使用調(diào)用API函數(shù)或過程(以下均稱為過程)實現(xiàn),即可以直接調(diào)用包含在動態(tài)鏈接庫DLL中的API過程。通過DLL可以訪問構(gòu)成MicrosoftWindows操作系統(tǒng)主體的成千上萬個過程,還可以使用其它語言編寫的各種例程。10.1.2DLL函數(shù)或過程的聲明
WindowsAPI的過程是用C語言編寫的,在VisualBasic中使用它們之前,必須先進(jìn)行聲明。一般語法如下:(1)要聲明一個DLL過程,需要在代碼窗口的“聲明”部分增加一個Declare語句。如果該過程返回一個值,應(yīng)將其聲明為Function,即:DeclareFunction函數(shù)名Lib"庫名"[Alias"別名"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]AsType其中:1)Variable為變量名,type為變量類型或返回值類型。2)Lib"庫名"表示包含函數(shù)或過程的.dll文件位置。如果引用的過程屬于Windows核心庫(User32、Kernel32或GDI32),可以不包含文件擴(kuò)展名,例如:DeclareFunctionGetTickCountLib"kernel32"Alias"GetTickCount"()AsLong3)對于其它DLL,Lib子句指定文件的路徑,即:DeclareFunctionAFuncLib"C:\AA.dll"(ByValSAsInteger,ByValDAsInteger)AsLong4)如果未指定libname的路徑,VisualBasic將按照下列順序查找該文件:.Exe文件所在的目錄
當(dāng)前目錄
Windows位系統(tǒng)目錄(通常為\Windows\System)
Windows目錄
Path環(huán)境變量中的目錄。(2)如果過程沒有返回值,可將其聲明為Sub,即:
DeclareSub過程名Lib"庫名"[Alias"別名"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]
通過在VisualBasic應(yīng)用程序中聲明外部過程,能夠訪問WindowsAPI(以及其它的外部DLL)。聲明過程后,調(diào)用方法與VisualBasic的過程相同10.2使用ApiView聲明API函數(shù)或過程
DLL過程的聲明是比較復(fù)雜的。盡管可以自己進(jìn)行聲明轉(zhuǎn)換,最簡單的辦法是使用VisualBasic提供的預(yù)定義WindowsAPI聲明,這些聲明包含在VisualBasic安裝目錄下的\Winapi\Win32api.txt文件中,要使用該文件中的函數(shù)、類型等定義時,將所需要內(nèi)容從該文件復(fù)制到VisualBasic模塊中即可。查看并復(fù)制Win32api.txt中的過程,可以直接在記事本中打開,通常使用VisualBasic開發(fā)環(huán)境外接程序管理器中的APIViewer應(yīng)用程序進(jìn)行查看和使用。APIViewer應(yīng)用程序的步驟如下:第1步:加載APIViewer應(yīng)用程序。在菜單欄上選擇“外接程序→外接程序管理器”選項,彈出“外接程序管理器”對話框,選擇“VB6APIViewer”并選中“加載/卸載”復(fù)選框,如圖10-1所示;單擊“確定”按鈕后,在“外接程序”菜單中將看到“API瀏覽器”菜單項。圖10-1外接程序管理器
第2步:加載API聲明文件。在菜單欄上選擇“外接程序→API瀏覽器”選項,打開“API瀏覽器”窗口。在菜單欄上選擇“文件→加載文本文件”選項,如圖10-2所示;在彈出的“選擇一個文本API文件”對話框中選擇名稱為“Win32Api.txt”的文本文件,單擊“打開”按鈕。完成本步驟后,將看到API瀏覽器中“可用項”列表框中列出了常用的API聲明,如圖10-3所示。圖10-2加載API聲明文件
第3步:添加需要的API過程。在圖10-3所示的“API瀏覽器”中選擇“API類型”為聲明,通過滾動條選擇所需要的API過程,例如SetWindowTextAPI過程,該過程實現(xiàn)修改窗體的標(biāo)題欄的功能(當(dāng)然,在VB中修改窗體的標(biāo)欄設(shè)置其Caption屬性更加簡單,這里只是為了說明添加過程)。天價后,單擊“插入”按鈕,彈出提示信息對話框,如圖10-4所示。單擊“是”按鈕,完成添加。圖10-3添加SetWindowTextAPI過程到窗體的代碼文件注意:如果要將API過程添加到窗體的代碼文件中,必須選擇“聲明范圍”為“私有”;如果添加到標(biāo)準(zhǔn)模塊中,可以選擇“公有”和“私有”;如果在標(biāo)準(zhǔn)模塊也選擇私有,則該過程只能在該模塊中使用,反之,可以在項目的任何位置使用。第4步:使用API過程。打開窗體代碼,可以看到插入的API聲明部分:
PrivateDeclareFunctionSetWindowTextLib"user32"Alias"SetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString)AsLong
該過程功能是實現(xiàn)設(shè)置窗體的標(biāo)題欄文字,需要兩個參數(shù):參數(shù)1:窗體句柄,在VB中就是Me.hwnd
參數(shù)2:設(shè)置到窗體標(biāo)題欄的字符串在窗體上添加一個命令按鈕Command1,并為其Click事件添加如下代碼:
PrivateSubCommand1_Click()SetWindowTextMe.hwnd,"API函數(shù)使用"EndSub
學(xué)習(xí)API過程的使用,不需要開始就學(xué)習(xí)每一個過程如何使用,而是在程序開發(fā)過程中遇到什么方法的問題,才去查找相應(yīng)方面API過程的參考資料;學(xué)習(xí)API的過程也是不斷積累的過程。網(wǎng)上資源或書籍有很多關(guān)于API過程學(xué)習(xí)的資料,可以直接參考其范例中的聲明部分。10.3API過程使用案例
10.3.1案例:獲取計算機(jī)的名稱
[例10-1]獲取計算機(jī)的名稱,如圖10-5所示。圖10-5運行結(jié)果
[分析]可以使用GetComputerName的API過程獲取計算機(jī)的名稱,該過程可以通過前面介紹的添加“API瀏覽器”方法,在“API瀏覽器”對話框中找到該過程的聲明,再插入到當(dāng)前窗體,然后象使用一般過程的方法調(diào)用該過程。[建立工程]1.新建窗體,添加一個命令按鈕。2.參見圖10-1~圖10-3,在菜單欄上選擇“外接程序→API瀏覽器”選項,加載API文本文件后,在列出的“可用項”中找到GetComputerName(可以輸入GetComputerName前面幾個字母,“可用項”中將快速跳到以此開頭的過程),如圖10-6所示。圖10-6添加API過程聲明3.使用GetComputerName過程打開窗體代碼文件,可以看到加入到代碼中的聲明部分:
PrivateDeclareFunctionGetComputerNameLib"kernel32"Alias"GetComputerNameA"(ByVallpBufferAsString,nSizeAsLong)AsLongGetComputerName過程需要兩個參數(shù):參數(shù)1lpBuffer是字符串,保存取得的計算機(jī)名稱,必須在調(diào)用該過程前,定義字符串有足夠保存名稱的長度;參數(shù)2nSize是以地址傳遞方式傳遞的數(shù)字,指定lpBuffer字符串的長度,同時,過程調(diào)用結(jié)束時,該參數(shù)是實際獲取的計算機(jī)名稱的長度。[程序代碼]在窗體中,為命令按鈕Command1的Click事件編寫以下代碼,以調(diào)用該過程:PrivateSubCommand1_Click()DimstrNameAsString,NameLenAsLongNameLen=250strName=String(NameLen,vbNullChar)GetComputerNamestrName,NameLenMsgBox"你的計算機(jī)名稱是:"&Left(strName,NameLen)EndSub其中,vbNullChar為Vb中的空字符常數(shù),相當(dāng)于二進(jìn)制的0;vbNullString為VB中的空字符串。注意:調(diào)用
API過程時,參數(shù)類型必須與聲明的一致。本例中,如果實際計算機(jī)名稱不超過250個字符(250是足夠長的長度數(shù)),則字符串strName其余儲存空間將被填充為不可顯示的字符串結(jié)束標(biāo)記。因此,用Left系統(tǒng)函數(shù)取得實際的計算機(jī)名稱長度內(nèi)容。一般,如果API過程將改變字符串參數(shù)的內(nèi)容,必須定義該字符串變量有足夠的長度,也可以定義為定長字符串,如DimstrNameAsString*250;如果API過程只是讀取該參數(shù),而不需要修改該參數(shù),可以使用字符串常數(shù),或非定長字符串變量并預(yù)先進(jìn)行賦值。思考:設(shè)置計算機(jī)名稱的API過程聲明如下:PrivateDeclareFunctionSetComputerNameLib"kernel32"Alias"SetComputerNameA"(ByVallpComputerNameAsString)AsLong如何使用該過程改變計算機(jī)名稱?10.3.2案例:播放WAV聲音文件[例10-2]播放WAV聲音文件。[分析]許多人都使用過即時通訊軟件QQ,每當(dāng)新信息到達(dá)時,QQ會發(fā)出“滴滴滴”的聲響。實際上,這聲音文件來自QQ安裝目錄下的Sound文件夾中的msg.wav文件。VB沒有直接提供播放Wav聲音文件的系統(tǒng)函數(shù),可以用API函數(shù)sndPlaySound來實現(xiàn)該功能。參照例10-1中添加API過程的方法,在當(dāng)前窗體中添加sndPlaySound的API過程聲明,該聲明為:PrivateDeclareFunctionsndPlaySoundLib"winmm.dll"Alias"sndPlaySoundA"(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong
以上過程中,參數(shù)1lpszSoundName需要指定Wav文件的位置,如果為VbNullString(VB中的空字符串),則停止聲音的播放;參數(shù)uFlags是播放標(biāo)記常數(shù),該常數(shù)必須進(jìn)行聲明,其值可能是以下的幾種:PrivateConstSND_SYNC=&H0'playsynchronously(default)PrivateConstSND_ASYNC=&H1'playasynchronouslyPrivateConstSND_LOOP=&H8'loopthesounduntilnextsndPlaySound在“API瀏覽器”中加載API文本文件后,“選擇“API類型”為“常數(shù)”,可以看到以SND_開頭的一組符號常數(shù),選擇上面三個值添加到當(dāng)前窗體代碼中。SND_SYNC的含義:同步調(diào)用,程序必須等到聲音播放完畢,才繼續(xù)往下執(zhí)行;SND_ASYNC的含義:異步播放,播放聲音時,程序繼續(xù)往下執(zhí)行;SND_LOOP的含義:循環(huán)播放。如果要停止播放,設(shè)置sndPlaySound過程的參數(shù)1為VbNullString即可。[建立工程]
在窗體上添加兩個按鈕,名稱默認(rèn)為Command1(開始播放)和Command2(停止播放),界面布局如圖10-7所示。圖10-7界面布局[程序代碼]1 PrivateDeclareFunctionsndPlaySoundLib"winmm.dll"Alias"sndPlaySoundA"_(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong2 PrivateConstSND_SYNC=&H0'playsynchronously(default)3 PrivateConstSND_ASYNC=&H1'playasynchronously4 PrivateConstSND_LOOP=&H8'loopthesounduntilnextsndPlaySound5 6 PrivateSubCommand1_Click()7 sndPlaySound"c:\msg.wav",SND_ASYNC8 EndSub9 10 PrivateSubCommand2_Click()11 sndPlaySoundvbNullString,012 EndSub[代碼說明]行1~4:通過“API瀏覽器”添加的聲明部分。行6~8:開始播放聲音。注意,調(diào)試該例子時,必須實際存在C:\msg.wav文件,或替換其他任何存在的wav文件。行11:停止聲音的播放。10.3.3案例:截取屏幕到Picture控件顯示[例10-3]截取屏幕到Picture控件顯示。[分析]截取屏幕相當(dāng)于在鍵盤按下“PRTSCSYSRQ”鍵,然后粘貼到“畫圖”程序中得到屏幕的圖像。如果要在VB中實現(xiàn)該功能,需要借助GetDC的API過程獲取屏幕區(qū)域,然后用BitBltAPI過程將圖象繪到指定的設(shè)備,如Picture或窗體上;捕捉圖象完畢,需要使用ReleaseDCAPI過程釋放資源。[建立工程]首先用“API瀏覽器”添加三個API的過程聲明:(1)PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong該過程取得目標(biāo)繪圖區(qū)域的Handle,相當(dāng)于指向該區(qū)域的指針。GetDC過程需要hwnd參數(shù),如果該參數(shù)為0,表示取得屏幕區(qū)域;如果是控件的hwnd,則為控件區(qū)域。例如,窗體的hwnd即Me.Hwnd,則取得窗體區(qū)域。(2)PrivateDeclareFunctionReleaseDCLib"user32"(ByValhwndAsLong,ByValhDCAsLong)AsLong與GetDC對應(yīng)的過程,調(diào)用GetDC完成處理后,要釋放所占用的DC資源。(3)PrivateDeclareFunctionBitBltLib"gdi32"(_ByValhDestDCAsLong,_ByValxAsLong,_ByValyAsLong,_ByValnWidthAsLong,_ByValnHeightAsLong,_ByValhSrcDCAsLong,_ByValxSrcAsLong,_ByValySrcAsLong,_ByValdwRopAsLong)AsLong該過程參數(shù)看上去相當(dāng)復(fù)雜,但理解每個參數(shù)含義后,使用也是比較簡單的;其功能是:將來源區(qū)域的圖像按照dwRop方式繪制到目標(biāo)區(qū)域中。注意:分行符前必須有空格。參數(shù)說明如下:參數(shù)1hDestDC:目標(biāo)區(qū)域的DC,在VB中,即控件的hDC屬性。在VB中,具有該屬性的控件只有窗體和Picture,因此,將圖像繪制到這兩個控件的任何一個(其他控件沒有hDC屬性,但可以通過GetDC獲?。?。參數(shù)2,3,4,5:目標(biāo)區(qū)域的繪圖起點和寬度、高度。參數(shù)6hSrcDC:來源區(qū)域的hDC,可以通過GetDC獲取,如果是屏幕,則使用GetDC(0)取得。參數(shù)7,8(xSrc,ySrc):指定源區(qū)域的起點。參數(shù)9dwRop:將來源圖像繪制到目標(biāo)區(qū)域的方式,其中,vbSrcCopy直接將圖像從來源拷貝到目標(biāo),其他方式大部分是來源區(qū)域圖像與目標(biāo)區(qū)域圖像疊加產(chǎn)生的各種效果,其含義參見表10-1的描述。表10-1繪圖方式dwRop常數(shù)常數(shù)值描述vbDstInvert&H00550009反轉(zhuǎn)目標(biāo)位圖vbMergeCopy&H00C000CA合并模式和源位圖vbMergePaint&H00BB0226用Or運算合并反轉(zhuǎn)的源位圖和目標(biāo)位圖vbNotSrcCopy&H00330008將反轉(zhuǎn)的源位圖復(fù)制到目標(biāo)vbNotSrcErase&H001100A6用Or運算合并源位圖和目標(biāo)位圖,然后反轉(zhuǎn)vbPatCopy&H00F00021L將模式復(fù)制到目標(biāo)位圖vbPatInvert&H005A0049L用Xor運算合并目標(biāo)位圖與模式vbPatPaint&H00FB0A09L用Or運算合并反轉(zhuǎn)的源位圖與模式。然后用Or運算合并上述結(jié)果與目標(biāo)位圖vbSrcAnd&H008800C6用And運算合并目標(biāo)像素與源位圖vbSrcCopy&H00CC0020將源位圖復(fù)制到目標(biāo)位圖vbSrcErase&H00440328反轉(zhuǎn)目標(biāo)位圖并用And運算合并所得結(jié)果與源位圖vbSrcInvert&H00660046用Xor運算合并目標(biāo)像素和源位圖vbSrcPaint&H00EE0086用Or運算合并目標(biāo)像素和源位圖1 PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong2 PrivateDeclareFunctionReleaseDCLib"user32"(_ ByValhwndAsLong,ByValhDCAsLong)AsLong3 PrivateDeclareFunctionBitBltLib"gdi32"(_ ByValhDestDCAsLong,_ ByValxAsLong,_ ByValyAsLong,_ ByValnWidthAsLong,_ ByValnHeightAsLong,_ ByValhSrcDCAsLong,_ ByValxSrcAsLong,_ ByValySrcAsLong,_ ByValdwRopAsLong)AsLong4 PrivateDeclareSubSleepLib"kernel32"(ByValdwMillisecondsAsLong)5 6 PrivateSubPicture1_Click()7 Me.Visible=False8 DoEvents9 Sleep(100)10 [程序代碼]11
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙江建筑安全員《A證》考試題庫及答案
- 2025江西省安全員-C證考試(專職安全員)題庫及答案
- 2025陜西省建筑安全員《B證》考試題庫及答案
- 2025浙江省安全員A證考試題庫附答案
- 二十四節(jié)氣之立春課件模板
- 《蛋糕制作》課件
- 工藝管道培訓(xùn)課件
- 《海南??谙母偂氛n件
- 單位管理制度收錄大合集【人員管理篇】
- 有機(jī)玻璃操作箱行業(yè)行業(yè)發(fā)展趨勢及投資戰(zhàn)略研究分析報告
- 小豆苗產(chǎn)品介紹門診端
- 空調(diào)安裝和維修的培訓(xùn)
- ??祱?zhí)法記錄儀解決方案
- 液化氣供應(yīng)站安全管理制度和營業(yè)制度
- GB/T 21385-2008金屬密封球閥
- GB/T 18994-2003電子工業(yè)用氣體高純氯
- 文言文閱讀訓(xùn)練:《三國志-武帝紀(jì)》(附答案解析與譯文)
- (完整版)招聘面試方案設(shè)計與研究畢業(yè)論文設(shè)計
- 調(diào)休單、加班申請單
- 肉制品生產(chǎn)企業(yè)名錄296家
- 規(guī)劃設(shè)計收費標(biāo)準(zhǔn)
評論
0/150
提交評論