一般會使用WINDOW API的情況,實在是因為VB本身不提供某些功能,但是,程式所需又不得不然,例如:讀取Registry內的資料,VB只提供SaveSetting、Getsetting 等系列的指令,但是它只能讀取特定地區的值,要讀、刪、更動其他地區的值時,就無法使用。再如:仔細看一看Combo Box的Events,其中沒有MouseMove,但這是我們經常用上的一個Event,那該如何呢?是的,那隻有透過Winodow API。而VB呼叫Window API一般不都使用API檢視員,直接將相對應的API COPY到我們的程式中就好,那還用什麽技巧嗎?其實不然,因為VB資料格式的問題,又加上VB本身沒有指標,在許多地方需要一些小技巧才能解決,而且我們經常因應不同的需求,將API 檢視員的宣告COPY過來後再做一些修改,最重要的,如果有一個.DLL檔,它不在API 檢視員中定義,那時,就只有自己想辦法啦。
一、 整數三數
Windows API32位元VB
============================== =============================
Int, INT ByVal Long
UNIT, DWORD ByVal Long
BOOL ByVal Long ture時為1
WPARAM, LPARAM, LRESULT ByVal Long
Handle(如HKEY) ByVal Long
WORD, ATOM, SHORT ByVal Integer
BYTE, CHAR ByVal Byte
Eg.
-----------------------------------------------------------------------------
Windows API 宣告
SHORT GetKeyState( int nVirtKey )
對應的VB宣告
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
-----------------------------------------------------------------------------
這個API 可用來檢視某些KEY (如Insert鍵、Num Lock、CapsLock等)是on/off。程式如下:這個例子應該可十分楚的看到各個整數間的宣告對應。
-----------------------------------------------------------------------------
Dim InsertMode as Integer
InsertMode = GetKeyState(vbKeyInsert) And vbShiftMask
If InsertMode = 1 then
Debug.print "表示 Insert Mode"
Else
Debug.print "表示 OverWrite Mode"
End If
-----------------------------------------------------------------------------
二、 指向整數的指標
Windows API 32位元VB
============================ ==========================
LPINT (ByRef ) Long
LPUNIT (ByRef ) Long
LPBOOL (ByRef ) Long
LPDWORD (ByRef ) Long
LPHANDLE (如:PHKEY) (ByRef ) Long
LPWORD (ByRef ) Integer
LPSHORT (ByRef ) Integer
LPBYTE (ByRef ) Byte
VB內定是使用傳址呼叫,所以ByRef 可以省略,也就是說
Func(ByRef param1 as type)
與
Func(param1 as type)
是相同的,使用傳址呼叫的方式,不外乎想將三數傳給API 後將結果傳回來。然而LONG型態的傳址呼叫在VB中又佔了相當大的份量,因為32位元的指標都是LONG的型態,而字串、自定型態的Structure在Windows API中是以指標來傳遞的,而指標的傳遞事實上也是Long值的傳遞,只不過傳過去的LONG值,於WIN API中會將之當成Address,而再配合指標運作而得指標所指的內容,這個觀念在後面會很重要。
例如:
-----------------------------------------------------------------------------
LONG RegOpenKeyEx(
HKEY hKey, // handle of open key
LPCTSTR lpszSubKey, // address of name of subkey to open
DWORD dwReserved, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // address of handle of open key
);
相對應的VB 宣告
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long) As Long '//最後一個三數是ByRef之宣告
-----------------------------------------------------------------------------
我們經常會想要用程式來讀取Registry中的資料,例如:我們想得知Win95的Product ID該如何做呢?這裡有幾個觀念要先清楚:首先:ProductId在何處呢?在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVerson下的ProductId。 我們要取得的便是KEY 為 HKEY_LOCAL_MACHINE
SUBKEY 為 SOFTWARE\Microsoft\Windows\CurrentVerson
ValueName 為 ProductId 的value
然而要取得ProductId的value可沒那麽直接,要先取得SubKey的KeyHandle而KeyHandle的取得便是利用RegQueryKeyEx的API 。程式部份在介紹Win API字串傳遞時再一併介紹。