盡管Windows的API函數在當今“Visual”成風的時代正漸漸被人們忘卻,但是正如當年開發高技巧的DOS軟件離不開匯編語言和DOS系統功能調用一樣,無論開發平台高級到什麼地步,只要Windows還在最底層運作,就要用到API函數。無論VB的開發手段多麼高明,功能多麼強大,但是在現實應用中,總有一些功能的實現是VB無能為力的。微軟也早意識到這一點,在VB的諸多版本中始終為API留有一席之地。根據筆者多年的VB開發經驗,每當我們為了實現一個功能在VB浩瀚的對象、屬性、方法、函數中苦苦搜索最終無功而返時,如果換一個角度,到API函數庫中去探尋,往往能得到一個驚喜。
API函數是應用程序接口函數的縮寫。Windows在API函數庫中,為用戶開發基於Windows的應用程序提供了所需的各種基本功能。API函數庫的幾百個函數分布在Windows系統的三個動態鏈接庫中。這三個庫在Windows3.x中名為“KERNEL”、“USER”和“GDI”,在Windows 95中名為“KERNEL32”、“USER32”和“GDI32”。這些API函數的功能和接口在Windows的編程手冊中有系統詳盡的說明,也可以從Visual C++ for Windows或Borland C++ for Windows的聯機幫助手冊中查到。
在VB中引用API函數,就像混合語言編程一樣,要聲明所引用的函數調用接口以及函數所在的動態鏈接庫。聲明一個API函數的語法為:
Declare Function 函數名
Lib “庫名 ([參數表])
As 返回類型
如果一個API函數返回值為空(void),可以把它聲明為過程:
Declare Sub 過程名
Lib “庫名 ([參數表])
此外,相當一部分API函數的調用參數中用到了Windows系統定義的結構數據類型,這些類型在VB中也要用Type語句定義。
好在VB在提供訪問API函數功能的同時,也給用戶提供了一個友好的工具,可以省去我們聲明API函數、定義結構數據類型的絕大部分工作。這個工具在VB5.0中叫“API Text Viewer”。在該工具中,載入“Win32api.txt”後,就可以在“Declares”類中搜索API函數聲明,在“Types”類中搜索結構數據類型的定義,或在“Costants”類中搜索API函數中用到的常量定義。把搜索到的聲明、定義直接通過剪貼板復制 B程序中比較省力省心。
把需要用到的函數聲明和相關的數據結構定義以及常數定義加到窗體(Form)的General部分,就可以在程序中像調用普通VB函數一樣方便地調用API函數。
以下從實用的角度出發,援引筆者在實際工作開發中的API應用一例,謹供參考。
漫游過Windows 3.2的五分鐘教程的用戶,大概還記得演示鼠標用法。鼠標指針自動隨教程的指令移動,自動點開菜單、按動按鈕,完全脫離了對物理鼠標器的依賴。這種高級控制技巧在VB的函數和方法中是找不到的,仍然要借助於API函數。
本例用API函數實現對鼠標的“遙控”:無論鼠標指針在何處,一個菜單命令Alt-C就能使鼠標指針自動平滑移動到窗口中一個按鈕的中心,然後自動按動按鈕,激活按鈕的Click事件處理過程。掌握了本例的方法後,前面提到的五分鐘教程軟件就不難制作了。
本例中,以下幾個功能的實現至關重要:獲取鼠標光標在屏幕上的位置、獲取按鈕在屏幕上(注意:不是在窗口中)的位置、移動鼠標光標、自動按下和放開按鈕,下面分別介紹。
獲取鼠標光標在屏幕上的位置和移動鼠標光標,分別需調用API函數GetCursorPos和SetCursorPos。這兩個函數的接口聲明如下:
Declare Function GetCursorPos Lib “user32 (lpPoint As POINTAPI) As Long Declare Function SetCursorPos Lib “user32 (ByVal X As Long, ByVal Y As Long) As Long
在SetCursorPos函數中,參數X和Y指定了鼠標光標在屏幕上的坐標。GetCursorPos函數把鼠標光標的當前位置存到結構變量lpPoint中。結構變量的定義如下:
Private Type POINTAPI
X As Long
Y As Long
End Type
按鈕的Left和Top屬性給出的是按鈕的左上角在窗口客戶區坐標系中的坐標位置。要把鼠標光標移到按鈕正中,需要得到按鈕中心在屏幕坐標系中的坐標位置。窗口客戶區坐標系與屏幕坐標系不僅坐標原點不同,二者的坐標單位(scale)也不同。窗口客戶區坐標系的單位是Twip,屏幕坐標系單位是Pixel,二者的關系可以從屏幕對象Screen的TwipsPerPixelX和TwipsPerPixelY屬性獲取。這兩個屬性分別代表了水平和垂直兩個方向上的單位轉換比例。