使用 .NET 框架类替代 API 调用 (二)
发表于:2007-06-30来源:作者:点击数:
标签:
使用 System.Environment 类 System.Environment 类提供了若干不同的信息,如果没有这些信息,就需要进行多次 Windows API 调用。使用 System.Environment 可以检索: 有关可用驱动器的信息(GetLogicalDrives 方法) Windows 启动后的毫秒数(TickCount 属
使用 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 A
clearcase/" target="_blank" >ccess、Visual Basic 以及 Office 和 BackOffice 套件编写的工具和应用程序。Ken 还与其他人一起编写了许多书籍,包括:与 Paul Litwin 和 Mike Gilbert 合著的《Access 97 Developer@#s Handbook》;与 Paul Litwin 和 Mike Gilbert 合著的《Access 2000 Developer@#s Handbooks》;与 Paul Litwin 和 Mike Gunderloy 合著的《Access 2002 Developer@#s Handbooks》;与 Mike Gilbert 合著的《Visual Basic Language Developer@#s Handbook》;以及与 Mike Gilbert (Sybex) 合著的《
VBA Developer@#s Handbook》。他还参与了 AppDev 培训资料的编写工作,并从事这方面的教学工作。Ken 经常在技术会议上发言,自 1994 年以来,每一届的 Microsoft Tech*Ed 会议上他都会发表演讲。Ken 是 Access/VB/
SQL Advisor
杂志的技术编辑和 Inform
ant 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
原文转自:http://www.ltesting.net