使用 .NET 架構類替代 API 呼叫 (二)

來源:互聯網
上載者:User

使用 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) 來處理Unmanaged 程式碼,然後直接調用 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 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 雜誌的技術編輯和 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

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。