My.Computer
My的另一个功能块是Computer对象。My.Computer对象可以让你访问系统底层和应用程序所在硬件平台的信息。示例应用程序的第二个选项卡展示了你在My.Computer对象中能找到的有趣属性。
图三
My.Computer 选项卡
控制这个网格的代码如下:
myAppDS.MyComputer.AddMyComputerRow("Clock", _
My.Computer.Clock.LocalTime)
myAppDS.MyComputer.AddMyComputerRow("GMT Time", _
My.Computer.Clock.GmtTime)
myAppDS.MyComputer.AddMyComputerRow("Tick Count", _
My.Computer.Clock.TickCount)
myAppDS.MyComputer.AddMyComputerRow("GMT Time", _
My.Computer.EventLogs.Item("Application").ReadEntries().Item(1).Message)
myAppDS.MyComputer.AddMyComputerRow("CRTL Key Down", _
My.Computer.Keyboard.CtrlKeyDown.ToString())
myAppDS.MyComputer.AddMyComputerRow("Button Count", _
My.Computer.Mouse.ButtonCount)
myAppDS.MyComputer.AddMyComputerRow("Buttons Swapped", _
My.Computer.Mouse.ButtonsSwapped)
myAppDS.MyComputer.AddMyComputerRow("Mouse Exists", _
My.Computer.Mouse.Exists.ToString())
myAppDS.MyComputer.AddMyComputerRow("Wheel Scroll Lines", _
My.Computer.Mouse.WheelScrollLines.ToString())
myAppDS.MyComputer.AddMyComputerRow("Wheel Exists", _
My.Computer.Mouse.WheelExists)
myAppDS.MyComputer.AddMyComputerRow("Computer Name", _
My.Computer.Name)
myAppDS.MyComputer.AddMyComputerRow("Connection Status", _
My.Computer.Network.ConnectionStatus)
myAppDS.MyComputer.AddMyComputerRow("Connection Status", _
My.Computer.Network.IPAddresses(0).ToString())
myAppDS.MyComputer.AddMyComputerRow("Operating System Platform", _
My.Computer.OperatingSystem.Platform)
myAppDS.MyComputer.AddMyComputerRow("Version", _
My.Computer.OperatingSystem.Version.Major & "." & _
My.Computer.OperatingSystem.Version.Minor & "." & _
My.Computer.OperatingSystem.Version.Revision & "." & _
My.Computer.OperatingSystem.Version.Build)
myAppDS.MyComputer.AddMyComputerRow("Full Name HKEY_CURRENT_USER", _
My.Computer.Registry.CurrentUser.FullName)
myAppDS.MyComputer.AddMyComputerRow("Device Name", _
My.Computer.Screen.DeviceName)
这段代码与控制My.Application选项卡中的网格控件的代码非常相似。用一个类型化的数据集来装载My.Computer对象属性中获得的值,并绑定到一个表格控件。
My.Computer对象的元素不是都能够显示在表格控件里。下表列出的项目包括没有在表格控件里显示的属性或方法。
My.Computer
属性/方法 描述
Clock
允许你访问当前中时区时间和本地时间,以及计数刻度。
EventLogs
允许你访问本地事件日志信息以及创建或删除事件日志。
FileSystem
允许你进行许多IO操作,如复制文件、目录,移动文件、目录,读取或写入文件等。一般情况只需要一行代码。
Keyboard
允许你获取当前键盘上某些案件的状态。比如获取CTRL键、SHIFT键或ATL键是否被按下,或者CAPS LOCK/SCROLL LOCK是否处于打开状态等。
Mouse
允许你获取鼠标的状态以及它所附带的特定的硬件特征,如有几个按键,是否带有滚论等。
Name
告诉你当前正运行的本地计算机的名称。
Network
允许你访问本地计算机的IP地址信息,本地计算机的连接状态,还有Ping一个地址的功能。
Operating System
允许你访问本地计算机平台和版本的信息。
Registry
允许你访问注册表,并提供读取和写入注册表的功能。
Screen
允许你访问系统附带的监视器以及显示属性,如BitsPerPixel和WorkingArea等。
My.Computer在开发中的相关应用
My.Computer提供给你很多访问系统底层的功能,你可以用在很多方面。比如你可以用Network属性和其相关的Ping、PingWithDetails方法轻易地Ping一个网络地址。
Dim pingResult As Microsoft.VisualBasic.Net.PingResult = _
My.Computer.Network.PingWithDetails("www.3leaf.com")
If pingResult.PingSuccesses > 0 Then
Dim pingDetails As String = "Average Ping Time in MS: " & _
ingResult.AveragePingTimeInMilliseconds & vbCrLf & _
"Bytes Received: " & pingResult.BytesReceived.ToString() & vbCrLf & _
"IP Address: " & pingResult.IPAddress.ToString() & vbCrLf &_
"Ping Attempts: " & pingResult.PingAttempts.ToString() & vbCrLf & _
"Ping Successes: " & pingResult.PingSuccesses.ToString()
MessageBox.Show(pingDetails)
Else
MessageBox.Show("Ping of www.3leaf.com was not successful")
End If
这段代码最关键的部分是My.Computer.Network.PingWithDetails()。这行代码返回一个PingResult对象,其中包含了标准Ping动作所返回的数据。如果最少一次Ping操作成功的话,平均响应时间,获得的字节数,总Ping数目和成功数目都会显示在一个消息框中。My.Computer.Network还提供一个简化版的Ping,只返回True或False以示Ping成功与否。像这样Ping一个地址的功能可以让你方便地确定是否能与服务器正式建立通信。通过使用My.Computer.Network.ConnectionStatus,你还可以方便地确定当前网络连接的状态。ConnectionStatus属性根据计算机现在是否有网络连接而返回True或False。
My.Computer另一个很好的应用是在需要访问文件系统的时候。My.Computer.FileSystem提供给你更好的访问文件系统的方法,所需的代码比用VB.NET来实现更少。用My.Computer.FileSystem,你可以只用一行代码完成下列任务。
· 在文件后面附加文本。
· 从文件中读取所有文本。
· 复制文件夹时创建所有完整路径所需的父文件夹。
· 移动文件夹时创建所有完整路径所需的父文件夹。
你还能用Microsoft.VisualBasic.FileIO命名空间中的类型简化文件夹、文件和驱动器的操作。这些类型一般都是My.Computer.FileSystem对象的属性和方法返回的类型。
下面的例子是用My在文件末尾附加文本所需的全部代码。
My.Computer.FileSystem.AppendText(filePath, “Hello from " & _
“My.Computer.FileSystem”)
如果你想读取一个文件的全部文本,只需下列代码即可做到。
My.Computer.FileSystem.ReadAllText(filePath)
复制和移动文件夹变得非常容易。
My.Computer.FileSystem.CopyFolder(sourcePath, targetPath, True, True)
上面这行代码将文件夹从sourcePath复制到targetPath。最后两个布尔型参数指定targetPath是否要覆盖已经存在的文件夹以及指定是否需要创建所需的父文件夹。
刚才提到过FileSystem对象的许多属性和方法都可以返回Drive、Folder或File类型的对象。这些Microsoft.VisualBasic.FileIO名字空间中的对象封装了许多新的属性和方法,可以让一般的编程工作得到简化。比如可以用一行代码可以取得“我得文档”文件夹所在的驱动器。
My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.DriveName
更重要的是你可以获得“我得文档”文件夹所在的驱动器所剩余的磁盘空间。
My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.FreeSpace
用文件对象对特定文件或文件夹的操作同样非常容易。比如你可以用一行代码轻松地重名名文件。
My.Computer.FileSystem.SpecialFolders.MyDocuments.Drive.FreeSpace
My.User
My名字空间的下一个功能块是User对象。My.User对象允许你获取当前登录用户的信息如用户名,域名,以及查询他们所属的组群。
图 3
My.User 选项卡
控制表格控件的代码如下:
myAppDS.MyUser.AddMyUserRow("Display Name", _
My.User.DisplayName)
myAppDS.MyUser.AddMyUserRow("Domain Name", _
My.User.DomainName)
myAppDS.MyUser.AddMyUserRow("User Name", _
My.User.UserName)
myAppDS.MyUser.AddMyUserRow("Windows Role", _
My.User.WindowsRoles(0).ToString())
这段代码访问了当前用户的信息,这非常简单。你要做的所有事情就是访问User对象的属性。User对象是由下列属性或方法组成的。
My.User
属性/方法 描述
DisplayName
允许你访问当前登录用户的显示名称。
DomainName
允许你访问当前登录用户所属的域名,如果他属于某个域的话。
IsInRole
允许你查询用户是否属于一个特定的角色。
UserName
允许你访问当前登录用户的用户名。
WindowsRole
WindowsRole是一个包含当前登录用户帐号所属的全部角色/组群信息的集合。
My.User在开发中的相关应用
My.User能够给你相当多的关于当前登录用户的信息。在很多方面,My所提供的User对象都是学习或使用.NET Framework的绝佳捷径之一。
在以前版本的.NET Framework中,如果你想访问类似My.User所提供的功能,你必须写下面这么多代码。
Imports System.Security.Principal
Imports System.Threading.Thread
…
Dim winPrin As WindowsPrincipal = Thread.CurrentPrincipal
MessageBox.Show(winPrin.Identity.Name)
或者你得写成这样
MessageBox.Show(System.Threading.Thread.CurrentPrincipal.Identity.Name)
但是,在使用了My之后就变得如此直观。
My.User.UserName
这是一个用My简化对.NET Framework操作的一个经典例子。很多开发人员第一次面对Framework时,不会本能地想到要从Principal对象或从当前线程取得进程身份才能获得当前登录的用户的帐号名称。很多开发人员以为这种信息肯定是在更高级的抽象层次上才能得到。现在用My,获取这种信息既简单又快速。
My.WebServices和 My.Forms
接下来你将要学到 My命名空间另外两个主要功能,它们是My.WebServices和My.Forms。在进入这一节之前,我们先做一个简短的概述。
My.WebServices让你可以用和访问数据源一样简单的语法访问在项目中引用的Web服务。
dgOrders.DataSource = _
My.WebServices.Northwind.GetOrders().Tables("Orders")
如果用.NET Framework 1.0/1.1,要想做到上面那行代码的功能,你必须创建一个WebService的实例。用这种My.WebServices提供的功能可以快捷访问所有添加到Web引用的Web服务。
最后一个重点My.Form将带回一种在Visual Basic桌面程序中出现,并暂时消失在VB.NET中的标志性的编程风格。如果你曾经用VB6开发过,你肯定知道下面这种代码,如果你的项目需要显示某个窗体:
Form2.Show
在VB.NET时代,你不能再用这种简单的语法了。在VB.NET中只能用下列代码显示一个窗体。
Dim frm1 As New Form1()
frm1.Show()
使用My.Forms,项目中所有的窗体都变成Forms集合的成员。另外如果你想访问某个窗体默认的实例,你根本不需要使用My.Forms。就是说下面的代码是等价的。
My.Forms.Form2.Show()
Form2.Show()
在接下来的章节里,你将学到更多用此方法显示窗体的功能(译注:可惜我们看不到了)。
如果你想看一些My.WebServices和My.Forms的例子,你可以看看示例程序相关的选项卡。所有这些工能将在本书的后边详细地叙述。(本文档只是此书的样章,所以到此为止了,想看后面请到亚马孙书店购买此书)
结论
My命名空间对于一个开发人员来说主要有四项功能。首先它提供很多了以前版本的.NET Framework没有的功能。第二,它提供了很多快速访问.NET Framework的BCL的快捷方式。第三,在一定程度上,它让你想问题时能将“计算机”类的词当作逻辑实体来操作。第四,它让一些你熟悉的旧语法回归到了Visual Basic中,比如Form1.Show。