摘自‘VB心得笔记’
一般会使用WINDOWAPI的情况,实在是因为VB本身不提供某些功能,但是,程式所需又不得不然,例如:读取Registry内的资料,VB只提供SaveSetting、Getsetting等系列的指令,但是它只能读取特定地区的值,要读、删、更动其他区域的值时,就无法使用。再如:仔细看一看ComboBox的Events,其中没有MouseMove,但这是我们经常用上的一个Event,那该如何呢?是的,那只有透过WinodowAPI。而VB呼叫WindowAPI一般不都使用API检视员,直接将相对应的APICOPY到我们的程式中就好,那还用什麽技巧吗?其实不然,因为VB资料格式的问题,又加上VB本身没有指标,在许多地方需要一些小技巧才能解决,而且我们经常因应不同的需求,将API检视员的宣告COPY过来後再做一些修改,最重要的,如果有一个.DLL档,它不在API检视员中定义,那时,就只有自己想办法啦。 逆风编程技术
一、整数参数
WindowsAPI32位元VB =========================================================== Int,INTByValLong UNIT,DWORDByValLong BOOLByValLongture时为1 WPARAM,LPARAM,LRESULTByValLong Handle(如HKEY)ByValLong WORD,ATOM,SHORTByValInteger BYTE,CHARByValByte
Eg. ----------------------------------------------------------------------------- WindowsAPI宣告
SHORTGetKeyState(intnVirtKey)
对应的VB宣告
DeclareFunctionGetKeyStateLib"user32"(ByValnVirtKeyAsLong)AsInteger -----------------------------------------------------------------------------
这个API可用来检视某些KEY(如Insert键、NumLock、CapsLock等)是on/off。程式如下:这个例子应该可十分楚的看到各个整数间的宣告对应。
----------------------------------------------------------------------------- DimInsertModeasInteger InsertMode=GetKeyState(vbKeyInsert)AndVBShiftMask IfInsertMode=1then Debug.print"表示InsertMode" Else Debug.print"表示OverWriteMode" EndIf ----------------------------------------------------------------------------- 二、指向整数的指标
WindowsAPI32位元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(ByRefparam1astype) 与 Func(param1astype) 是相同的,使用传址呼叫的方式,不外乎想将参数传给API後将结果传回来。然而LONG型态的传址呼叫在VB中又占了相当大的份量,因为32位元的指标都是LONG的型态,而字串、自定型态的Structure在WindowsAPI中是以指标来传递的,而指标的传递事实上也是Long值的传递,只不过传过去的LONG值,於WINAPI中会将之当成Address,而再配合指标运作而得指标所指的内容,这个观念在後面会很重要。
例如: ----------------------------------------------------------------------------- LONGRegOpenKeyEx( HKEYhKey,//handleofopenkey LPCTSTRlpszSubKey,//addressofnameofsubkeytoopen DWORDdwReserved,//reserved REGSAMsamDesired,//securityACCESSmask PHKEYphkResult//addressofhandleofopenkey ); 相对应的VB宣告 DeclareFunctionRegOpenKeyExLib"advapi32.dll"Alias"RegOpenKeyExA"_ (ByValhKeyAsLong,_ ByVallpSubKeyAsString,_ ByValulOptionsAsLong,_ ByValsamDesiredAsLong,_ phkResultAsLong)AsLong’//最後一个参数是ByRef之宣告 -----------------------------------------------------------------------------
我们经常会想要用程式来读取Registry中的资料,例如:我们想得知Win95的ProductID该如何做呢?这里有几个观念要先清楚:首先:ProductId在何处呢?在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVerson下的ProductId。
本文章更多内容:1 - 2 - 下一页>> |