編程專題講座excel vba開發(fā)技術(shù)第29章使用windows api_第1頁
編程專題講座excel vba開發(fā)技術(shù)第29章使用windows api_第2頁
編程專題講座excel vba開發(fā)技術(shù)第29章使用windows api_第3頁
編程專題講座excel vba開發(fā)技術(shù)第29章使用windows api_第4頁
編程專題講座excel vba開發(fā)技術(shù)第29章使用windows api_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

29章使用WindowsWindowsAPIWindowsWindows應(yīng)VBAWindowsAPIOfficeWindowsAPI代碼進(jìn)入操作系統(tǒng)。要在Excel中調(diào)用API函數(shù),需要先了解API及其相關(guān)知識(shí)。WindowsAPIAPIApplicationProgrammingInterface,WindowsAPI也就是Windows使用這些API函數(shù)可以像搭積木一樣Windows環(huán)境下的應(yīng)用程序。但是,如果全部使用API函數(shù)進(jìn)行應(yīng)用程序開發(fā),程序員就必須熟記一大堆常用的API函數(shù),而且還得對(duì)Windows操作系統(tǒng)有深入的了解。這樣,程序的開發(fā)效率將很低。Windows平臺(tái)上出現(xiàn)了很多優(yōu)秀的可視化編程環(huán)境,程優(yōu)秀的可視化編程環(huán)境操作簡(jiǎn)單、界面友好(VB、VisualC++、DELPHI等),在這API的神秘功能,事實(shí)上這些類庫和WindowsAPIAPI函數(shù)的集合。它們把常用API函數(shù)組合在一起成為一個(gè)控件或類庫,并賦予其方便的使用方法,所以極大地提高Windows應(yīng)用程序的開發(fā)效率。有了這些控件和類庫,程序員便可以把主要精力放在程用API函數(shù)來實(shí)現(xiàn)。應(yīng)用程序同樣也可調(diào)用API函數(shù),以擴(kuò)充應(yīng)用程序的功能APIWindowsWindowsAPI提供的函數(shù),通過這些函數(shù)可以保證所有在Windows中運(yùn)行的應(yīng)用程序都按照統(tǒng)一的方式運(yùn)行。WindowsAPI函數(shù)包含在一系列擴(kuò)展名為DLL的動(dòng)態(tài)庫文件中共有上千個(gè)API函數(shù)。對(duì)于數(shù)量眾多的API函數(shù),開發(fā)者不必刻意去研究每個(gè)API函數(shù)的用法,但是在需要的時(shí)候,至少應(yīng)該知道它屬于哪一類的API函數(shù),這樣才能正確查找和使用。按照通常的劃分標(biāo)準(zhǔn),WindowsAPI7API函數(shù)向應(yīng)用程序提供了一些創(chuàng)建和管理用戶界面的方法,窗體通用控制類:系統(tǒng)S 眾不同的外觀,通用控制是由通用控制庫COMCTL32.DLL提供的。 圖形設(shè)備接口(GDI32):提供繪圖、圖形處理、使用顯示設(shè)備等一系列 國(guó)際特性類:有助于編寫的應(yīng)用程序,提供Unicode字符集和多語種支持過查看API幫助掌握其使用方法即可。WindowsAPI提供的函數(shù),使用VBA可以利用Windows操作系統(tǒng)的強(qiáng)大功能,VBAAPI的使用方法,使讀者掌握使用API的方法。VBA可以調(diào)用動(dòng)態(tài)庫(DLL)中的函數(shù)。在大多數(shù)情況下,這些DLL文件是由CC++VBA中調(diào)用這些函數(shù)時(shí),需要進(jìn)行一些特殊設(shè)置,使其能與C的數(shù)據(jù)類型進(jìn)行數(shù)據(jù)交換。本節(jié)介紹具體的設(shè)置方法。使用VBA的Declare語句,可在模塊級(jí)別中對(duì)動(dòng)態(tài)庫(DLL)中外部過程。Declare[Public|Private]DeclareSubnameLib"libname"[Alias"aliasname"][Public|Private]DeclareSubnameLib"libname"[Alias"aliasname"][Public|Private]DeclareFunctionnameLib"libname"[Alias[([arglist])][As 語句的語法包含下面幾部分的內(nèi)容Private:用于只能在包含該的模塊中使用的過程N(yùn)ame:任何合法的過。注意動(dòng)態(tài)庫的名稱區(qū)分大小寫lias:表示將被調(diào)用的過程在動(dòng)態(tài)庫(DLL)中還有另外的名稱。當(dāng)外部過與某個(gè)關(guān)鍵字重名時(shí),就可以使用這個(gè)參數(shù)。當(dāng)動(dòng)態(tài)庫的過程與同一范圍內(nèi)的公用變量、常數(shù)或任何其他過程的名稱相同時(shí),也可以使用lia用a。則aliasname是動(dòng)態(tài)庫中該過程的處的名稱。如果首字符是(#),則隨arglist:代表調(diào)用該過程時(shí)需要傳遞的參數(shù)的變量表type:FunctionByte、Boolean、Integer、Long、Currency、Single、Double、Date、String(只支持變長(zhǎng))Variant的用戶定義類[Optional][ByVal|ByRef][ParamArray]varname[()][As 是可選的,而且必須都使用Optional關(guān)鍵字。如果使用了ParamArray,則任何參數(shù)都不能使用Optional。ByValByRef:表示該參數(shù)按地址傳遞。ByRefVBA關(guān)鍵字不能與ByVal、ByRef或Optional一起使用。typeByte、Boolean、Integer、Long、Currency、Single、Double、Date、String(只支持變長(zhǎng))、Object、Variant的用戶ByValByVal,VBA運(yùn)行時(shí)錯(cuò)誤以方式傳遞參數(shù)會(huì)將該參數(shù)的內(nèi)存地址傳遞給被調(diào)用的過程。如果被調(diào)用的過程由于以方式傳遞參數(shù)可以在內(nèi)存中修改參數(shù)值,因此如果不正確地以方式傳遞參數(shù),API函數(shù)可能會(huì)改寫它不應(yīng)該寫入的內(nèi)存,從而導(dǎo)致錯(cuò)誤或其他一些難以預(yù)料的結(jié)果。Windows中有很多不應(yīng)該被改寫的值。例如,Windows給每個(gè)窗體分配一個(gè)唯一的稱為“句柄”的32位標(biāo)識(shí)符。注意:當(dāng)所調(diào)用的外部過程需要一個(gè)值為0的字符串時(shí),就要使用vbNullString常數(shù)。該API函數(shù)還需要定義它用到的常量及類型。應(yīng)將常量、用戶自定義類型的定義,與要使用它們的函數(shù)的Declare語句一起放在模塊的部分。從API的相關(guān)文檔可以找有時(shí)可能需要向函數(shù)傳遞常量,以指明要求該函數(shù)返回何種信息。例如,GetSystemMetrics函數(shù),在程序中不必包含所有75個(gè)常量,只包含要使用的那些常量即可。使用API從前面的介紹可知,在使用API函數(shù)之前,必須先API函數(shù),另外,API函數(shù)中的很多參數(shù)使用預(yù)定義的結(jié)構(gòu)和常數(shù)。API(包括結(jié)構(gòu)、常數(shù))必須放在窗體或模塊的“通用”(General)段API函數(shù)部分看起來就覺得很復(fù)雜,并且對(duì)字符需要區(qū)分大小寫。API函數(shù)的聲下,可直接從API瀏覽器中過來,這樣可以避免出現(xiàn)錯(cuò)誤。下面以VB6開發(fā)環(huán)境中提供的API瀏覽器為例,介紹查詢的方法。VB6中單擊主菜單【外接程序】|【API瀏覽器】命令(在圖29-1所示框中還未顯示任何內(nèi)容,需要先載入相應(yīng)的API文件。單擊菜單【文件】|【文本文件】命令,打開如圖29-2所示框,選擇WIN32API.TXT,并單擊【打開】按鈕將該文件加載到API瀏覽器窗體中。圖29-1【API瀏覽器】窗 圖29-2加載文本文在【API類型】下拉列表框中可以選擇,然后在下面的文本框中輸入部分字flash,在【可用項(xiàng)】列表框中將顯示匹配的內(nèi)容。在【可用項(xiàng)】列表框中雙擊API函數(shù)FlashWindow,該項(xiàng)的詳細(xì)內(nèi)容將添加到下方的【選定項(xiàng)】列表框中,如圖29-3所示。29-3API函數(shù)調(diào)用APIUSER.DLL動(dòng)態(tài)庫中包含一個(gè)API函數(shù)FlashWindow,使用該函數(shù)可將指定的窗API函數(shù)的使用方法。本例需要使用以下兩個(gè)API函數(shù):FlashWindowPrivatePrivateDeclareFunctionFlashWindowLib"user32"(_ByValhWndAsLong,ByValbInvertAsLong)AshWndVBA中,沒有屬性可以直接返回窗體的句柄,所以還需要使用FindWindow函數(shù)查詢窗體的句柄。PrivatePrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsLong,ByVallpWindowNameAsString)As0。API函數(shù)的作用、參數(shù)以后,就可以在ExcelVBA中開始編寫代碼。具體單擊菜單【插入】|【用戶窗體】命令,向工程中增加一個(gè)用戶窗PrivatePrivateDeclareFunctionFlashWindowLib"user32"(_ByValhwndAsLong,ByValbInvertAsLong)AsPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsLong,ByVallpWindowNameAsString)As在用戶窗體中,必須將其改為Private。DimhWndAs '保存當(dāng)前窗體的句 PrivateSubUserForm_Initialize()hWndPrivateSubUserForm_Initialize()hWnd=FindWindow(0&,"UserForm1")EndFindWindow函數(shù)查找用戶窗體的句柄時(shí),因窗體標(biāo)題比較容易獲得,所以省略了窗體類的名稱,直接傳遞一個(gè)長(zhǎng)整型的0給函數(shù)。PrivatePrivateSubcmdFlash_Click()Fori=1To100CallFlashWindow(hWnd,True)CallFlashWindow(hWnd, '使窗體處于活動(dòng)狀End29-4在VBE中,通過單擊菜單【插入】|【用戶窗體】命令向工程中插入的用戶窗體是一只有通過API函數(shù)才能完成任務(wù)。要實(shí)現(xiàn)半透明窗體的效果,需要使用多個(gè)API函數(shù),下面簡(jiǎn)單介紹這些APISetLayeredWindowAttributesPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValhWndAsLong,ByValcrKeyAsLong,ByValbAlphaAsByte,_ByValdwFlagsAsLong)AsLongbAlpha:是,取值范圍是dwFlags:是透明方式,可以取以下兩顏色為crKey的地方將變?yōu)橥该?。提示:要使窗體擁有透明效果,首先要使用以下語句定義 常量WS_EX_LAYERED= GetWindowLong(ByValhWndAsLong,ByValnIndexAsLong)AsLongGWL_EXSTYLE:得到擴(kuò)展的窗體風(fēng)GWL_STYLE:得到窗體風(fēng)格CallWindowProc函數(shù)來調(diào)用;GWL_HINSTANCE:得到應(yīng)用程序運(yùn)行實(shí)例的句GWL_HWNDPARENT:得到父窗體的GWL_ID:得到窗體的標(biāo)識(shí)符GWL_USERDATA32位的值(每一個(gè)窗體都有一個(gè)有意留給創(chuàng)建窗體的應(yīng)用程序使用的32位的值)。GetWindowLong函數(shù)得到擴(kuò)展的窗體風(fēng)格(GWL_SetWindowLong函GetWindowLong函數(shù)對(duì)應(yīng),SetWindowLong函數(shù)用來修改給定窗體的一個(gè)屬性。(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)As了解以上API函數(shù)后,就可以在VBE中開始制作透明窗體了。具體步驟如下單擊菜單【插入】|【用戶窗體】命令,增加一個(gè)用戶窗體。向用戶窗體中添 29-5(ByValhWndAsLong,ByValnIndexAsLong)AsLong(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValhWndAsLong,ByValcrKeyAsLong,ByValbAlphaAsByte,_ByValdwFlagsAsLong)AsLongPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLongPrivatePrivateConstWS_EX_LAYERED=&H80000PrivateConstGWL_EXSTYLE=(-20)PrivateConstLWA_ALPHA=&H2PrivatePrivateConstLWA_ALPHA=&H2PrivateConstLWA_COLORKEY=&H1在窗體的初始化中編寫以下代碼,調(diào)用 函數(shù)完成透明窗體的設(shè)置PrivateSubUserForm_Initialize()DimrtnAsLong,hWndAsLonghWndPrivateSubUserForm_Initialize()DimrtnAsLong,hWndAsLonghWnd=FindWindow(0&,Me.Caption)rtnGetWindowLong(hWnd,GWL_EXSTYLE)獲取擴(kuò)展屬性rtn=rtnOrWS_EX_LAYEREDSetWindowLonghWndGWL_EXSTYLE SetLayeredWindowAttributeshWnd0100LWA_ALPHAEndSetLayeredWindowAttributesbAlpha0,窗體將完全透明,處于看不見的狀態(tài)。設(shè)置參數(shù)bAlpha為255,窗體將不透明(與正常窗體一樣)。29-629-7CreateEllipticRgnPrivateDeclareFunctionCreateEllipticRgnLib"gdi32"( ByValByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsAs提示:該函數(shù)創(chuàng)建的區(qū)域在不用時(shí)一定要用 函數(shù)刪除DeleteObjectPrivatePrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLongSetWindowRgn函PrivatePrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)As了解以上API函數(shù)后,就可以在VBE中開始制作橢圓窗體了。具體步驟如下單擊菜單【插入】|【用戶窗體】命令,增加一個(gè)用戶窗體。向用戶窗體中添 個(gè)、2個(gè)文字框、2個(gè)按鈕,設(shè)置用戶窗體及控件的屬性,得到如圖29-8所示窗體29-8提示:PrivatePrivateDeclareFunctionCreateEllipticRgnLib"gdi32"(ByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsLong)AsLongPrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsPrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLongPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLong在窗體的初始化中編寫以下代碼,調(diào)用 函數(shù)完成橢圓窗體的設(shè)置PrivateSubUserForm_Initialize()DimrgnAsLong,hWndAsLonghWndPrivateSubUserForm_Initialize()DimrgnAsLong,hWndAsLonghWnd=FindWindow(0&,Me.Caption)rgnCreateEllipticRgn(0,0Me.Width,Me.Height創(chuàng)建橢圓SetWindowRgnhWnd,rgn,TrueCallEndSetWindowRgnCreateEllipticRgn函數(shù)創(chuàng)建SetWindowRgn函數(shù)將窗體剪切為SetWindowRgn函數(shù)進(jìn)行設(shè)置即可。要繪制不規(guī)則區(qū)域,可使用API函數(shù)CreatePolygonRgn,該函數(shù)原型如下PrivatePrivateDeclareFunctionCreatePolygonRgnLib"gdi32"(lpPointAsPOINTAPI,ByValnCountAsLong,ByValnPolyFillModeAsLong)AsLonglpPoint:為POINTAPI類型的變量。POINTAPI是一個(gè)用于描nPolyFillMode:描述多邊形填充模式??蔀锳LTERNATE或WINDING常數(shù)。單擊菜單【插入】|【用戶窗體】命令,增加一個(gè)用戶窗體。向用戶窗體中添 圖29-9原始的【不規(guī)則窗體】PrivatePrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLongPrivateDeclareFunctionCreatePolygonRgnLib"gdi32"(lpPointAsPOINTAPI,ByValnCountAsLong,ByValnPolyFillModeAsLong)AsLongPrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong類型來表示。在部分編寫以下代碼創(chuàng)建該自定義類型:PrivatePrivateTypePOINTAPIxAsLongyAsEnd使用這些坐標(biāo)數(shù)組繪制一個(gè)多邊形,SetWindowRgn函數(shù)使用該多邊形設(shè)置窗體的外形,PrivateSub DimDimhWndAsLong,ResultAsLongDimP(5)AsPOINTAPIP(0).x=P(0).y=P(1).x=P(1).y=P(2).x=Me.Width-50P(2).y=Me.Height-50P(3).x=Me.Width-100P(3).y=Me.HeightP(4).x=0P(4).y=Me.Height/Result=CreatePolygonRgn(P(0),5,hWnd=FindWindow(0&,Me.Caption)'查找窗體句柄SetWindowRgnhWnd,Result,True'改變窗體區(qū)域CallDeleteObject(Result) End圖29-10創(chuàng)建好的【不規(guī)則窗體】提示:在 中調(diào)整窗體的原始大小,可得到形狀不同的不規(guī)則窗體VBAWindowsAPI函數(shù)來獲取系統(tǒng)GlobalMemoryStatus函數(shù)可獲得當(dāng)前可用的物理和虛擬內(nèi)存信息,該函數(shù)原型PublicPublicDeclareSubGlobalMemoryStatusLib"kernel32"(lpBufferAs類型MEMORYSTATUS的定義如下:PublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFilePublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFileAsLongdwAvailPageFileAsLongdwTotalVirtualAsLongdwAvailVirtualAsLongEnddwLength:MEMORYSTATUS結(jié)構(gòu)的大小,在調(diào)用GlobalMemoryStatus函數(shù)前dwMemoryLoad0~100之間的值,用來指示當(dāng)前系統(tǒng)內(nèi)存的使dwTotalPhys:返回總的物理內(nèi)存大小,以字節(jié)(B)為單dwAvailPhys:返回可用的物理內(nèi)存大小,以字節(jié)(B)為單位dwAvailPageFile:返回可用的頁面文件大小,以字節(jié)(B)為單位GlobalMemoryStatusExcel中編寫函數(shù)來獲取內(nèi)存的狀態(tài)單擊菜單【插入】|【模塊】命令,向工程中插入一個(gè)模塊在模塊的部分粘貼API函數(shù)的定義如下PublicPublicDeclareSubGlobalMemoryStatusLib"kernel32"(lpBufferAsPublicPublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFileAsdwAvailPageFiledwAvailPageFileAsLongdwTotalVirtualAsLongdwAvailVirtualAsLongEndDimMemStatAsPrivatePrivateSub內(nèi)存信息Dimstr1AsString,tempAsSingleMemStat.dwLength=Len(MemStat)tempRound(MemStat.dwTotalPageFile102410242)str1="物理內(nèi)存:"&temp&"MB"&vbNewLinetemp=Round(MemStat.dwAvailPhys/1024/1024,2)str1=str1&"可用內(nèi)存:"&temp&"MB"&vbNewLinetempRound(MemStat.dwTotalPageFile102410242)str1=str1&"虛擬內(nèi)存:"&temp&"MB"&vbNewLinetempRound(MemStat.dwAvailPageFile102410242)str1=str1&"可用虛擬內(nèi)存:"&temp&"MB"MsgBoxstr1vbOKOnly內(nèi)存信息End圖29-11【內(nèi)存信息】VBA中,沒有提供獲取鍵盤狀態(tài)的函數(shù)。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論