摘自‘VB心得笔记’
一般会使用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字串传递时再一并介绍。
<  
1/2 1 2 下一页 尾页 |