VB的API编程精粹(一)

2016-02-19 21:47 56 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享VB的API编程精粹(一),希望可以对大家能有小小的帮助。

【 tulaoshi.com - 编程语言 】

一. 注册表的API编程

关于注册表的知识相信您通过前面专题的介绍已经有了较深入的了解。系统有六个预定义好的关键字,这六个关键字是用户或系统访问注册表的入口点。我们常用到的只有前四个关键字。而在编程时我们一般用到只是HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE这两个关键字,因为与应用程序相关的数据存在于这两个关键字下。

许多商品化的软件或专业化的软件在您的机器上首次安装的时候都会通过改写注册表来完成软件的正确安装运行,梦想成为编程高手的你当然需要掌握读写注册表这一技术。利用好注册表会为您的应用程序增色不少。

虽然VB本身提供了四个关于注册表的函数GetSetting,SaveSetting、GetAllSettings、DeleteSetting(这四个函数的使用比较简单读者可以参考VB的联机帮助),但是这四个函数只能在“HKEY_CURRENT_USERSoftwareVB and VBA ProgramSettings”下读取、删除、修改键值。对于一般的应用程序利用它们可以达到您的目的,对于特殊的要求利用它们就显的无能为力了。下面举一个例子说明它们的局限性。

熟悉DOS操作系统的读者都知道,可以编写一个“Autoexec.bat”的批处理文件来实现某一个应用程序在系统启动的时候自动运行,在Win95中我们可以把应用程序的快捷方式放到系统的启动组中来达到同样的效果。但是,假如我需要在我的应用程序首次安装以后就能自动达到这种效果,那该如何呢?其实,注册表中提供了三个这样的键:

HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices

这三个键字的区别是:

Run:此键字下的应用程序在系统启动的时候会自动运行;

RunOnce:此键字下的应用程序在系统下一次启动的时候会自动运行,以后不再运行;

RunServices:功能和“Run”一样,只是应用程序被启动的时候不同而已。

现在您一定知道该如何利用注册表达到您的要求了。实际上许多安装软件在安装向导完成后要您重新启动才能完成最终的安装。它就是把安装向导所需做的最后工作的程序写到“RunOnce”下实现的。但是,若只利用VB本身的那四个函数显然是无法实现此功能的。笔者在实践中通过调用API函数很好地解决了VB本身访问注册表的局限性,并把它做成了一个类模块。所以调用起来非常方便。由于篇幅有限我只能从中抽取一部分来讲,这一部分也是可以独立运行的。读者想要完整的源代码请与我联系(yue_xiang@263.net)。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

下面是应该放到您的模块中的声明部分代码:
Option Explicit
'注册表的入口常量
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
'注册表的访问权限常量
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINk = &H20
Public Const KEY_ALL_ACCESS = &H3F
'打开/建立键值的可选项常量
Public Const REG_OPTION_NON_VOLATILE = 0&
Public Const REG_OPTION_VOLATILE = &H1
'建立新键或打开已存在的键常量
Public Const REG_CREATED_NEW_KEY = &H1
Public Const REG_OPENED_EXISTING_KEY = &H2
'预先定义的访问注册表的权限常量
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const SPECIFIC_RIGHTS_ALL = &HFFFF
'API的返回代码常量
Public Const ERROR_SUCCESS = 0&
Public Const ERROR_ACCESS_DENIED = 5
Public Const ERROR_NO_MORE_ITEMS = 259
'返回数值类型常量
Public Const REG_NONE = (0)
Public Const REG_SZ = (1)
Public Const REG_EXPAND_SZ = (2)
Public Const REG_BINARY = (3)
Public Const REG_DWORD = (4)
PubliC ConSt REG_DWORD_LITTLE_ENDIAN = (4)
Public Const REG_DWORD_BIG_ENDIAN = (5)
Public Const REG_LINK = (6)
Public Const REG_MULTI_SZ = (7)
Public Const REG_RESOURCE_LIST = (8)
Public Const REG_FULL_RESOURCE_DESCRIPTOR = (9)
Public Const REG_RESOURCE_REQUIREMENTS_LIST = (10)
'访问注册表的API函数要用到的结构类型
Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'要用到的API函数声明
…………
(鉴于篇幅这里只介绍一下各API的作用而不再一一列其声明;相关声明请读者查阅API浏览器)

下面简单地介绍一下这几个API:

RegOpenKeyEx():打开指定的关键字(32位);
RegSetValueEx():在打开的注册表关键字的值域中存储数据;
RegCloseKey():释放指定的关键字的句柄;
RegQueryValueEx():在注册表中查找与您指定的键值相关的值;
RegCreateKeyEx():建立并打开指定的关键字,若已存在则打开它;
RegEnumKeyEx():枚举指定的打开注册表关键字的子关键字(32位);
RegEnumKey():同上功能一样,区别在于它是16位的;
RegEnumValue():每次调用枚举指定的打开注册表关键字的值复制一个带索引的值的名称和数据块;
RegDeletekey():删除一个关键字以及它的子关键字;
RegDeleteValue():在指定的注册表关键字中删除一个带名字的值。

通过调用这些API我们可以轻松实现注册表的任意关键字的读取、查询、建立、删除。笔者在这里只打算介绍一下如何建立和删除一个特定的关键字。其它操作读者可以自己去发挥。

例如:要在HKEY_LOCAL_MACHINENetwork下建一个“MyApi”子键并在它的下面建立一个称为“yx”的值域,把它的值设为“yue1975”。我们应该按如下的方法调用API:
Dim phkResult As Long '保存建立的关键字句柄
Dim Iresult As Long
Dim SA As SECURITY_ATTRIBUTES
Dim 1Create As Long
'建立一个指定的关键字
caII RegCreateKeyEx(HKEY_LOCAL_MACHINE,"NetworkMyApi",0,"",REG_OPTION_NON_VOLATILE, _
KEY_ALL_ACCESS,SA,phkResult,1Create)
1Result=RegSetValueEx(phkResult,"yx",0,REG_SZ,"yue1975",Clng(Len("yue1975")+1))
'关闭关键字
RegCloseKey phkResult
现在用注册表编辑器去查看一下注册表,一定生成了您所需的键值。
再例如:现在我想把刚才建立的键值删掉,那您只需如下调用即可:
dim success as long
success=RegDeleteKey(HKEY_LOCAL_MACHINE,"NetworkMyApi")
二. 用API生成平面工具条
相信许多VB爱好者都曾千方百计地想使自己的工具条像Word97中的工具条一样COOL起来。往往我们不得不去借用别人做好的ActiveBar控件,这样先不说自己的程序变得大了,而且说实话那个控件并不好用。笔者在用VC5编程的时候用基类函数SendMessageLong()、FindWindowEx()轻松实现了这种COOL的效果。受此启发在VB5中调用这两个API也实现了同样的效果。下面是源代码:
把以下程序加到您的模块中:
'----------------------
'常量声明
'----------------------
Public Const WM_USER = &H400
'用户自定义消息的起点
Public Const TB_SETSTYLE = WM_USER + 56
'设置工具条风格消息
Public Const TB_GETSTYLE = WM_USER + 57
'取得工具条风格消息
Public Const TBSTYLE_FLAT = &H800
'使工具条COOL起来
Public Const TBSTYLE_TOOLTTPS = &H100
Public Const TBSTYLE_WRAPABLE = &H200
Public Const TBSTYLE_ALTDRAG = &H400
Public Const TBSTYLE_LIST = &H1000
Public Const TBSTYLE_CUSTOMERASE = &H2000
'-----------------
'API函数声明
'-----------------
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,
ByVal wMsg As Long,ByVal wParam As Long,ByVal 1Param As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long,
ByVal hWnd2 As Long,ByVal 1psz1 As String,ByVal 1psz2 As String) As Long
'-----------------------
'通用生成平面工具条过程
'入口:工具条的名字
'-----------------------
Public Sub FlatBar(ByVal tb As Toolbar)
Dim style As Long
Dim hToolbar As Long
Dim r As Long
'获的工具条窗口句柄
hToolbar = FindWindowEx(tb.hwnd,0&,"ToolBarWindow32",vbNullString)
'获的当前工具条的风格
style = SendMessageLong(hToolbar,TB_GETSTYLE,0&, 0&)
If style And TBSTYLE_FLAT Then
style = style Xor TBSTYLE_FLAT
Else
style = style or TBSTYLE_FLAT
End If
'设置工具条的平面风格
r=SendMessageLong(hToolbar,TB_SETSTYLE,0, style)
tb.Refresh
End Sub

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

过程FlatBar()的调用方法:

1 . 在你的窗体上添加Toolbar控件(命名为:myTB)和ImageList控件。按通常的方法一样在ImageList中播入几个图标并和Toolbar绑定建立一个平常的工具条。

2 . 在窗体的Load()事件中调用FlatBar()

Call FlatBar(myTB)

3. 运行,您的工具条一定COOL起来了。

来源:https://www.tulaoshi.com/n/20160219/1627172.html

延伸阅读
Excel是一个优秀的电子表格软件,如果你编的程序需要以报表的形式显示最终结果,它会是个不错的选择。你可以通过VB控制Excel显示数据表格。如果你不愿意深入了解Excel这些琐碎的细节,也不是没有权宜之计:你可以打开Excel中的工具→宏→录制新宏,然后进行手工操作,结束后把所录的宏代码贴进你的VB程序就行。这样得到的程序一般都能正常运行,...
问:我在学习VB过程中遇到一个问题,如源代码: SndPlaySound(″c:MyWorkeep.wav″) 在制成安装盘后,安装到其它机器中不同目录下就不能执行,必须安装到C:MyWork下才能执行。怎样在源代码中识别,或有更好的办法。 答:这是初学者经常忽略的一个小问题。在打开文件、调用程序时喜欢使用绝对文件路径。其实,只要使用相对路径,就...
标签: Delphi
  Delphi作为一种面向对象的可视化开发工具,以其开发程序的高速度和编译代码的高效率越来越受到广大编程人员的喜爱。尽管Delphi已经提供了非常强大的开发组件(VCL),但灵活使用API函数一定可以使你的程序增色不少。 状态键的检查 当今不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一个状态条...
标签: vb
对于每个需要引用的API函数,我们需要先在程序中说明,如果只在某一窗体内声明并使用它,则把它声明为Private,而如果在模块中声明,且需要在整个工程内使用它,则需要把它声明为Public。 Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam...
Visual Basic(以下简称VB)是Windows下的一个面向对象的可视 化开发环境,功能非常强大。下面笔者就自己在实际软件开发过程中 获得的一些经验和大家作以交流。 提示钮的实现 如果自己留心一点儿,一定注意到了Microsoft公司的一系列产品 (如Word、Excel甚至B 本身),都为其应用程序的命令按钮提供了信息 。如用户不清楚软件中所列图...

经验教程

863

收藏

54
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部