使用 system.environment 类
system.environment 类提供了若干不同的信息,如果没有这些信息,就需要进行多次 windows api 调用。使用 system.environment 可以检索:
- 有关可用驱动器的信息(getlogicaldrives 方法)
- windows 启动后的毫秒数(tickcount 属性)
- 一般环境设置(由 currentdirectory、machinename、osversion、systemdirectory、userdomainname、userinteractive、username 和 workingset 属性提供)
- 特定文件夹列表(使用 getfolderpath 方法提供)
如果您使用过 windows api,您将知道选择方法和属性将代替很多 api 调用,包括 gettickcount、getlogicaldrives、getsystemdirectory、getcomputername、getusername 以及 getversionex 等等。
在图 4(单击主窗体上的 environment info [环境信息])所示的示例窗体中,在靠近顶部的列表框中显示了执行 getlogicaldrives 方法的结果,其中包括所有特定文件夹的列表(使用 getfolderpath 方法检索)。在窗体下部的列表框中,显示了该类的许多属性的运行结果。

图 4:显示 system.environment 类所使用的属性和方法的窗体
另外,要测试 tickcount 属性,请单击 test clickcount(测试 clickcount),以显示使用示例窗体中定义的 stopwatch 类的结果,并请使用以下代码:
public class stopwatch private mintstart as integer public sub start() mintstart = environment.tickcount end sub public function elapsed() as integer return environment.tickcount - mintstart end function public overrides function tostring() as string return string.format( _ "started: {0}, elapsed: {1}", _ mintstart, me.elapsed) end functionend class
此处显示的 fillproperties 方法使用先前显示过的 additem 方法的一个副本,将属性名称和结果填入 listview 控件,如下所示:
private sub fillproperties() additem("currentdirectory", _ environment.currentdirectory) additem("machinename", environment.machinename) additem("osversion.platform", _ environment.osversion.platform.tostring) additem("osversion.version", _ environment.osversion.version.tostring) additem("systemdirectory", _ environment.systemdirectory) additem("userdomainname", environment.userdomainname) additem("userinteractive", _ environment.userinteractive) additem("username", environment.username) additem("workingset", environment.workingset)end sub
除了使用 environment 类之外,fillfolderlist 实际上还包含一些有趣的代码。这个过程的目的是循环使用 environment 类提供的 specialfolder 枚举中的所有成员。(此枚举包含物理文件夹 [如收藏夹和历史记录等] 的逻辑名称。)该过程将每个枚举值的名称添加到窗体上的 listview 控件中,同时将传递枚举值的结果添加到 environment 对象的 getfolderpath 方法中。下面所示的过程能够完成所有工作:
private sub fillfolderlist() dim strname as string dim astrnames() as string dim aintvalues as array dim i as integer 使用 specialfolder 枚举中的名称 填写 listview 控件的第一列。 astrnames = system.enum.getnames( _ gettype(environment.specialfolder)) aintvalues = system.enum.getvalues( _ gettype(environment.specialfolder)) for i = 0 to astrnames.length - 1 with lvwfolders.items.add(astrnames(i)) .subitems.add( _ environment.getfolderpath(aintvalues(i))) end with nextend sub
此示例没有对发送到 environment 对象的参数进行硬编码,而是使用了 enum 类的共享 getnames 和 getvalues 方法。通过将调用 visual basic .net gettype 函数的结果传递给 getnames(传递指定的枚举类型),您可以检索使用所有枚举成员的名称填写的数组。重复包含 getvalues 方法的过程将返回一个 array 对象,其中包含所有枚举值。
astrnames = system.enum.getnames( _ gettype(environment.specialfolder))aintvalues = system.enum.getvalues( _ gettype(environment.specialfolder))
给出这两个数组后,程序的其余部分将在这两个数组中循环运行,将 astrnames 中的值添加到 listview,然后调用 environment 类的 getfolderpath 方法来检索相应的路径:
for i = 0 to astrnames.length - 1 with lvwfolders.items.add(astrnames(i)) .subitems.add( _ environment.getfolderpath(aintvalues(i))) end withnext
图 4 中的上部 listview 控件包含这些代码的输出内容。
提示:enum 为您提供了一些 visual basic 6.0 中没有的技巧,例如示例中所示的 getnames 和 getvalues 方法。有关利用 enum 类的功能的详细信息,请参阅 .net 框架文档。
使用 windows.forms.systeminformation 类
在提供精心设计的用户界面时,您常常需要确定当前的 windows 设置,例如图标的高度和宽度,或者滚动条的宽度。在 visual basic 6.0 中,您可以使用 getsystemmetrics 和 systemparametersinfo windows api 函数来确定许多此类设置。在 .net 框架中,您可以使用 windows.forms 名称空间提供的 systeminformation 类。
尽管图 5 中 frmsysteminformation 使用的代码不是很有趣,但它确实显示了该类提供的所有属性。(单击主窗体上的 systeminformation info [系统信息] 可以测试此示例窗体。)示例窗体对 systeminformation 类的所有属性进行操作,将每个属性的名称和当前值显示在窗体的 listview 控件中。

图 5:显示 windows.forms.systeminformation 类的所有属性的示例窗体
示例窗体使用了前面介绍过的 additem 方法,在 systeminformation 类所有 60 多个属性中简单地循环运行并显示输出内容:
additem("arrangedirection", _ systeminformation.arrangedirection)additem("startingposition", _ systeminformation.arrangestartingposition)additem("bootmode", systeminformation.bootmode) 等等...
总结
- 虽然您可以使用 visual basic .net 中的平台调用服务 (p/invoke) 来处理非托管代码,然后直接调用 windows api,但在创建 visual basic .net 应用程序时,您还是应该寻找其他替代方法。不过,您不用担心 p/invoke 的细节问题,因为 declare 语句会为您处理这些细节。
- .net 框架并不封装所有的 windows api 功能,但是您在 visual basic 6.0 中可能要使用 api 调用才能实现的操作在 .net 框架中也可以实现。
- registry 和 registrykey 类简化了对 windows 注册表的操作,可以帮助开发人员避免大量的 api 调用。
- filedialog、colordialog、fontdialog 和 printerdialog 类使您可以很方便地使用 windows 中的常用对话框。您不需要直接调用 windows api,也不需要使用可怕的 commondialog activex 控件。
- 您可以使用 fileversioninfo 类检索内置在可执行文件、驱动程序文件和 dll 文件中的所有文件版本信息。此类可以替代 visual basic 6.0 中所需的某些复杂的 windows api 代码。
- environment 和 systeminformation 类使您可以方便地检索系统设置,如果没有这些类,则需要调用许多不同的 api 函数。
关于作者
ken getz 是 mcw technologies 的资深顾问,他的工作涉及编程、著书和培训。他精通用 microsoft access、visual basic 以及 office 和 backoffice 套件编写的工具和应用程序。ken 还与其他人一起编写了许多书籍,包括:与 paul litwin 和 mike gilbert 合著的《access 97 developers handbook》;与 paul litwin 和 mike gilbert 合著的《access 2000 developers handbooks》;与 paul litwin 和 mike gunderloy 合著的《access 2002 developers handbooks》;与 mike gilbert 合著的《visual basic language developers handbook》;以及与 mike gilbert (sybex) 合著的《vba developers handbook》。他还参与了 appdev 培训资料的编写工作,并从事这方面的教学工作。ken 经常在技术会议上发言,自 1994 年以来,每一届的 microsoft tech*ed 会议上他都会发表演讲。ken 是 access/vb/sql advisor 杂志的技术编辑和 informant communication group 属下的《microsoft office solutions》杂志的电子文档撰稿人。
关于 informant communications group
informant communications group, inc. (www.informant.com) 是一家专注于信息技术行业的多媒体公司。icg 成立于 1990 年,致力于与软件开发有关的出版物、会议、目录发布和 web 站点等领域。icg 在美国和英国均设有办事处,目前已成为享有盛誉的媒体和营销内容集成商,并以高质量的技术信息满足 it 人员不断增长的需求。
© 2002 informant communications group 和 microsoft corporation 版权所有。
技术编辑:kng consulting
