VB的API编程注册表启动项.docx
- 文档编号:7657884
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:11
- 大小:20.59KB
VB的API编程注册表启动项.docx
《VB的API编程注册表启动项.docx》由会员分享,可在线阅读,更多相关《VB的API编程注册表启动项.docx(11页珍藏版)》请在冰豆网上搜索。
VB的API编程注册表启动项
VB的API编程注册表启动项
2007年03月14日星期三上午10:
43
介绍关于注册表编程的API函数及其应用实例,使读者朋友何能够将前面学到的注册表知识推广到VB编程中,继续向VB高手迈进(路漫漫……)。
后半部分介绍的平面工具条的生成定会使您的程序更“炫”!
一.注册表的API编程
关于注册表的知识相信您通过前面专题的介绍已经有了较深入的了解。
系统有六个预定义好的关键字,这六个关键字是用户或系统访问注册表的入口点。
我们常用到的只有前四个关键字。
而在编程时我们一般用到只是HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE这两个关键字,因为与应用程序相关的数据存在于这两个关键字下。
许多商品化的软件或专业化的软件在您的机器上首次安装的时候都会通过改写注册表来完成软件的正确安装运行,梦想成为编程高手的你当然需要掌握读写注册表这一技术。
利用好注册表会为您的应用程序增色不少。
虽然VB本身提供了四个关于注册表的函数GetSetting,SaveSetting、GetAllSettings、DeleteSetting(这四个函数的使用比较简单读者可以参考VB的联机帮助),但是这四个函数只能在“HKEY_CURRENT_USER\Software\VBandVBAProgramSettings”下读取、删除、修改键值。
对于一般的应用程序利用它们可以达到您的目的,对于特殊的要求利用它们就显的无能为力了。
下面举一个例子说明它们的局限性。
熟悉DOS操作系统的读者都知道,可以编写一个“Autoexec.bat”的批处理文件来实现某一个应用程序在系统启动的时候自动运行,在Win95中我们可以把应用程序的快捷方式放到系统的启动组中来达到同样的效果。
但是,假如我需要在我的应用程序首次安装以后就能自动达到这种效果,那该如何呢?
其实,注册表中提供了三个这样的键:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
这三个键字的区别是:
Run:
此键字下的应用程序在系统启动的时候会自动运行;
RunOnce:
此键字下的应用程序在系统下一次启动的时候会自动运行,以后不再运行;
RunServices:
功能和“Run”一样,只是应用程序被启动的时候不同而已。
现在您一定知道该如何利用注册表达到您的要求了。
实际上许多安装软件在安装向导完成后要您重新启动才能完成最终的安装。
它就是把安装向导所需做的最后工作的程序写到“RunOnce”下实现的。
但是,若只利用VB本身的那四个函数显然是无法实现此功能的。
笔者在实践中通过调用API函数很好地解决了VB本身访问注册表的局限性,并把它做成了一个类模块。
所以调用起来非常方便。
由于篇幅有限我只能从中抽取一部分来讲,这一部分也是可以独立运行的。
读者想要完整的源代码请与我联系(yue_xiang@)。
下面是应该放到您的模块中的声明部分代码:
OptionExplicit
'注册表的入口常量
PublicConstHKEY_CLASSES_ROOT=&H80000000
PublicConstHKEY_CURRENT_USER=&H80000001
PublicConstHKEY_LOCAL_MACHINE=&H80000002
PublicConstHKEY_USERS=&H80000003
'注册表的访问权限常量
PublicConstKEY_QUERY_VALUE=&H1
PublicConstKEY_SET_VALUE=&H2
PublicConstKEY_CREATE_SUB_KEY=&H4
PublicConstKEY_ENUMERATE_SUB_KEYS=&H8
PublicConstKEY_NOTIFY=&H10
PublicConstKEY_CREATE_LINk=&H20
PublicConstKEY_ALL_ACCESS=&H3F
'打开/建立键值的可选项常量
PublicConstREG_OPTION_NON_VOLATILE=0&
PublicConstREG_OPTION_VOLATILE=&H1
'建立新键或打开已存在的键常量
PublicConstREG_CREATED_NEW_KEY=&H1
PublicConstREG_OPENED_EXISTING_KEY=&H2
'预先定义的访问注册表的权限常量
PublicConstSTANDARD_RIGHTS_ALL=&H1F0000
PublicConstSPECIFIC_RIGHTS_ALL=&HFFFF
'API的返回代码常量
PublicConstERROR_SUCCESS=0&
PublicConstERROR_ACCESS_DENIED=5
PublicConstERROR_NO_MORE_ITEMS=259
'返回数值类型常量
PublicConstREG_NONE=(0)
PublicConstREG_SZ=
(1)
PublicConstREG_EXPAND_SZ=
(2)
PublicConstREG_BINARY=(3)
PublicConstREG_DWORD=(4)
PubliCConStREG_DWORD_LITTLE_ENDIAN=(4)
PublicConstREG_DWORD_BIG_ENDIAN=(5)
PublicConstREG_LINK=(6)
PublicConstREG_MULTI_SZ=(7)
PublicConstREG_RESOURCE_LIST=(8)
PublicConstREG_FULL_RESOURCE_DESCRIPTOR=(9)
PublicConstREG_RESOURCE_REQUIREMENTS_LIST=(10)
'访问注册表的API函数要用到的结构类型
TypeSECURITY_ATTRIBUTES
nLengthAsLong
lpSecurityDescriptorAsLong
bInheritHandleAsBoolean
EndType
TypeFILETIME
dwLowDateTimeAsLong
dwHighDateTimeAsLong
EndType
'要用到的API函数声明
…………
(鉴于篇幅这里只介绍一下各API的作用而不再一一列其声明;相关声明请读者查阅API浏览器)
下面简单地介绍一下这几个API:
RegOpenKeyEx():
打开指定的关键字(32位);
RegSetValueEx():
在打开的注册表关键字的值域中存储数据;
RegCloseKey():
释放指定的关键字的句柄;
RegQueryValueEx():
在注册表中查找与您指定的键值相关的值;
RegCreateKeyEx():
建立并打开指定的关键字,若已存在则打开它;
RegEnumKeyEx():
枚举指定的打开注册表关键字的子关键字(32位);
RegEnumKey():
同上功能一样,区别在于它是16位的;
RegEnumValue():
每次调用枚举指定的打开注册表关键字的值复制一个带索引的值的名称和数据块;
RegDeletekey():
删除一个关键字以及它的子关键字;
RegDeleteValue():
在指定的注册表关键字中删除一个带名字的值。
通过调用这些API我们可以轻松实现注册表的任意关键字的读取、查询、建立、删除。
笔者在这里只打算介绍一下如何建立和删除一个特定的关键字。
其它操作读者可以自己去发挥。
例如:
要在HKEY_LOCAL_MACHINE\Network下建一个“MyApi”子键并在它的下面建立一个称为“yx”的值域,把它的值设为“yue1975”。
我们应该按如下的方法调用API:
DimphkResultAsLong'保存建立的关键字句柄
DimIresultAsLong
DimSAAsSECURITY_ATTRIBUTES
Dim1CreateAsLong
'建立一个指定的关键字
caIIRegCreateKeyEx(HKEY_LOCAL_MACHINE,"Network\MyApi",0,"",REG_OPTION_NON_VOLATILE,_
KEY_ALL_ACCESS,SA,phkResult,1Create)
1Result=RegSetValueEx(phkResult,"yx",0,REG_SZ,"yue1975",Clng(Len("yue1975")+1))
'关闭关键字
RegCloseKeyphkResult
现在用注册表编辑器去查看一下注册表,一定生成了您所需的键值。
再例如:
现在我想把刚才建立的键值删掉,那您只需如下调用即可:
dimsuccessaslong
success=RegDeleteKey(HKEY_LOCAL_MACHINE,"Network\MyApi")
二.用API生成平面工具条
相信许多VB爱好者都曾千方百计地想使自己的工具条像Word97中的工具条一样COOL起来。
往往我们不得不去借用别人做好的ActiveBar控件,这样先不说自己的程序变得大了,而且说实话那个控件并不好用。
笔者在用VC5编程的时候用基类函数SendMessageLong()、FindWindowEx()轻松实现了这种COOL的效果。
受此启发在VB5中调用这两个API也实现了同样的效果。
下面是源代码:
把以下程序加到您的模块中:
'----------------------
'常量声明
'----------------------
PublicConstWM_USER=&H400
'用户自定义消息的起点
PublicConstTB_SETSTYLE=WM_USER+56
'设置工具条风格消息
PublicConstTB_GETSTYLE=WM_USER+57
'取得工具条风格消息
PublicConstTBSTYLE_FLAT=&H800
'使工具条COOL起来
PublicConstTBSTYLE_TOOLTTPS=&H100
PublicConstTBSTYLE_WRAPABLE=&H200
PublicConstTBSTYLE_ALTDRAG=&H400
PublicConstTBSTYLE_LIST=&H1000
PublicConstTBSTYLE_CUSTOMERASE=&H2000
'-----------------
'API函数声明
'-----------------
PublicDeclareFunctionSendMessageLongLib"user32"Alias"SendMessageA"(ByValhwndAsLong,
ByValwMsgAsLong,ByValwParamAsLong,ByVal1ParamAsLong)AsLong
PublicDeclareFunctionFindWindowExLib"user32"Alias"FindWindowExA"(ByValhWnd1AsLong,
ByValhWnd2AsLong,ByVal1psz1AsString,ByVal1psz2AsString)AsLong
'-----------------------
'通用生成平面工具条过程
'入口:
工具条的名字
'-----------------------
PublicSubFlatBar(ByValtbAsToolbar)
DimstyleAsLong
DimhToolbarAsLong
DimrAsLong
'获的工具条窗口句柄
hToolbar=FindWindowEx(tb.hwnd,0&,"ToolBarWindow32",vbNullString)
'获的当前工具条的风格
style=SendMessageLong(hToolbar,TB_GETSTYLE,0&,0&)
IfstyleAndTBSTYLE_FLATThen
style=styleXorTBSTYLE_FLAT
Else
style=styleorTBSTYLE_FLAT
EndIf
'设置工具条的平面风格
r=SendMessageLong(hToolbar,TB_SETSTYLE,0,style)
tb.Refresh
EndSub
过程FlatBar()的调用方法:
1.在你的窗体上添加Toolbar控件(命名为:
myTB)和ImageList控件。
按通常的方法一样在ImageList中播入几个图标并和Toolbar绑定建立一个平常的工具条。
2.在窗体的Load()事件中调用FlatBar()
CallFlatBar(myTB)
3.运行,您的工具条一定COOL起来了。
程序如下,窗体上放一个ListBox,和一个按钮
ConstHKEY_LOCAL_MACHINE=&H80000002
PrivateDeclareFunctionRegCloseKeyLib"advapi32.dll"(ByValhKeyAsLong)AsLong
PrivateDeclareFunctionRegOpenKeyLib"advapi32.dll"Alias"RegOpenKeyA"(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PrivateDeclareFunctionRegEnumValueLib"advapi32.dll"Alias"RegEnumValueA"(ByValhKeyAsLong,ByValdwIndexAsLong,ByVallpValueNameAsString,lpcbValueNameAsLong,ByVallpReservedAsLong,lpTypeAsLong,lpDataAsByte,lpcbDataAsLong)AsLong
PrivateSubCommand1_Click()
DimhKeyAsLong,CntAsLong,sSaveAsString
'打开指定的注册表项,这个位置保存的就是启动项
RegOpenKeyHKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",hKey
Cnt=0
List1.Clear
Do
'创建一个缓冲区,用以保存每个开机启动项
sSave=String$(255,0)
'枚举第Cnt个启动项,如果返回值不为0,说明已经枚举完成
IfRegEnumValue(hKey,Cnt,sSave,255,0,ByVal0&,ByVal0&,ByVal0&)<>0ThenExitDo
'添加到list1,StripTerminator函数的作用是去除多余的字符
List1.AddItemStripTerminator(sSave)
Cnt=Cnt+1
Loop
'关闭注册表项
RegCloseKeyhKey
EndSub
'去除缓冲区中多余的Chr(0)
PrivateFunctionStripTerminator(sInputAsString)AsString
DimZeroPosAsInteger
'找到第一个Chr(0)
ZeroPos=InStr(1,sInput,vbNullChar)
IfZeroPos>0Then'如果存在,则去掉后面所有的内容
StripTerminator=Left$(sInput,ZeroPos-1)
Else'如果不存在,不做任何操作
StripTerminator=sInput
EndIf
EndFunction
修改如下:
ConstHKEY_LOCAL_MACHINE=&H80000002
ConstREG_SZ=1
ConstREG_BINARY=3
PrivateDeclareFunctionRegCloseKeyLib"advapi32.dll"(ByValhKeyAsLong)AsLong
PrivateDeclareFunctionRegOpenKeyLib"advapi32.dll"Alias"RegOpenKeyA"(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong
PrivateDeclareFunctionRegEnumValueLib"advapi32.dll"Alias"RegEnumValueA"(ByValhKeyAsLong,ByValdwIndexAsLong,ByVallpValueNameAsString,lpcbValueNameAsLong,ByVallpReservedAsLong,lpTypeAsLong,lpDataAsByte,lpcbDataAsLong)AsLong
PrivateDeclareFunctionRegQueryValueExLib"advapi32.dll"Alias"RegQueryValueExA"(ByValhKeyAsLong,ByVallpValueNameAsString,ByVallpReservedAsLong,lpTypeAsLong,lpDataAsAny,lpcbDataAsLong)AsLong
PrivateSubCommand1_Click()
DimhKeyAsLong,CntAsLong,sSaveAsString
'打开指定的注册表项,这个位置保存的就是启动项
RegOpenKeyHKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",hKey
Cnt=0
List1.Clear
Do
'创建一个缓冲区,用以保存每个开机启动项
sSave=String$(255,0)
'枚举第Cnt个启动项,如果返回值不为0,说明已经枚举完成
IfRegEnumValue(hKey,Cnt,sSave,255,0,ByVal0&,ByVal0&,ByVal0&)<>0ThenExitDo
'添加到list1,StripTerminator函数的作用是去除多余的字符
List1.AddItemRegQueryStringValue(hKey,StripTerminator(sSave))
Cnt=Cnt+1
Loop
'关闭注册表项
RegCloseKeyhKey
EndSub
'去除缓冲区中多余的Chr(0)
PrivateFunctionStripTerminator(sInputAsString)AsString
DimZeroPosAsInteger
'找到第一个Chr(0)
ZeroPos=InStr(1,sInput,vbNullChar)
IfZeroPos>0Then'如果存在,则去掉后面所有的内容
StripTerminator=Left$(sInput,ZeroPos-1)
Else'如果不存在,不做任何操作
StripTerminator=sInput
EndIf
EndFunction
'读取注册表某项的值
FunctionRegQueryStringValue(ByValhKeyAsLong,ByValstrValueNameAsString)AsString
DimlResultAsLong,lValueTypeAsLong,strBufAsString,lDataBufSizeAsLong
'获取值的类型
lResult=RegQueryValueEx(hKey,strValueName,0,lValueType,ByVal0,lDataBufSize)
IflResult=0Then
IflValueType=REG_SZThen
'建立缓冲区
strBuf=String$(lDataBufSize,Chr$(0))
'获取值
lResult=RegQueryValueEx(hKey,strValueName,0,0,ByValstrBuf,lDataBufSize)
IflResult=0Then
'去掉多余的Chr(0)
RegQueryStringValue=Left$(strBuf,InStr(1,strBuf,Chr$(0))-1)
EndIf
ElseIflValueType=REG_BINARYThen
DimstrDataAsInteger
'获取值
lResult=RegQueryValueEx(hKey,strValueName,0,0,strData,lDataBufSize)
IflResult=0Then
RegQueryStringValue=strData
EndIf
EndIf
EndIf
EndFunction
''关闭打开的键
PrivateDeclareFunctionRegCloseKeyLib"advapi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB API 编程 注册表 启动
![提示](https://static.bdocx.com/images/bang_tan.gif)