您的位置:逆风者 VB 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:20 来源:未知

本文章共1715字,分2页,当前第1页,快速翻页:
 

摘自‘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 - 下一页>>
相关文章

用Winsock制作一套聊天室和对话系统
无框窗体移动最简法(程序)
VB创建位图菜单
VB 从零开始编外挂(七)
用VB打造自己的SQL连接器
在程序中打开 Internet 拨号连接窗口
用VB实现浮动按钮
用VB编写一个光驱保镖
VB6中使用错误处理对程序速度的影响
用VB编写异步多线程下载程序
用VB设计聚焦框程序
用VB编写“红绿灯”程序
用VB设计更换屏幕保护的程序
用VB写的一个组件,实现添加系统用户,并添
用Visual Basic自编小游戏
几行VB代码拿下注册表
用VB设计一个定时闹钟程序
如何开发一个属于自己的编程语言开发工具
用VB设计MSN信息群发软件
编写快速高效的VB程序

相关评论


本文章所属分类:首页 VB

  热门关键字: