?? 22.txt
字號:
WIN32 API
一、VB5.0與Windows API 間的呼叫技巧
一、VB5.0與Windows API 間的呼叫技巧
一般會使用WINDOW API的情況,實(shí)在是因?yàn)閂B本身不提供某些功能,但是,程式所需又
不得不然,例如:讀取Registry內(nèi)的資料,VB只提供SaveSetting、Getsetting 等系列
的指令,但是它只能讀取特定地區(qū)的值,要讀、刪、更動其他區(qū)域的值時,就無法使用
。再如:仔細(xì)看一看Combo Box的Events,其中沒有MouseMove,但這是我們經(jīng)常用上的
一個Event,那該如何呢?是的,那只有透過Winodow API。而VB呼叫Window API一般不
都使用API檢視員,直接將相對應(yīng)的API COPY到我們的程式中就好,那還用什麼技巧嗎?
其實(shí)不然,因?yàn)閂B資料格式的問題,又加上VB本身沒有指標(biāo),在許多地方需要一些小技
巧才能解決,而且我們經(jīng)常因應(yīng)不同的需求,將API 檢視員的宣告COPY過來後再做一些
修改,最重要的,如果有一個.DLL檔,它不在API 檢視員中定義,那時,就只有自己想
辦法啦。
一、 整數(shù)叁數(shù)
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
Windows API 宣告
SHORT GetKeyState( int nVirtKey )
對應(yīng)的VB宣告
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
-----------------------------------------------------------------------------
這個API 可用來檢視某些KEY (如Insert鍵、Num Lock、CapsLock等)是on/off。程式如
下:這個例子應(yīng)該可十分楚的看到各個整數(shù)間的宣告對應(yīng)。
-----------------------------------------------------------------------------
Dim InsertMode as Integer
InsertMode = GetKeyState(vbKeyInsert) And vbShiftMask
If InsertMode = 1 then
Debug.print "表示 Insert Mode"
Else
Debug.print "表示 OverWrite Mode"
End If
-----------------------------------------------------------------------------
二、 指向整數(shù)的指標(biāo)
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內(nèi)定是使用傳址呼叫,所以ByRef 可以省略,也就是說
Func(ByRef param1 as type)
與
Func(param1 as type)
是相同的,使用傳址呼叫的方式,不外??想將叁數(shù)傳給API 後將結(jié)果傳回來。然而LONG
型態(tài)的傳址呼叫在VB中又占了相當(dāng)大的份量,因?yàn)?2位元的指標(biāo)都是LONG的型態(tài),而字
串、自定型態(tài)的Structure在Windows API中是以指標(biāo)來傳遞的,而指標(biāo)的傳遞事實(shí)上也
是Long值的傳遞,只不過傳過去的LONG值,於WIN API中會將之當(dāng)成Address,而再配合
指標(biāo)運(yùn)作而得指標(biāo)所指的內(nèi)容,這個觀念在後面會很重要。
例如: -----------------------------------------------------------------------------
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
);
相對應(yīng)的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 '//最後一個叁數(shù)是ByRef之宣告
-----------------------------------------------------------------------------
我們經(jīng)常會想要用程式來讀取Registry中的資料,例如:我們想得知Win95的Produ ct
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而Key Handle
的取得便是利用RegQu
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -