You are on page 1of 82

19

My 物件

19.1 概觀

19.2 My.Application

19.3 組件資訊與訊息記錄

19.4 My.Computer 物件

19.5 存取電腦相關資訊

19.6 管理登錄檔

19.7 管理剪貼簿

19.8 與周邊裝置互動
19.9 存取網路

19.10 檔案目錄的存取

19.11 My.Forms
19.12 My.User

19.13 My 物件與專案類型相依性

Visual Basic 2005 的主要的新功能之一,便是可以透過 My 物件,快速建立


各種與電腦環境以及.NET 平台互動的程式功能,讓過去某些複雜的應用程
式功能的建構過程,變得更為簡單。

My 功能的威力非常強大、而且容易使用,由於其內容牽涉了網路與檔案系
統 I/O,這一章的內容,我們將就 My 功能進行詳細的說明與討論,除了
My 物件的理論,進一步的,我們會同時看到相關的應用。

19.1 概觀
My 功能以物件的形式提供應用程式作存取,以下為其架構圖:

19-2
第 19 章 My 物件

上圖顯示了整個 My 物件底下的功能物件,My 物件的功能是以類似 Shared


成員的性質公開,因此應用程式可以直接呼叫其功能,建立所需的服務,例
如底下的程式碼:

My.Application.Culture.DisplayName.ToString

其中引用了 My 物件 Application 的文化特性屬性,輸出目前電腦所使用的


語系顯示名稱,如你所見,直接引用相關的屬性與方法成員就可以建立所需
的功能,這個規則適用於所有的 My 物件。

如果仔細的檢核 My 物件,你會發現 My 物件本身並非全新的東西,它只是


將命名空間當中的類別庫,封裝得更為完善,讓 Visual Basic 應用程式開發
人員不需要去了解階層架構以及類別物件的建立,就可以輕易的架構應用程
式的相關功能,與 Visual Basic 6 時代的函數非常類似,只是它的頂層冠上
了物件分類。

19-3
19.2 My.Application
My.Application 用來取得目前應用程式或是 DLL 元件等相關資訊,這些功
能以屬性或方法成員公開,直接引用屬性可以讓我們很方便的取得各種不同
型式的應用程式資訊,它們回傳了特定命名空間當中對應的類別,因此我們
可以進一步運用這些類別,取得所需的訊息。

19.2.1 ApplicationContext 屬性

ApplicationContext 成員,提供用來取得目前應用程式執行個體(執行緒)
的相關資訊,它的定義如下:

Public ReadOnly Property ApplicationContext As


System.Windows.Forms.ApplicationContext

這個屬性回傳一個 ApplicationContext 物件,若是沒有任何特殊的原因或需


求 , 直 接 利 用 My.Application 回 傳 的 物 件 , 可 以 讓 你 非 常 方 便 的 運 用
ApplicationContext。

ApplicationContext 是命名空間 System.Windows.Forms 當中的物件,其定


義的屬性成員 MainForm,回傳代表一個目前所使用的表單物件,它是一個
Form 物件,如果想要取得表單資訊,可以直接使用以下的程式碼:

My.Application.ApplicationContext.MainForm.CompanyName

這段程式碼將回傳目前組件當中,設定的應用程式公司名稱資訊,除此之
外,由於 Form 物件定義了大量的公用屬性,你可以選擇引用任何一項屬性,
取得其他的相關資訊內容。

底下的範例,示範如何使用 Application,取得目前應用程式表單的相關資
訊內容。

19-4
第 19 章 My 物件

範例 slnApplicationContext

當應用程式執行的時候,按一下右邊的「顯示 Form 特性」按鈕,其中顯示


部份表單的特性:

FormContext.vb
001 Public Class FormContext
002
003 Private Sub btnAC_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnAC.Click
005
006 Dim strC As String = ""
007
008 strC += "表單名稱 :" + _
009 My.Application.ApplicationContext.MainForm.Name + vbCrLf
010 strC += "表單標題 :" + _
011 My.Application.ApplicationContext.MainForm.Text + vbCrLf
012
013 strC += "表單高度 :" + _
014 My.Application.ApplicationContext.
015 MainForm.Size.Height.ToString
016 strC += "表單高度 :" + _
017 My.Application.ApplicationContext.
018 MainForm.Size.Width.ToString + vbCrLf
019
020 strC += "表單 Tag :" + _
021 My.Application.ApplicationContext.MainForm.Tag + vbCrLf
022
023 txtFormC.Text = strC

19-5
024
025 End Sub
026 End Class

程式碼當中的 8~21 行,分別引用 ApplicationContext 取得 MainForm 屬性的


表單物件,進一步引用其相關成員,顯示表單的特性。

19.2.2 文化特性

My.Application 定 義 了 一 個 稱 為 Culture 的 屬 性 , 它 用 來 回 傳 一 個
CultureInfo 物件,這個物件用來管理應用程式當中的文字格式化設定。

Culture 屬性非常容易使用,直接引用屬性,取得 CultureInfo 物件,然後


就可以透過各種物件屬性的引用,取得文化特性的相關資訊,例如底下的程
式碼片段:

My.Application.Culture.DisplayName

這段程式碼進一步引用回傳的 CultureInfo 屬性 DisplayName,顯示目前的


所使用的語系,結果如下:

中文(台灣)

當然你可以隨意列舉其他相關的成員,取得所需的文化區域設定資訊,除此
之外,My.Application 物件另外亦提供了一個稱為 ChangeCulture 的方法,
這個方法讓你能夠輕易的更改所使用的文化特性,它的定義如下:

Public Sub ChangeCulture( _


ByVal cultureName As String _
)

cultureName 為所要設定的文化特性名稱,例如美國(en-US)
、英國(en-GB)
或是中國大陸(zh-CN)等等,台灣的預設值為(zh-TW),以下的程式碼變
更目前的設定值為英國(en-GB):

19-6
第 19 章 My 物件

My.Application.ChangeCulture(en-GB)

底下實作了一個範例,說明如何透過 My.Application 物件,進行文化特性的


設定。

專案 slnCulture

執行畫面分成兩個部份,左邊用來設定目前所使用的文化特性,右邊用來顯
示目前所使用的文化特性內容:

按一下畫面下方的「顯示文化特性」按鈕,按鈕上方的文字方塊,立刻輸出
目前系統所使用的文化特性表示文字,最後一行則依文化特性格式顯示目前
的日期時間。

除了預設的台灣 文化特性,我們也可以自行變更文化特性,點選左邊的選
項,這裏列出四個可用的示範選項,以下的畫面點選英國(en-GB),按一
下變更文化特性按鈕,此時再按一下顯示文化特性按鈕,文化特性已經變成
en-GB,其中的日期格式亦以英國格式顯示。

19-7
讀者可以自行開改範例,變更其他特性,以了解輸出結果的差異,底下我們
進一步來看看這個範例的程式碼。

FormCulture.vb
001 Public Class FormCulture
002
003 Private Sub btnCulture_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnCulture.Click
005 Dim strCulture As String
006
007 strCulture = "文化特性設定:" &
My.Application.Culture.ToString() &
008 vbCrLf & _
009 "文化特性(Name):" & My.Application.Culture.Name() &
vbCrLf & _
010 "文化特性(DisplayName):" &
My.Application.Culture.DisplayName()
011 & vbCrLf & _
012 "文化特性(EnglishName):" &
My.Application.Culture.EnglishName()
013 & vbCrLf & _
014 "文化特性(NativeName):" &
My.Application.Culture.NativeName()
015 & vbCrLf
016
017 Dim intyear As Integer = Date.Now().Year
018 Dim intmonth As Integer = Date.Now().Month
019 Dim intday As Integer = Date.Now().Day
020
021 Dim inthour As Integer = Date.Now().Hour
022 Dim intmin As Integer = Date.Now().Minute
023 Dim intSec As Integer = Date.Now().Second
024
025 Dim todayDate As New Date(
026 intyear, intmonth, intday, inthour, intmin, intSec)
027 Dim strtoday As String
028
029 strtoday = todayDate.ToString()
030 strCulture = strCulture & "目前時間:" & strtoday & vbCrLf
031 txtCulture.Text = strCulture
032
033 End Sub

19-8
第 19 章 My 物件

034
035 Private Sub btnAlterCulture_Click
036 (ByVal sender As System.Object, ByVal e As System.EventArgs)
037 Handles btnAlterCulture.Click
038
039 Dim strCulture As String = ""
040
041 Select Case True
042 Case zhtw.Checked
043 strCulture = "zh-TW"
044 Case zhcn.Checked
045 strCulture = "zh-CN"
046 Case engb.Checked
047 strCulture = "en-GB"
048 Case enus.Checked
049 strCulture = "en-US"
050 End Select
051
052 My.Application.ChangeCulture(strCulture)
053
054 End Sub
055 End Class

程式碼主要由兩個部份所組成,其中第一個副程式「btnCulture_Click」回應
使用者按下「顯示文化特性」按鈕時所觸發的事件,7~15 行分別引用各種
文化特性的屬性項目,取得文化特性的表示輸出。

17~29 行取得目前時間的表示字串,然後 30~31 行合併上述的文化特性屬性


字串,輸出於畫面上。

35 行的副程式「btnAlterCulture_Click」回應使用者按下「變更文化特性」
按鈕的操作,41~50 行以一個 Select-Case 判斷使用者所指定的文化特性選
項,於 52 行呼叫 ChangeCulture(),變更系統的文化設定。

19.3 組件資訊與訊息記錄
My.Application 物 件 架 構 底 下 有 兩 個 子 物 件 , My.Application.Info 與
My.Application.Log , My.Application.Info 用 來 取 得 組 件 的 相 關 資 訊 ,

19-9
My.Application.Log 可以進一步存取訊息記錄檔。

結束 My.Application 的討論之後,這一節緊接著來看看這兩個子物件的相關用法。

19.3.1 My.Application.Info 物件
Info 物件提供簡潔的方法,讓我們可以透過非常方便的方式,取得應用程式
組件的相關資訊,下表列舉其可用的屬性與相關說明:

屬性 說明
AssemblyName 應用程式組件檔案名稱。
CompanyName 與應用程式相關的公司名稱。
Copyright 與應用程式相關的著作與版權資訊。
Description 與應用程式相關的描述資訊。
DirectoryPath 應用程式的儲存路徑。
ProductName 與應用程式相關的商品名稱。
StackTrace 堆疊追蹤。
Title 與應用程式相關的標題名稱。
Trademark 與應用程式相關的商標名稱。
Version 應用程式的版本號碼。
WorkingSet 對應至處理序的實體記體數量。

指定其中任何一個屬性,可以讓應用程式回傳其對應的相關資訊,而這些資
訊大部份可以在專案屬性裏面的組件資訊視窗作設定,Info 的用法相當直
觀,底下使用一個實作的範例進行說明。

slnApplicationInfo

在執行這個範例之前,我預先開啟了專案的組件資訊視窗,進行相關的設定
如下:

19-10
第 19 章 My 物件

完成畫面上的設定之後,執行應用程式,按一下畫面下方的「應用程式組件
資訊」按鈕,出現底下的畫面,其中顯示了上述的組件資訊內容:

FormAppInfo.vb
001 Public Class FormAppInfo
002
003 Private Sub btnInfo_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnInfo.Click
005 Dim strInfo As String = ""
006
007 strInfo += "組件名稱:" + _

19-11
008 My.Application.Info.AssemblyName + vbCrLf
009 strInfo += "公司名稱:" + _
010 My.Application.Info.CompanyName + vbCrLf
011 strInfo += "著作權事項:" + _
012 My.Application.Info.Copyright(+vbCrLf)
013 strInfo += "描述:" + _
014 My.Application.Info.Description + vbCrLf
015 strInfo += "目錄路徑:" + _
016 My.Application.Info.DirectoryPath + vbCrLf
017 strInfo += "應用程式標題:" + _
018 My.Application.Info.Title + vbCrLf
019 strInfo += "產品名稱:" + _
020 My.Application.Info.ProductName + vbCrLf
021
022 strInfo += "商標注意事項:" + _
023 My.Application.Info.Trademark + vbCrLf
024 strInfo += "版本:" + _
025 My.Application.Info.Version.ToString + vbCrLf
026 strInfo += "實體記憶體容量:" + _
027 My.Application.Info.WorkingSet.ToString + vbCrLf
028 strInfo += vbCrLf
029 strInfo += "堆疊追蹤資訊:" + _
030 My.Application.Info.StackTrace + vbCrLf
031
032 txtInfo.Text = strInfo
033
034 End Sub
035 End Class

這個範例的內容,直接引用各種屬性成員,取得組件資訊內容,緊接著下一
個小節的 My.Application.Log 物件,與組件資訊有密切的關係,讓我們繼續
看下去。

19.3.2 寫入一般訊息
當你在撰寫偵錯程式碼的時候,通常會引用類別 Debug 所提供的方法,將
特定資訊寫入即時運算視窗,例如底下的程式片段:

Debug.Print("Debug 類別輸出的即視運算視窗訊息 !! ")

19-12
第 19 章 My 物件

這段程式碼會在即時運算視窗輸出底下文字訊息:

Debug 類別輸出的即視運算視窗訊息 !!

應用程式開發的過程當中,即時運算視窗的功能非常有用,除了一般的偵錯
場合,即時運算視窗用來追蹤程式碼執行的情形亦相當常見。

My.Application.Log 物件提供了相同的功能,它定義了相關的方法,讓 Visual


Basic 程式設計人員可以利用更簡潔的方式,寫下追蹤程式碼,於程式執行
期間,將各種事件與例外訊息,直接輸出於即時運算視窗或是指定的記錄檔。

My.Application.Log 物件定義了兩個方法,WriteEntry()與 WriteException(),


這兩個方法讓程式員可以直接寫下記錄程式活動訊息與例外的程式碼,追蹤
程式碼的執行狀況。

WriteEntry()方法的定義如下:

Public Sub WriteEntry( _


ByVal message As String _
)

其中的 message 參數,為所要輸出的訊息文字,引用這個方法,可以將指定


訊息文字,也就是 message 參數直接輸出於由組態檔所設定的記錄檔接聽程
式,在你沒有進行任何組態檔設定的情形之下,WriteEntry()方法預設會將
其輸出於即時運算視窗以及應用程式的組件記錄檔。

為了避免太過複雜,我們先來看一個實作的範例,初步了解一下
My.Application.Log 物件的功用,這個範例非常的簡單,直接引用 WriteEntry()
方法輸出一段特定的訊息。

專案 slnWriteEntry

執行此範例之前,請先從功能表「偵錯>視窗>即時運算」開啟執行運算視
窗,完成之後,緊接著執行專案,其中建立了一個訊息欄位,並且配置了一

19-13
個按鈕,執行畫面如下:

當使用者按下按鈕的時候,會將使用者於文字欄位所輸入的內容,寫入即時
運算視窗,以下為即時運算視窗的畫面:

FormWriteEntry.vb
001 Public Class FormWriteEntry
002
003 Private Sub btnWriteMessage_Click
004 (ByVal sender As System.Object, ByVal e As System.EventArgs)
005 Handles btnWriteMessage.Click
006
007 Dim messagestring As String
008 messagestring = txtMessage.Text
009 My.Application.Log.WriteEntry(messagestring)
010
011 End Sub
012 End Class

第 8 行取得文字欄位(txtMessage)的訊息內容字串,第 9 行將其當作參數
傳入 WriteEntry()方法,然後輸出於即時運算視窗。

在預設的情形之下,除了即時運算視窗,WriteEntry()會將訊息寫入應用式
專屬路徑底下的記錄檔,記錄檔是一種文字檔,用來儲存各種應用程式的訊
息,除非你特別去更動它,其預設的儲存路徑如下:
C:\Documents and Settings\username\Application Data

其中的 username 是電腦使用者的名稱,在 Application Data 資料夾裏面,

19-14
第 19 章 My 物件

會 建 立 一 個 以 應 用 程 式 專 案 本 身 所 設 定 的 資 訊 , 公 司 名 稱
(CompanyName)、商品名稱(ProductName)與版本號碼(ProductVersion)
為階層作命名的資料夾,如下式:
CompanyName\ProductName\ProductVersion

記錄檔會儲存於 ProductVersion 資料夾裏面。

以上述的 slnWriteEntry 專案為例,於方案檔節點按下滑鼠右鍵,開啟方案


的設定視窗,如下圖,按一下其中的「組件資訊」按鈕,啟動設定對話方塊,
於其中輸入相關資訊,完成後畫面如下:

CompanyName
ProductName

ProductVersion

當上述的設定完成之後,若是應用程式運用 My.Application.Log 物件寫入資


訊於記錄檔,此時你會在底下的路徑,找到副檔名為 log、以應用程式組件
名稱作命名的記錄檔 slnWriteEntry.log:

19-15
C:\Documents and Settings\sean\Application Data\康廷數位工坊\My 物件範例
\1.0.0.0

重新執行一次程式,以文字編輯器開啟記錄檔,你會發現其中即時運算視窗
的訊息,同樣出現在記錄檔。

如你所見,我們可以利用 My.Application.Log 物件監控並且記錄應用程式的


活動,將特定的訊息寫入記錄檔之中,了解應用程式的執行狀況。

以上是在預設的情形下所進行的操作,無論如何,記錄檔的儲存位置是可更
改 的 , 如 果 你 無 法 找 到 目 前 記 錄 檔 的 儲 存 位 置 , 可 以 透 過
My.Application.Log 物件所提供的 DefaultFileLogWriter 屬性,直接引用其
FullLogFileName 屬性,就可以獲得目前儲存記錄檔的位置,以下的範例說
明相關的實作。

專案 slnTraceSource

我們在這個範例當中放了一個按鈕,當使用者按下的時候,畫面上會顯示記
錄檔儲存位置的路徑資訊,如下圖:

按此顯示資訊

Public Class Form1

Private Sub btnPath_Click(ByVal sender As System.Object, _


ByVal e As System.EventArgs) Handles btnPath.Click

19-16
第 19 章 My 物件

Dim strPath As String


strPath =
My.Application.Log.DefaultFileLogWriter.FullLogFileName
lblPath.Text = strPath

End Sub
End Class

除了記錄一般的行為,針對應用程式的例外情形,另外一個方法
WriteException()則被設計用來記錄應用程式的例外訊息,緊接著下一個小節
繼續討論相關的應用。

19.3.3 寫入例外訊息

現在我們來看看另外一個方法 WriteException(),這個方法適用處理例外狀
況的相關訊息,當例外發生的時候,它會將相關訊息寫入應用程式的記錄
檔,定義如下:

Public Sub WriteException( _


ByVal ex As System.Exception _
)

其中的 ex 代表應用程式執行期間所擲出的例外物件,同樣的,這個方法會
將參數 ex 的內容,寫入即時運算視窗以及應用程式記錄檔。

方法 WriteException()是專門用來處理例外狀況所送出的訊息,除此之外,
它的原理與上述的 WriteEntry()相同,因此我們將不會再對細節作說明,緊
接 著 利 用 一 個 範 例 , 說 明 如 何 透 過 WriteException() 方 法 的 應 用 , 於
Try-Catch 區塊,建立追蹤例外狀況的程式碼。

專案 slnWriteException

19-17
這個範例建立了一個提供加法運算功能的小程式,畫面當中配置了一個等號
(=)按鈕,當使用者按下此按鈕的時候,左邊文字欄位輸入的數字會被加總,
而右邊的文字方塊欄位則顯示加總結果,如下圖:

畫面下方的訊息區域,會在出現例外的時候,顯示異常的相關說明,現在重
新執行一次程式碼,由於左邊兩個文字欄位只能接受數字,因此這一次我們
刻意輸入一個非數字的字元 A,如下圖,按一下等號按鈕,出現錯誤訊息:

結束應用程式,現在開啟記錄檔,其中的內容如下,相關的錯誤訊息,同時
被寫入記錄檔案之中:

FormWriteException.vb
001 Public Class FormWriteException

19-18
第 19 章 My 物件

002
003 Private Sub btnAdd_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnAdd.Click
005
006 Dim a As Integer
007 Dim b As Integer
008 '
009 Try
010 a = txtA.Text
011 b = txtb.Text
012 txtsum.Text = a + b
013 Catch ex As Exception
014 My.Application.Log.WriteException(ex)
015 lblExceptionMessage.Text = ex.ToString()
016 End Try
017
018 End Sub
019 End Class

Try-Catch 當中的 Catch 區塊,14 行引用 WriteException(),將 Catch 子句


所捕捉的例外寫入記錄檔之中。

My.Application.Log 物件對於儲存與追蹤應用程式相關記錄非常的有用,你
可以利用這個物件配合檔案監視器,建立一個可用來監控系統執行的應用程
式,除此之外,你也可以利用其記錄異常狀況,簡化系統的維護工作。

19.4 My.Computer 物件
這一節我們繼續來看看 My 功能另外一個有用的物件 My.Computer,它提供
簡單的方法讓應用程式設計人員直接存取電腦的相關資源,例如滑鼠、鍵
盤、時鐘與音效,甚至登錄檔的內容。

My.Computer 以屬性的方式,公開取得各種 My.Computer 物件架構底下的


各種子物件,這些物件依其所能存取的資源分別作設計,它們讓 Visual Basic
的程式設計人員得以更簡單的方法,存取電腦資源,例如 My.Computer.Audio
物件提供對電腦音效的存取、My.Computer.Ports 物件可以直接存取電腦序

19-19
列埠等等,在以往,相關的功能不是難以實作就是非常麻煩,在這裏只需要
幾個簡單的步驟就可以直接完成。

下表列舉相關的 My.Computer 物件與存取物件所需的屬性,你可以在.NET


Framework 線上手冊找到未分類的列表:

分類 屬性 描述
電腦資訊 Name 取得電腦名稱。
Info 傳回 My.Computer.Info 物件,此物件會提供用於取得電
腦的記憶體、載入的組件 (Assembly)、名稱和作業系統
相關資訊的屬性。
Registry 傳回 My.Computer.Registry 物件,此物件可以用於讀取
和寫入登錄。
Clipboard 傳回 My.Computer.Clipboard 物件,此物件會提供用於
管理剪貼簿的方法。
電腦週邊 Clock 傳回 My.Computer.Clock 物件,此物件會提供用於從系
統時鐘存取目前當地時間和國際標準時間 (相當於格林
威治標準時間) 的屬性。
Audio 傳回 My.Computer.Audio 物件,此物件會提供對電腦音
效系統的存取,以及播放 .wav 檔案的方法。
Keyboard 傳回 My.Computer.Keyboard 物件,此物件會提供用於
存取目前鍵盤狀態(例如目前已按下哪些按鍵) 的屬
性,以及將按鍵傳送至使用中視窗的方法。
Mouse 傳回 My.Computer.Mouse 物件,此物件會提供用於取得
本機電腦上安裝之滑鼠的格式與組態相關資訊的屬性。
Screen 取得 Screen 物件,此物件表示電腦的主要顯示畫面。
Ports 傳回 My.Computer.Ports 物件,此物件會提供一個屬性
和一個方法,用以存取電腦的序列埠。
網路 Network 傳回 My.Computer.Network 物件,此物件可以用於存取
網路類型和事件。
檔案系統 FileSystem 傳回 My.Computer.FileSystem 物件,此物件會提供用於
使用裝置、檔案和目錄的方法

這個列表分類列舉了相關的屬性成員,「電腦資訊」分類的屬性提供各種與

19-20
第 19 章 My 物件

電腦有關的資訊存取,「電腦週邊」則是用來存取各種電腦主體外部連結的
設備或是通訊介面,與網路有關的 Network 讓你的應用程式與網路作溝通,
最後的檔案系統 FileSystem,則提供與 IO 類別相同的檔案目錄操作功能。

19.5 存取電腦相關資訊
透過 My.Computer 存取電腦的相關資訊非常簡單,首先我們來看看最簡單
的屬性 Name,這個屬性非常的單純,回傳目前使用者的電腦名稱,定義如
下:

Public ReadOnly Property Name As String

回傳值為 String 型態的電腦名稱字串,例如底下的程式碼會在螢幕上顯示一


個提示電腦名稱的訊息方塊:

MessageBox.Show(My.Computer.Name)

相較於 Name,Info 回傳的是一個 My.Computer.Info 物件,這物件提供了


更多的屬性,讓你可以存取更多樣的電腦資源,例如記憶體數量、作業系統
名稱等等,底下列舉 My.Computer.Info 物件所提供的屬性名稱,你可以在
線上手冊找到這個列表:

分類 屬性 說明
記憶體 AvailablePhysicalMemory 取得電腦之可用實體記憶體的總數量。
AvailableVirtualMemory 取得電腦可用之可用虛擬位址空間的總數量。
TotalPhysicalMemory 取得電腦的實體記憶體總量。
TotalVirtualMemory 取得電腦可用的虛擬位址空間總數量。
作業系統 OSFullName 取得完整作業系統名稱。
資訊 OSPlatform 取得電腦作業系統的平台識別項。
OSVersion 取得電腦作業系統的版本。
文化特性 InstalledUICulture 取得與作業系統一起安裝的目前 UI 文化特性。

19-21
從屬性名稱可以很容易了解屬性的用途,它們主要用來取得記體與作業系統
的相關資訊,假設你要取得目前電腦可用的記憶體容量,底下的程式碼可以
讓你輕易的達到這個目的:

Computer.Info.AvailablePhysicalMemory

除了這個屬性,其他的屬性用法亦相同,緊接著我們利用一個專案範例進行
實作說明。

專案 slnMyComputerInfo

使用者按下畫面上的「電腦資訊」按鈕,左邊的文字方塊區域顯示電腦的記
憶體以及作業系統等相關資訊:

FormInfo.vb
001 Public Class FormInfo
002
003 Private Sub btnInfo_Click(
004 ByVal sender As System.Object, ByVal e As System.EventArgs)
005 Handles btnInfo.Click
006
007 Dim strinfo As String
008 strinfo = "電腦名稱:" & My.Computer.Name & vbCrLf & _
009 "可用實體記憶體:" & My.Computer.Info.AvailablePhysicalMemory &
010 vbCrLf & _
011 "可用虛擬記憶體:" & My.Computer.Info.AvailableVirtualMemory &
012 vbCrLf & _

19-22
第 19 章 My 物件

013 "總實體記憶體:" & My.Computer.Info.TotalPhysicalMemory & vbCrLf & _


014 "總虛擬記憶體:" & My.Computer.Info.TotalVirtualMemory & vbCrLf & _
015 "作業系統完整名稱:" & My.Computer.Info.OSFullName & vbCrLf & _
016 "作業系統平台識別:" & My.Computer.Info.OSPlatform & vbCrLf & _
017 "作業系統版本:" & My.Computer.Info.OSVersion & vbCrLf & _
018 "文化特性:" & My.Computer.Info.InstalledUICulture.Name
019
020 txtInfo.Text = strinfo
021
022 End Sub
023 End Class

程式碼只有一個回應按鈕事件的副程式「btnInfo_Click」
,第 8 行取得電腦名
稱字串,9~18 行則依序引用 My.Computer.Info 物件的屬性,取得電腦的相
關資訊,最後這些資料被結合成為一段字串,並且以斷行符號作分隔,20
行將取得的資訊內容顯示於文字方塊區域裏面。

19.6 管理登錄檔
登錄檔是構成 Windows 系統最重要的核心,它的內容非常複雜,由大量的
機 碼 所 組 成 , 儲 存 了 Windows 系 統 的 核 心 資 訊 與 各 種 安 裝 軟 體 的 相 關 設
定,對於一般作業系統的使用者而言,登錄檔是個神密且陌生的區域,隨意
的更改登錄檔可能造成系統的損壞,甚至永久癱瘓作業系統。

對於專業的程式設計人員或是系統玩家而言,登錄檔是個寶庫,它可以用來
操作、更改 Windows 的底層設定,甚至執行病毒檔清理等與系統有關的操
作,都必須透過登錄檔的設定才能完成。

19.6.1 存取登錄檔
My 功能亦提供了存取登錄檔所需的操作支援,My.Computer.Registry 屬性
用來回傳一個 My.Computer.Registry 物件,這個物件可以讓你輕易的存取
以及管理登錄檔機碼。

19-23
My.Computer.Registry 物件有兩個方法成員,GetValue()提供讀取登錄機碼
值的功能,SetValue()則允許設定登錄機碼中的值。

方法 GetValue()的定義如下:

Public Function GetValue( _


ByVal keyName As String, _
ByVal valueName As String, _
ByVal defaultValue As Object _
) As Object

其中的 keyName 代表所要存取的機碼,valueName 則是機碼項目值,這個


值不分大小寫,最後一個 defaultValue 則是在無法取得值的時候,所使用的
預設值,一般可以給它一個 Nothing。

底下的程式碼利用 GetValue()取得系統預設印表機的名稱:

My.Computer.Registry.GetValue( _
"HKEY_CURRENT_USER\Software\Microsoft\Windows
NT\CurrentVersion\Windows", _
"Device", Nothing)

其中第一個參數如下:

"HKEY_CURRENT_USER\Software\Microsoft\Windows
NT\CurrentVersion\Windows"

這是登錄檔記錄系統預設印表機的機碼,這個機碼的值 Device 則是目前預


設印表機的值,也就是程式當中所指定的第二個參數。

緊接著,我們進一步來看看 SetValue()方法,此方法的定義如下:

Public Sub SetValue( _


ByVal keyName As String, _
ByVal valueName As String, _
ByVal value As Object _
)

其中第一個以及第二個參數意義同上述的 GetValue,為所要設定的機碼名
稱,而第三個 value 參數,則是所要寫入的值。

19-24
第 19 章 My 物件

SetValue()方法還有另外一個版本,這個版本的方法多了一個參數,用來指
定登錄機碼值的型態,定義如下:

Public Sub SetValue( _


ByVal keyName As String, _
ByVal valueName As String, _
ByVal value As Object, _
ByVal valueKind As Microsoft.Win32.RegistryValueKind _
)

其中的 valueKind 是一種 Microsoft.Win32.RegistryValueKind 列舉值,它可


能的值如下,你可以在 MSDN 線上手冊找到這個份說明列表:

值 描述
Binary 代表任何形式的二進位資料,等於 Win32 API 中的 REG_BINARY 登
錄資料型別。
Dword 代表 32 位元二進位數字,等於 Win32 API 中的 REG_DWORD 登錄資
料型別。

ExpandString 代表以 null 結尾的字串,其中含有尚未擴展的環境變數,例如


%PATH%,以後要擷取時,這個資料值就會擴展開來。這個值等於
Win32 API 中的 REG_EXPAND_SZ 登錄資料型別。
MultiString 代表以 null 結尾的字串所組成的陣列,整個陣列最後以兩個 null 字
元做為結尾。這個值等於 Win32 API 中的 REG_MULTI_SZ 登錄資
料型別。
QWord 代表 64 位元二進位數字,等於 Win32 API 中的 REG_QWORD 登錄資
料型別。
String 代表以 null 結尾的字串,等於 Win32 API 中的 REG_SZ 登錄資料型別。
Unknown 代表不支援的登錄資料型別,例如 Microsoft Win32 API 的
REG_RESOURCE_LIST 登錄資料型別就是其中之一。您可以使用這個
值指定 SetValue 方法在儲存名稱/值組時,應該自行決定適當的登錄
資料型別。

SetValue()方法非常容易使用,例如底下的程式碼,可以讓你更改桌面背景
圖片:

My.Computer.Registry.SetValue( _

19-25
"HKEY_CURRENT_USER\Control Panel\Desktop", _
"Wallpaper", _
"filepath")

第一個登錄機碼參數為桌面設定值的相關機碼,第二個參數則是所要修改的
項目,第三個則是用來置換的桌布圖檔位置路徑。

了解登錄檔的存取方法,現在我們利用一個範例,說明如何透過
My.Computer.Registry 物件,在應用程式當中存取登錄檔機碼。

專案 slnMyRegistry

執行此範例,按一下畫面上右邊的「預設印表機」按鈕,會顯示此預設印表
機的名稱:

在下方輸入指定的印表機名稱,按一下「修改預設印表機」,將會修改登錄
檔裏面的預設印表機。

如果再按一下「預設印表機」按鈕,畫面上會顯示已經調整過的預設印表機

19-26
第 19 章 My 物件

名稱。

登錄機碼在 Windows 系統版本不斷的演進之下,已經是一個非常龐大的資


料庫,幾乎沒有任何人可以完全了解其中所有機碼的意義,因此讀者只需要
了解這一節所討論的方法,於需要的時候,再對特定的機碼進行更深入的研
究即可。

FormRegistry.vb
001 Public Class FormRegistry
002
003 Private Sub btnRegistry_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnRegistry.Click
005
006 Dim readvalue As Object
007
008 readvalue = My.Computer.Registry.GetValue( _
009 "HKEY_CURRENT_USER\Software\Microsoft\" + _
010 "Windows NT\CurrentVersion\Windows", _
011 "Device", Nothing).ToString
012
013 If readvalue = Nothing Then
014 MessageBox.Show("指定的機碼不存在 !!")
015 End If
016
017 txtContent.Text = readvalue
018
019 End Sub
020
021 Private Sub btnModify_Click(ByVal sender As System.Object, _
022 ByVal e As System.EventArgs) Handles btnModify.Click
023 My.Computer.Registry.SetValue( _
024 "HKEY_CURRENT_USER\Software\Microsoft\" + _
025 "Windows NT\CurrentVersion\Windows", _
026 "Device", _
027 txtPirnt.Text)
028 MessageBox.Show("預設印表機調整為" + txtPirnt.Text)
029 End Sub
030
031 End Class

第 3 行的 btnRegistry_Click 是「預設印表機」按鈕的 Click 事件處理程序,

19-27
其中引用 My.Computer.Registry 物件的 GetValue()方法,取得預設印表機的
機碼,13 行判斷其回傳值,若是回傳值是一個 Nothing 值,則表示指定的機
碼並不存在。

21 行的「btnModify_Click」則是回應按鈕「修改預設印表機」的 Click 事件,


引用 SetValue()方法,調整機碼的內容。

19.6.2 建立與刪除登錄機碼

針對一個現存的機碼進行調整現在對讀者來說已經不是問題,這一節我們進
一步來看看,如何在登錄檔的特定登錄區,建立或是刪除登錄機碼。

了解相關的實作之前,首先來看看 My.Computer.Registry 物件所提供的屬


性,底下為這些屬性的相關列表:

屬性 登錄區
ClassesRoot HKEY_CLASSES_ROOT。
CurrentConfig HKEY_CURRENT_CONFIG。
CurrentUser HKEY_CURRENT_USER。
DynData HKEY_DYNAMIC_DATA。
LocalMachine HKEY_LOCAL_MACHINE。
PerformanceData HKEY_PERFORMANCE_DATA。
Users HKEY_USERS。

表列的每一個屬性值對應至特定的登錄區,這些屬性除了對應的登入區不同
之外,它們有相同的定義,並且回傳一個 Microsoft.Win32.RegistryKey 物
件,以 ClassesRoot 為例,底下為其宣告:

Public ReadOnly Property ClassesRoot As Microsoft.Win32.RegistryKey

當你引用這個屬性的時候,回傳的 RegistryKey 物件,可以讓你進一步執行


登錄檔的相關操作,無論如何,詳細說明登錄檔並非本書的目的,我們也不

19-28
第 19 章 My 物件

會完整的探討 RegistryKey 類別的功能,但是你可以看到如何在登錄區進行


基本的登錄機碼操作。

緊接著我們要繼續說明的是如何建立機碼,這個操作非常的簡單,首先確認
新的機碼要建立在那一個登錄區,例如 CurrentUser,如下式:

My.Computer.Registry.CurrentUser.CreateSubKey("MyTestKey")

其中引用 CreateSubKey(),並且輸入所要建立的機碼值即可,如果想要刪
除登錄機碼也很簡單,如下式:

My.Computer.Registry.CurrentUser.DeleteSubKey("MyTestKey")

其中指定所要刪除的機碼所在位置的登錄區,然後引用 DeleteSubKey()方法
完成刪除機碼的動作。

上述的方法會建立或是刪除一個指定的機碼,我們利用一個簡單的範例進行
實作說明。

專案 slnRegedit

在畫面中,輸入所要建立或是刪除的機碼,按一下「建立」按鈕,就可以完
成相關的程序。

現在於命列列開啟登錄編輯程式視窗,如下圖,其中新建立的 newKey 出現
在下方:

19-29
FormRegedit.vb
001 Public Class FormRegedit
002
003 Private Sub btnRegedit_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnRegedit.Click
005
006 If (txtSubKey.Text.Length < 1) Then
007 MessageBox.Show("請輸入機碼")
008 Return
009 End If
010 My.Computer.Registry.CurrentUser.CreateSubKey(txtSubKey.Text)
011 MessageBox.Show(txtSubKey.Text + " 建立完成 !!")
012
013 End Sub
014
015 Private Sub btnDelete_Click(ByVal sender As System.Object, _
016 ByVal e As System.EventArgs) Handles btnDelete.Click
017
018 If (txtSubKey.Text.Length < 1) Then
019 MessageBox.Show("請輸入機碼")
020 Return
021 End If
022 My.Computer.Registry.CurrentUser.DeleteSubKey(txtSubKey.Text)
023 MessageBox.Show(txtSubKey.Text + " 刪除 !!")
024
025 End Sub
026
027 End Class

程 式 碼 由 畫 面 上 兩 個 按 鈕 的 相 關 Click 事 件 處 理 程 序 組 成 , 第 3 行 的

19-30
第 19 章 My 物件

「 btnRegedit_Click」於使用 者按下「建 立」按鈕的 時候,於 第 10 行引 用


CreateSubKey(),建立指定的機碼,15 行的「btnDelete_Click」,則於使用
者按下「刪除」按鈕的時候,於 22 行引用 DeleteSubKey,刪除指定的機碼。

最後要提醒讀者的是,隨意更改登錄檔很容造成系統嚴重的毀損,在進行相
關的設定之前,請務必確定已經完全了解所要設定的登錄檔機碼。

19.7 管理剪貼簿
剪貼簿是個非常普遍且實用的功能,儘管前一版的 Visual Basic.NET 已經可
以非常方便的使用,但是 My 功能依然導入了相關的實作,讓剪貼簿的應用
更為方便直接,相關的功能,封裝於 My.Computer.Clipboard 物件,你可以
直接使用這個物件,引用其方法成員,進行剪貼簿的管理作業。

19.7.1 關於 My.Computer.Clipboard 物件

要了解如何使用 My.Computer.Clipboard 物件,首先對於它能夠處理的資料


格式必須有一些簡單的概念,剪貼簿能夠儲存的資料格式非常廣泛,明確的
格式由 System.Windows.Forms.DataFormats 類別所定義,它列舉了剪貼簿
所能辨識的資料格式,例如文字、影像或是圖檔等等,剪貼簿允許同時儲存
多種格式的資料,甚至類別物件,當然,你必須確定物件允許被序列化才可
以將其儲存至剪貼簿當中。

下表列舉部份的 DataFormats 類別定義的資料格式欄位,你可以透過指定其


中的格式項目,明確的指定管理剪貼簿的操作所要使用的資料格式:

格式 說明
Bitmap Windows 點陣圖格式。
Text 標準的 ANSI 文字格式
MetafilePict Windows 中繼檔格式

19-31
Rtf Rich Text 格式 (RTF) 資料構成的文字

My.Computer.Clipboard 物件提供讀寫各種資料格式的方法成員,只需要引
用這些成員,就可以直接將資料寫入剪貼簿或是從中取出。

清除剪貼簿的方法 Clear()是 My.Computer.Clipboard 物件最簡單的方法成


員,直接引用這個方法可以將剪貼簿的內容清除,稍後你會看到相關的應
用,除了這個方法之外,其他的方法均與資料的處理有關,主要分成三組,
分別為 Containsxxx、Getxxx 以及 Setxxx,其中的 xxx 代表所要處理的資料
型態,Containsxxx 用來判斷剪貼簿中是否有 xxx 型態的資料,Getxxx 則允
許你從剪貼簿擷取 xxx 型態的資料,Setxxx 將指定 xxx 型態的資料,寫入剪
貼簿中。

資料管理的方法成員所能處理的相關格式資料與對應的方法列舉如下:

資料格式 Containsxxx Getxxx Setxxx

文字 ContainsText GetText SetText


音訊串流資料 ContainsAudio GetAudioStream SetAudio
影像 ContainsImage GetImage SetImage
FileDropList ContainsFileDropList GetFileDropList SetFileDropList
自訂格式 ContainsData GetData SetData
資料物件 - GetDataObject SetDataObject

了解這些方法之後,接下來根據所要處理的資料格式與操作行為,引用合適
的方法便能夠輕易的為你的應用程式建立剪貼簿管理功能。

19.7.2 文字資料處理

剪貼簿就像一個容器,它可以儲存各種特定格式的資料,而管理剪貼簿的行
為不外乎清空、擷取、儲存與檢核其中所儲存的資料內容。

清空剪貼簿的資料是最簡單的操作,相關的方法成員為 Clear(),只要直接

19-32
第 19 章 My 物件

呼叫這個方法,就可以將其中的資料清空,語法如下:

My.Computer.Clipboard.Clear()

當這段程式碼執行的時候,會將剪貼簿當中所儲存的資料全部清空。

緊接著以文字資料(Text)為例進行相關說明,SetText()方法會將指定的文
字資料寫入剪貼簿,這個方法的宣告如下:

Public Sub SetText( _


ByVal text As String _
)

其中的參數 text 為所要寫入的資料內容, 而將文字資料從剪貼簿取出的方


法為 GetText(),此方法的宣告定義如下:

Public Function GetText() As String

這個方法取得目前儲存於剪貼簿的文字資料,並且以 String 的型態作回傳,


接下來是一個範例,說明如何利用上述的方法,進行文字的剪貼工作。

專案 slnMyClip

範例當中包含兩個文字方塊,當使用者按下畫面當中的「複製」按鈕,會將
上方文字方塊裏面的內容文字,儲存至剪貼簿,再按一下「貼上」按鈕,其
中的文字會複製到下方的文字方塊:

按一下儲存文字內容

按一下貼上文字內容

19-33
畫面的右上方有一個清空按鈕,當使用者按下這個按鈕的時候,剪貼簿的內
容會被清空,此時若是按一下「貼上」按鈕,由於內容是空的,因此文字方
塊會被重新清空。

FormMyClip.vb
001 Public Class FormMyClip
002
003 Private Sub btnCopy_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnCopy.Click
005
006 My.Computer.Clipboard.SetText(txtSource.Text)
007
008 End Sub
009
010 Private Sub btnPast_Click(ByVal sender As System.Object,
011 ByVal e As System.EventArgs) Handles btnPaste.Click
012
013 Dim strCopy As String
014
015 strCopy = My.Computer.Clipboard.GetText()
016 txtTarget.Text = strCopy
017
018 End Sub
019
020 Private Sub btnClear_Click(ByVal sender As System.Object,
021 ByVal e As System.EventArgs) Handles btnClear.Click
022
023 My.Computer.Clipboard.Clear()
024
025 End Sub
026 End Class

第 3 行、第 10 行以及第 20 行的副程式,分別回應畫面上三個按鈕的 Click


事件,當使用者按下「複製」、「貼上」以及「清空」按鈕時候,進行剪貼簿
的對應動作。

除了單純的剪貼文字資料,利用底下的版本,你甚至可以指定所要寫入的文
字資料格式:

Public Sub SetText( _

19-34
第 19 章 My 物件

ByVal text As String, _


ByVal format As System.Windows.Forms.TextDataFormat _
)

其中第二個參數 format 為所要指定的格式,同樣的,GetText()也有格式化


的版本,這個方法可以讓你決定要回傳的資料格式內容,如下式:

Public Function GetText( _


ByVal format As System.Windows.Forms.TextDataFormat _
) As String

TextDataFormat 代表所要處理的資料格式,它是一個列舉型別,你可以指
定其中的任何一個,如下表:

成員名稱 說明
CommaSeparatedValue 指定逗號分隔值(CSV)格式,試算表常用的一種交換格式。
Html 構成 HTML 資料的文字。
Rtf 由 Rich Text 格式(RTF)資料構成的文字。
Text 標準 ANSI 文字格式。
UnicodeText 標準 Windows Unicode 文字格式。

你也可以指定任何一種格式的資料,例如底下的程式片段,以 Rtf 的格式剪


貼資料:

My.Computer.Clipboard.SetText(pasteText,
System.Windows.Forms.TextDataFormat.Rtf)
My.Computer.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Rtf)

其中第一行將指定的資料以 Rtf 格式儲存至剪貼簿,然後從剪貼簿再以 Rtf


格式取出。

一般的應用軟體,例如微軟的 Word,當使用者於其中進行資料編輯的時候,
底層透過專屬的格式資訊對資料進行格式處理,當你指定以 Text 格式剪貼
這些資料的時候,只有純文字的資料會被處理,若是指定為 Rtf 或是其他種
類的格式,我們就可以將其中的格式辨識資訊一併取出,進一步作編輯。

19-35
專案 slnMyClipFormat

這個範例只提供一個貼上 的按鈕,將目前剪貼簿的內容,貼到文字方塊上
面,並且提供三個選項,讓使用者在貼上資料的時候,指定所要套用的格式,
預設值為 Text 格式:

為了試驗這個範例,首先筆者於本章的 Word 稿件當中,複製一段表格的內


容,也就是下圖中 Word 編輯文件畫面當中反白的部份:

19-36
第 19 章 My 物件

接下來按一下「貼上」按鈕,此時出現畫面如下,由於是預設的 Text 格式,


因此只有文字內容被貼到文字方塊裏面:

Text 格式

現在選擇 Rtf 格式,重新按一下貼上按鈕,此時會顯示其他隱藏的格式內容:

19-37
選擇 Rtf
格式

最後,按一下 Html 格式,貼上的內容又與之前不同,主要是呈現 Word 編


輯器用來呈現 Html 相關格式的內容文字:

FormMyClipFormat.vb
001 Public Class FormMyClipFormat
002
003 Private Sub Button1_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles Button1.Click
005
006 Dim formatObject As System.Windows.Forms.TextDataFormat
007
008 Select Case True
009 Case rbText.Checked
010 formatObject = System.Windows.Forms.TextDataFormat.Text
011 Case rbRtf.Checked

19-38
第 19 章 My 物件

012 formatObject = System.Windows.Forms.TextDataFormat.Rtf


013 Case rbHtml.Checked
014 formatObject = System.Windows.Forms.TextDataFormat.Html
015 End Select
016
017 txtContent.Text = My.Computer.Clipboard.GetText(formatObject)
018
019 End Sub
020 End Class

第 3 行的副程式回應使用者按下複製按鈕所觸發的 Click 事件,8~15 行的


Select-Case 檢 視 使 用 者 所 選 擇 的 格 式 , 並 且 設 定 於 第 6 行 所 定 義 的
TextDataFormat 變數 formatObject,最後 17 行以 formatObject 為參數,
引用 GetText()方法擷取目前剪貼簿的內容,顯示於文字方塊上。

如你所見,格式設定的威力非常強大,你可以選擇特定的格式解析某些純文
字格式無法辨識的資料,特別是當你想要擷取特定格式資訊的相關內容時,
這種方式就特別的有用。

19.7.3 影像與音訊資料
除了文字,影像與音訊資料,同樣都可以儲存至剪貼簿當中,相關的操作由
GetAudioStream()、SetAudio()與 GetImage()、SetImage()這兩組方法提供
所需的功能,由於我們已經有了存取文字資料的經驗,因此現在直接來看看
方法的宣告內容。

影像資料是針對 System.Drawing.Image 物件作處理,相關的宣告如下:

Public Sub SetImage( _


ByVal image As System.Drawing.Image _
)
Public Function GetImage() As System.Drawing.Image
Public Function ContainsImage() As Boolean

影像資料的操作不並不困難,如你所見,以上述文字資料的觀念即可進行實
作,只是它所處理的資料必須是一個 Image 物件,底下是一個實作範例。

19-39
專案 slnMyClipImage

為了示範剪貼簿的效果,這個專案建立了兩個表單檔案,第一個檔案用來選
取所要顯示的圖檔,並且顯示其縮小圖,另外一個表單則是以圖檔的原尺寸
顯示使用者所選擇的圖檔。

選擇要顯示的圖檔,此時畫面上出現此圖檔的內容,按一下畫面底下的「顯
示全圖」按鈕,顯示其原始尺寸:

19-40
第 19 章 My 物件

FormImageSelect.vb
001 Public Class FormImageSelect
002
003 Private Sub btnSelect_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnSelect.Click
005
006 Dim strFilter As String
007
008 strFilter = "圖檔(*.jpg)|*.jpg"
009 OpenFileDialog.Filter = strFilter
010
011 If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
012 txtFile.Text = OpenFileDialog.FileName
013 End If
014
015 Dim bitmapSelect As Bitmap
016
017 If txtFile.Text.Length > 0 Then
018
019 bitmapSelect = New Bitmap(txtFile.Text)
020 pbSelect.Image = bitmapSelect

19-41
021 My.Computer.Clipboard.SetImage(bitmapSelect)
022
023 End If
024
025 End Sub
026
027 Private Sub btnShow_Click(ByVal sender As System.Object, _
028 ByVal e As System.EventArgs) Handles btnShow.Click
029 FormShow.Show()
030 End Sub
031 End Class

當「選擇影像」按鈕被按下的時候,第 3 行的「btnSelect_Click」程序被執
行,21 行透過 Clipboard 引用其中的 SetImage(),將使用者所指定的影像儲
存於剪貼簿當中,27 行的「btnShow_Click」於使用者按下時,呼叫 FormShow
顯示全圖。

FormShow.vb
001 Public Class FormShow
002
003 Private Sub FormShow_Load(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles MyBase.Load
005
006 pbSelect.Image = My.Computer.Clipboard.GetImage()
007 End Sub
008 End Class

這 個 表 單 畫 面 程 式 碼 顯 示 先 前 所 選 擇 的 影 像 , 第 6 行 引 用 Clipboard 的
GetImage(),重新取得剪貼薄當中所儲存的影像。

完成上述的範例之後,緊接著來看看音訊資料的部份,音訊資料本身是以資
料流的型式儲存於剪貼簿當中,因此必須透過 Stream 格式進行存取,以下
為相關的存取方法:

Public Sub SetAudio( _


ByVal audioStream As System.IO.Stream _
)
Public Function GetAudioStream() As System.IO.Stream
Public Function ContainsAudio() As Boolean

19-42
第 19 章 My 物件

音訊資料同樣也是一個資料檔案,沒有意外的,就如同其他格式的資料,你
只需要將封裝了音訊檔案的資料流物件當作參數,傳遞給 SetAudio()方法,
即可將音訊資料儲存至剪貼簿當中。

呼叫 GetAudioStream()可以將音訊資料自剪貼簿當中取出,而取回的資料則
是一 Stream 資料流件。

專案 slnMyClipAudio

程式一開始執行的時候,出現一個檔案選擇方塊,按一下「…」按鈕,啟動
檔案開啟視窗,選擇所要播放的 wav 檔:

以 Windows 系統內建的音效檔為例,按一下「播放音訊」按鈕,此時指定
的音效檔被播放,讀者可以自行開啟範例,體驗執行的效果。

FormPaly.vb
001 Public Class FormPlay
002
003 Private Sub btnSelect_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnSelect.Click
005
006 Dim strFilter As String
007
008 strFilter = "圖檔(*.wav)|*.wav"
009 OpenFileDialog.Filter = strFilter
010
011 If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
012 txtFile.Text = OpenFileDialog.FileName
013 End If
014
015 If txtFile.Text.Length > 0 Then

19-43
016
017 Dim FieStream As New System.IO.FileStream(
018 txtFile.Text, IO.FileMode.Open)
019 My.Computer.Clipboard.SetAudio(FieStream)
020 End If
021
022 End Sub
023
024 Private Sub btnPlay_Click(ByVal sender As System.Object,
025 ByVal e As System.EventArgs) Handles btnPlay.Click
026
027 If My.Computer.Clipboard.ContainsAudio() Then
028 Dim myStream As System.IO.Stream
029 myStream = My.Computer.Clipboard.GetAudioStream()
030 My.Computer.Audio.Play(myStream,
AudioPlayMode.WaitToComplete)
031 Else
032 MessageBox.Show("沒有任何可播放音效檔!!")
033 End If
034
035 End Sub
036 End Class

第 3 行所定義的方法「btnSelect_Click」
,回應使用者按下畫面上「…」按鈕
所觸發的 Click 事件,17 行根據使用者所指定的檔案路徑,建立相關的資料
流物件,19 行將其儲存至剪貼簿當中。

接下來 24 行的方法「btnPlay_Click」方法,於使用者按下「播放音訊」按
鈕的時候執行,27 行首先檢核是否目前剪貼簿當中有任何音訊資料,是的
話引用 GetAudioStream()取得其中的資料並且儲存至預先定義的 myStream
物件,最後 30 行播放此音效檔。

19.8 與周邊裝置互動
滑鼠、鍵盤與通訊埠,是一般電腦的基本周邊設備,設計與這些裝置互動的
程式功能,在應用程式開發的過程中非常普遍,這一節我們來看看
My.Computer 物件對於這一方面所提供的支援。

19-44
第 19 章 My 物件

19.8.1 時間與 My.Computer.Clock 物件

My.Computer.Clock 物件提供簡便的方法,用來存取系統時鐘,它提供了以
下三個屬性:

屬性 描述
GmtTime 包含目前電腦上本機日期和時間的 Date 物件(以 UTC (GMT) 時間表示)。
LocalTime 取得包含目前這部電腦上本機日期和時間的 Date 物件。
TickCount 取得電腦系統計時器的毫秒計數。

GmtTime 與 LocalTime 分別回傳代表目前電腦上,本機日期和時間的 Date


物件,基本上除了時區的差異之外(國際標準時間(格林威治標準時間)與
本地時間),這兩個方法的意義沒有太大的差別。

TickCount 則是取得計時器的毫秒計數,這個方法非常的好用,可以讓你用
來計算某段時間差的毫秒數,我們調整一下稍早的範例,顯示音訊檔播放的
時間長度。

專案 slnMyClipAudioTime

這個範例於其中加入了一個顯示播放秒數的標籤控制項,當選取的音訊檔播
放完畢之後,畫面中會出現所經過的時間長度。

這個範例加入了 TickCount 的程式碼,底下列出其中修改的部份。

19-45
FormPaly.vb
001 Private Sub btnPlay_Click(ByVal sender As System.Object,
002 ByVal e As System.EventArgs) Handles btnPlay.Click
003
004 If My.Computer.Clipboard.ContainsAudio() Then
005 Dim myStream As System.IO.Stream
006 myStream = My.Computer.Clipboard.GetAudioStream()
007
008 Dim intbegin As Integer = My.Computer.Clock.TickCount
009 My.Computer.Audio.Play(myStream,
AudioPlayMode.WaitToComplete)
010 Dim intend As Integer = My.Computer.Clock.TickCount
011
012 lblClock.Text = "音效檔播放長度:" &
013 ((intend - intbegin) / 1000).ToString
014 Else
015 MessageBox.Show("沒有任何可播放音效檔!!")
016 End If
017 End Sub

列表是「播放音訊」按鈕的 Click 程式碼,其中的 8~13 行為修改的部份,


第 8 行在播放音訊檔之前,取得目前系統計時器的毫秒數,第 10 行於播放
完成之後,再重新取一次,然後 12 行將前後兩個值相減,以取得時間差,
顯示在畫面上。

19.8.2 音效播放與 My.Computer.Audio

播放音效的功能,上面的範例已經有相關的應用,現在我們仔細來看看播放
音效所使用的物件,My.Computer.Audio,這個物件提供播放音效所需的功
能,如果你只是需要簡單的播放功能,就如同上述範例所示範的,可以直接
引用這個物件。

My.Computer.Audio 提供三種方法,都與播放有關,列舉如下:

方法成員 說明
Play 播放 .wav 音效檔。

19-46
第 19 章 My 物件

PlaySystemSound 播放系統音效。
Stop 停止在背景播放音效。

從方法的名稱,你可以很容易理解其意義,我們來看看相關的細節,首先是
Play()方法定義如下:

Public Sub Play( _


ByVal location As String _
)
Public Sub Play( _
ByVal location As String, _
ByVal playMode As AudioPlayMode _
)
Public Sub Play( _
ByVal data As Byte(), _
ByVal playMode As AudioPlayMode _
)
Public Sub Play( _
ByVal stream As System.IO.Stream, _
ByVal playMode As AudioPlayMode _
)

Play()方法有四種不同的版本,前兩種版本讓你可以指定所要播放的音訊檔
路徑以進行播放,後兩種版本則是直接播放位元組或是資料流物件形式的音
訊檔。

後三種方法還有一個 AudioPlayMode 參數,這個參數用來設定播放的模式,


AudioPlayMode 是一種列舉值,可能的值有以下三種:

playMode 描述
AudioPlayMode.Background 背景播放音效。
AudioPlayMode.BackgroundLoop 背景播放音效,直到呼叫 My.Computer.Audio.Stop
方法為止。
AudioPlayMode.WaitToComplete 播放音效並等到播放完成,呼叫程式碼才會繼續執
行。

除非透過多執行緒技術,否則應用程式只能同時執行一件工作,在正常的情

19-47
形下,例如上述的範例,當我們按下「播放音訊」的按鈕之後,必須等待音
訊播放完畢之後,才能繼續往下執行其他的程式碼。

若是我們將第二個參數設定為 AudioPlayMode.Background,則音訊播放的
動作會背景執行,此時程式本身將能夠繼續執行而不會受影響,而第二個列
舉 值 AudioPlayMode.BackgroundLoop 則 會 重 複 循 環 , 直 到 程 式 碼 執 行
My.Computer.Audio 物件的另外一個方法 Stop 為止,Stop 方法很簡單,直
接呼叫就可以達到所要的目的,例如以下的程式碼:

My.Computer.Audio.Stop()

第三個參數 AudioPlayMode.WaitToComplete 要求整個音訊檔一定要全部播


放完畢,稍早的範例所使用的便是這個參數,緊接著我們繼續修改上述的音
訊檔播放範例,讓它可以提供更彈性的播放功能。

專案 slnMyAudioPlay

這裏擴充了上述的範例,同時直接指定音訊檔的路徑進行播放,畫面上出現了
三個選項,讓使用者可以選擇強制一次播放、於背景單次或是循環播放。

當使用者選擇背景或是循環播放的時候,可以隨時按下停止播放按鈕,結束
音訊播放。

FormPlay.vb
001 Public Class FormPlay
002
003 Private Sub btnSelect_Click(ByVal sender As System.Object,

19-48
第 19 章 My 物件

004 ByVal e As System.EventArgs) Handles btnSelect.Click


005 Dim strFilter As String
006
007 strFilter = "圖檔(*.wav)|*.wav"
008 OpenFileDialog.Filter = strFilter
009
010 If OpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
011 txtFile.Text = OpenFileDialog.FileName
012 End If
013
014 End Sub
015
016 Private Sub btnPlay_Click(ByVal sender As System.Object,
017 ByVal e As System.EventArgs) Handles btnPlay.Click
018
019 If txtFile.Text.Length > 0 Then
020
021 Dim intMOde As AudioPlayMode
022
023 Select Case True
024 Case rbComplete.Checked
025 intMOde = AudioPlayMode.WaitToComplete
026 Case rbBack.Checked
027 intMOde = AudioPlayMode.Background
028 Case rbLoop.Checked
029 intMOde = AudioPlayMode.BackgroundLoop
030 End Select
031
032 My.Computer.Audio.Play(txtFile.Text, intMOde)
033 Else
034 MessageBox.Show("沒有任何可播放音效檔!!")
035 End If
036
037 End Sub
038
039 Private Sub btnStop_Click(ByVal sender As System.Object,
040 ByVal e As System.EventArgs) Handles btnStop.Click
041 My.Computer.Audio.Stop()
042 End Sub
043 End Class

副程式「btnSelect_Click」當中,此次不再建立資料流物件,只是單純的將
使用者所選取的檔案路徑字串,顯示於畫面上的文字方塊。

19-49
23~30 行的 Select-Case,根據使用者所指定的選項,設定播放的模式參數,
最後 32 行以此模式呼叫 Play(),播放文字方塊裏所指定的音訊檔案。

結束這一個小節之前,最後我們還有一個方法要說明,PlaySystemSound(),
這個方法會播放指定的系統音效:

Public Sub PlaySystemSound( _


ByVal systemSound As System.Media.SystemSound _
)

系統音效由 System.Media.SystemSound 所定義,分別有 Asterisk、Beep、


Exclamation 、 Hand 以 及 Question , 想 要 播 放 這 些 音 效 非 常 簡 單 , 以
My.Computer.Audio 物件直接呼叫,並且傳入所要播放的項目即可,例如底
下的程式碼:

My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Exclamation)

讀者可以自已嘗試看看各種系統音效,這裏就不再多作說明。

19.8.3 滑鼠與鍵盤

My.Computer. Keyboard 與 My.Computer. Mouse 分別提供鍵盤與滑鼠相關


資訊的存取操作,不過 My 物件對於這一方面的支援雖然便利,但是卻非常
的陽春,它們只提供了幾個簡單的成員供設計人員使用,以下列舉說明之:

My.Computer. Mouse

屬性 描述
ButtonsSwapped 回傳 Boolean 值,指出是否已調換滑鼠左右按鈕的功能。
WheelExists 回傳 Boolean 值,指出滑鼠是否有滾輪。
WheelScrollLines 取得數字,指出當滑鼠滾輪旋轉一格時要捲動多少。

My.Computer.Mouse 只提供了三個屬性,分別用來檢視滑鼠是否有滾輪以
及左右按鈕的功能,如上表所說明,你可以在程式當中呼叫這三個屬性,以

19-50
第 19 章 My 物件

取得滑鼠的相關資訊。

My.Computer.Keyboard

屬性 說明
AltKeyDown 取得 Boolean,指出是否已經按下 ALT 鍵。
CapsLock 取得 Boolean,指出是否已開啟 CAPS LOCK。
CtrlKeyDown 取得 Boolean,指出是否已經按下 CTRL 鍵。
NumLock 取得 Boolean,指出是否已開啟 NUM LOCK。
ScrollLock 取得 Boolean,指出是否已開啟 SCROLL LOCK。
ShiftKeyDown 取得 Boolean,指出是否已按下 SHIFT 鍵。

My.Computer.Keyboard 的屬性用來測試使用者是否有按下特殊鍵,ALT、
CAPS LOCK 或是 CTRL 等等。

它提供唯一的方法 SendKeys,這個方法可以讓你透過程式碼傳送特定的按
鍵,就如同使用者按下鍵盤的動作一樣,其定義如下:

Public Sub SendKeys( _


ByVal keys As String, _
ByVal wait As Boolean _
)

其中的 keys 為所要傳送的按鍵名稱,第二個參數 wait 是選擇性的,如果輸


入 True 代表按鍵處理完畢之後,再繼續執行應用程式,同時這也是預設值。

Keys 所代表的是任何一個可能的按鍵,例如要傳送按鍵 a,則你必須輸入「a」


作為參數,特殊鍵 ALT、CTRL 或 SHIFT,則必須以大括弧圍繞按鍵名稱
作表示,例如代表 TAB 鍵的{TAB}字串。

不僅僅是單一的字母按鍵,Keys 同樣接受任何複合式的輸入,包含特殊的
組合鍵、連續字母等等,Windows 平台軟體的鍵盤操作有幾種慣例,例如結
合 ALT、CTRL 或 SHIFT 按鈕的操作,通常代表某種功能,如果要撰寫自

19-51
動傳送這些複合式按鍵的功能,必須如下設定:

z ALT:必須以加號(+)連結按鍵
z CTRL:必須以插入符號(^)連結按鍵碼,例如「^V」表示 Ctrl 加上 V。
z SHIFT:必須以百分比符號(%)連結按鍵碼。

以上是三個常用的組合鍵,除此之外,另外一種鍵盤操作是輸入重複鍵的設
定,假設你要重複輸入一個以上的按鍵,例如四個字母 A,則必須傳送{A
4},其中的空格是必須的,表示你要輸入字母 A,連續四次。

最後,除了上述的組合鍵與一般的數字按鍵,針對特殊鍵,例如 ENTER、
TAB 等等,都有相對應的辨識名稱,你要傳送這一類的按鍵,必須指定其
名稱,這些按鍵的列表如下:

按鍵 程式碼 按鍵 程式碼
退格鍵 {BACKSPACE} 或 BREAK {BREAK}
{BS}
CAPS LOCK {CAPSLOCK} CLEAR {CLEAR}
DELETE {DELETE} 或 {DEL} 向下鍵 {DOWN}
END {END} ENTER(數字 {ENTER}
鍵)
ENTER ~ ESC {ESCAPE} 或 {ESC}
HELP {HELP} HOME {HOME}
INS {INSERT} 向左鍵 {LEFT}
NUM LOCK {NUMLOCK} PAGE DOWN {PGDN}
PAGE UP {PGUP} RETURN {RETURN}
向右鍵 {RIGHT} SCROLL {SCROLLLOCK}
LOCK
TAB {TAB} 向上鍵 {UP}
F1 到 F15 {F1} 到 {F15}

緊接著底下透過一個範例,說明如何使用 SendKeys,模擬鍵盤的輸入操作。

19-52
第 19 章 My 物件

專案 slnMyKeyboard

這是一個非常簡單的鍵盤模擬程式,當使用者按一下右上方的「複製」按鈕,
此時應用程式會模擬 Ctrl+C 的按鍵動作,將上方文字塊的內容,儲存至剪
貼薄,按一下貼上按鈕,此時應用程式模擬 Ctrl+V 將剪貼薄的內容,貼至
下方的文字方塊。

右下方的「轉換輸入法」按鈕,模擬「CTRL+SHIFT」,可以讓你逐步切換
電腦上所安裝的中文輸入法,左下方的四個功能鍵則是模擬鍵盤的方向鍵,
在文字方塊當中左右移動游標。

FormMyKeybord.vb
001
002 Public Class FormMyKeyBord
003
004 Private Sub btnCopy_Click(ByVal sender As System.Object,
005 ByVal e As System.EventArgs) Handles btnCopy.Click
006 txtKeyField.Focus()
007 txtKeyField.SelectAll()
008 My.Computer.Keyboard.SendKeys("^C")
009 End Sub
010
011 Private Sub btnPast_Click(ByVal sender As System.Object,
012 ByVal e As System.EventArgs) Handles btnPast.Click
013 txtKeyFieldPast.Focus()
014 txtKeyFieldPast.SelectAll()
015 My.Computer.Keyboard.SendKeys("^V")
016 End Sub
017

19-53
018 Private Sub txtKeyT_Click(ByVal sender As System.Object,
019 ByVal e As System.EventArgs) Handles txtKeyT.Click
020
021 txtKeyField.Focus()
022 My.Computer.Keyboard.SendKeys("^+")
023
024 End Sub
025
026 Private Sub btnHOME_Click(ByVal sender As System.Object,
027 ByVal e As System.EventArgs) Handles btnHOME.Click
028 txtKeyField.Focus()
029 My.Computer.Keyboard.SendKeys("{HOME}")
030 End Sub
031
032 Private Sub btnEND_Click(ByVal sender As System.Object,
033 ByVal e As System.EventArgs) Handles btnEND.Click
034 txtKeyField.Focus()
035 My.Computer.Keyboard.SendKeys("{END}")
036 End Sub
037
038 Private Sub btnLeft_Click(ByVal sender As System.Object,
039 ByVal e As System.EventArgs) Handles btnLeft.Click
040
041 txtKeyField.Focus()
042 My.Computer.Keyboard.SendKeys("{LEFT 1}")
043 End Sub
044
045 Private Sub btnRight_Click(ByVal sender As System.Object,
046 ByVal e As System.EventArgs) Handles btnRight.Click
047
048 txtKeyField.Focus()
049 My.Computer.Keyboard.SendKeys("{RIGHT 1}")
050 End Sub
051
052 End Class

這個範例的程式碼很單純,在每一個按鈕的事件處理程序裏面,引用相關的
SendKeys()方法,進行鍵盤的模擬操作,讀者可以自已檢核其中對應的副程
序,以了解 SendKeys()的相關鍵盤設定與效果。

My.Computer. Keyboard 物件的 SendKeys()方法非常便利,尤其當你想要自

19-54
第 19 章 My 物件

動化應用程式鍵盤操作的時候特別好用,例如你可以開啟外部程式,然後透
過 SendKeys()傳送指定的按鍵碼,就如同使用者直接以鍵盤操作應用程式一
般,底下是另外一個範例程式。

專案 slnMyNotePad

執行畫面出現一個文字輸入區域,於其中輸入一段文字,例如將本例的程式
碼輸入如下圖:

按一下複製按鈕,文字區域的內容會被反白,並且儲存至剪貼簿,緊接著,
按一下儲存至記事本,此時一個新的記事本檔案被啟動,同時開啟另存新檔
視窗,要求使用者將其儲存至指定的位置。

19-55
專案 slnMyNotePad

FormNotepad.vb
001 Public Class FormNotepad
002
003 Private Sub btnToNotePad_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnToNotePad.Click
005
006 Shell("NOTEPAD", AppWinStyle.NormalFocus)
007 My.Computer.Keyboard.SendKeys("^V")
008 My.Computer.Keyboard.SendKeys("%F")
009 My.Computer.Keyboard.SendKeys("^S")
010
011 End Sub
012
013 Private Sub btnCopy_Click(ByVal sender As System.Object,
014 ByVal e As System.EventArgs) Handles btnCopy.Click
015
016 txtArea.Focus()
017 txtArea.SelectAll()
018 My.Computer.Keyboard.SendKeys("^C")
019
020 End Sub

19-56
第 19 章 My 物件

021 End Class

13 行的「btnCopy_Click」副程式,於「複製」按鈕按下的時候執行,其中
的 16 與 17 行將駐點移至文字輸入區域控制項,然後全選其中的文字內容,
18 行則傳送 Ctrl+C,進行複製的動作。

當使用者按一下儲存至記事本按鈕,第 3 行的「btnToNotePad_Click」副程
式被執行,此時 Shell()啟動記事本應用程式,第 7 行傳送 Ctrl+V 按鍵,將
文字內容貼至記事本,最後,第 8 以及第 9 行傳送 Alt+F 以及 Alt+S,開啟
記事本的另存新檔視窗。

19.9 存取網路
My 物件在網路這一部份,亦提供了相關的支援,例如檔案的上傳與下載等
等,相關的方法由 My.Computer.Network 物件所定義,底下列舉此物件的
相關成員:

屬性 描述
IsAvailable 指出是否可以使用網路。
方法 描述
DownloadFile 從遠端位置下載檔案。
Ping Ping 遠端機器。
UploadFile 上載檔案至遠端位置。
事件 描述
NetworkAvailabilityChanged 事件 指出網路連線的狀態何時會變更。

屬性 IsAvailable 回傳 Boolean 型態的結果值,其定義如下:

19-57
Public ReadOnly Property IsAvailable As Boolean

這個屬性回傳值的意義,代表目前電腦是否連線至網路,是的話回傳 True,
否則回傳 False, 例如底下的程式碼片段:

001 Dim isa As Boolean = My.Computer.Network.IsAvailable


002 If isa = True Then
003 MessageBox.Show("目前網路連線正常!!")
004 Else
005 MessageBox.Show("目前網路無法連線!!")
006 End If

這 段 程 式 碼 的 第 一 行 取 得 IsAvailable 屬 性 回 傳 的 結 果 , 並 且 將 其 儲 存 至
Boolean 變數 isa,第 2~6 行檢視變數 isa 內容,分別輸出相關的訊息,你可
以在本章的範例資料夾 slnMyNetwork 當中,找到相關的程式碼。

接下來,我們繼續來看看 My.Computer.Network 物件的方法成員,它提供


的方法有三種,如列表所示,DownloadFile 與 UploadFile 分別允許你從網
路執行檔案上傳與下載檔案的相關作業,另外一個方法 Ping,則是用來測
試遠端電腦主機是否依然可連線使用。

以下緊接著列出 DownloadFile()與定義:

Public Sub DownloadFile( _


ByVal address As String, _
ByVal destinationFileName As String _
)

這個方法從指定的網路位址 address,下載特定檔案,並且以指定的檔案路
徑與檔案名稱 destinationFileName 作儲存,以底下的程式片段為例:

My.Computer.Network.DownloadFile( _
"http://www.javanet.tw/index.php", _
"C:\javanet.txt")

這段程式碼將指定網址的網頁內容,下載至使用者本機電腦上的根目錄 C,
並且將其儲存成名稱為「javanet.txt」的文字檔案。

19-58
第 19 章 My 物件

UploadFile() 方 法 的 定 義 與 DownloadFile() 類 似 , 列 舉 如 下 , 其 中 的
sourceFileName 為所要上傳的檔案,address 則是所要上傳的位址:

Public Sub UploadFile( _


ByVal sourceFileName As String, _
ByVal address As String _
)

除了上述的方法,DownloadFile 與 UploadFile 還有其他不同的版本,這些


版本接受各種型態的參數,你可以進一步設定其他參數,調整這個方法的執
行方式,底下是另外一個普遍被使用的版本:

Public Sub DownloadFile( _


ByVal address As String, _
ByVal destinationFileName As String, _
ByVal userName As String, _
ByVal password As String, _
ByVal showUI As Boolean, _
ByVal connectionTimeout As Integer, _
ByVal overwrite As Boolean _
)

如果你要下載的檔案來源必須提供密碼與帳號,可以使用這個版本的方法,
userName 與 password,接受所要提供的密碼與帳號資訊,showUI 如果指
定為 True,則會在下載程序進行的時候,顯示進度狀態,connectionTimeout
讓你設定逾時時間,overwrite 則是指定是否覆寫目前的檔案,如果存在的
話。

以上的參數都很容易理解,我們繼續來看看 UploadFile()方法的另外一個版
本,這個方法的定義如下:

Public Sub UploadFile( _


ByVal sourceFileName As String, _
ByVal address As String, _
ByVal userName As String, _
ByVal password As String, _
ByVal showUI As Boolean, _
ByVal connectionTimeout As Integer _

19-59
)

參數內容與上述的 DownloadFile()相同,這裏就不再說明,緊接著,我們利
用一個範例,進行相關方法的應用說明。

專案 slnMyNetwork

這個範例引用上述所討論的方法 DownloadFile()以及 UploadFile(),實作檔案


的上傳與下載功能,執行畫面如下圖,於其中指定所要下載的網頁或是網路
資源位址,檔案的儲存位置,按一下「下載」按鈕,即可完成相下載動作,
至於檔案的上傳原理相同,讀者可以自行嘗試看看。

FormMyNetwork.vb
001 Public Class btnIsAvailable
002
003 Private Function chkNetAva() As Boolean
004
005 Dim isa As Boolean = My.Computer.Network.IsAvailable
006 Return isa
007
008 End Function
009
010 Private Sub btnFolder_Click(ByVal sender As System.Object, _
011 ByVal e As System.EventArgs) Handles btnFolder.Click

19-60
第 19 章 My 物件

012
013 If FBDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
014 txtFile.Text = FBDialog.SelectedPath
015 End If
016
017 End Sub
018
019 Private Sub btnDownloadAddress_Click(ByVal sender As System.Object, _
020 ByVal e As System.EventArgs) Handles btnDownloadAddress.Click
021
022 If chkNetAva() = False Then
023 MessageBox.Show("網路連線不正常 !!")
024 Return
025 End If
026
027 Dim strAddress As String
028 strAddress = txtaddress.Text
029 My.Computer.Network.DownloadFile( _
030 strAddress, txtFile.Text, "", "", True, 500, False)
031 MessageBox.Show("done")
032
033 End Sub
034
035 Private Sub btnFile_Click(ByVal sender As System.Object, _
036 ByVal e As System.EventArgs) Handles btnFile.Click
037 If OFDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
038 txtSFile.Text = OFDialog.FileName
039 End If
040 End Sub
041
042 Private Sub btnUploadAddress_Click(ByVal sender As System.Object, _
043 ByVal e As System.EventArgs) Handles btnUploadAddress.Click
044
045 If chkNetAva() = False Then
046 MessageBox.Show("網路連線不正常 !! ")
047 Return
048 End If
049 My.Computer.Network.UploadFile( _
050 txtSFile.Text, txtuAddress.Text, "javanet", "4a1cae78")
051 MessageBox.Show("done")
052
053 End Sub
054 End Class

19-61
這個範例的程式碼內容主要由「上傳」與「下載」兩個按鈕的 Click 事件處
理程序所組成,19 行的「btnDownloadAddress_Click」,於使用者按下「下
載」按鈕的時候執行,29~30 行引用 DownloadFile()下載指定位置的資源檔
案。

42 行的「btnUploadAddress_Click」
,於使用者按下「上傳」按鈕的時候執行,
49~50 行引用 UploadFile(),將檔案上傳至指定的位置。

My.Computer.Network 物件另外一個重要的方法便是 Ping(),它可以用來判


斷是否目前的網路上的主機或是特定 IP 的連線狀態,此方法最簡單的版本
如下:

Public Function Ping( _


ByVal hostNameOrAddress As String _
) As Boolean

其中的 hostNameOrAddress 為所要 Ping 的 URL、電腦名稱或 IP 編號,這個


字串參數也能夠以一個封裝相關資訊的 Uri 類別作表示。

另外一個版本允許你設定聯繫目的端的時間臨界值,定義如下,其中的
timeout 則為所要設定的毫秒數:

Public Function Ping( _


ByVal hostNameOrAddress As String, _
ByVal timeout As Integer _
) As Boolean

底下的程式碼片段,可以讓你 Ping 目前自已所使用的電腦主機連線:

My.Computer.Network.Ping("127.0.0.1")

接下來是一個小範例,說明方法 Ping()的應用。

專案 slnMyNetworkPing

這個範例提供一個文字方塊,讓使用者輸入所要 Ping 的網路位址,並且在

19-62
第 19 章 My 物件

使用者按下按鈕的時候,回傳是否 Ping 成功的訊息:

FormPing.vb
001 Public Class FormPing
002
003 Private Sub btnPing_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnPing.Click
005
006 Dim blnPing As Boolean = My.Computer.Network.Ping(txturl.Text)
007 If blnPing Then
008 MessageBox.Show("Ping " + txturl.Text + " 成功 !!")
009 Else
010 MessageBox.Show("Ping " + txturl.Text + " 失敗 !!")
011 End If
012 End Sub
013 End Class

第 3 行定義一個副程式「btnPing_Click()」用來回應使用者按下 Ping 按鈕的


Click 事件,其中第 6 行取得 Ping 的結果,然後第 7 行根據結果決定所要顯
示的訊息。

19-63
19.10 檔案目錄的存取
儘管.NET IO 類別庫對於對於檔案目錄的存取,提供了相當完整的支援,
My 物件還是將相關的功能納入其中,如果你覺得使用 IO 命空間裏的類別
進行檔案系統操作是種繁雜的工作,可以利用 My.Computer.FileSystem 物
件達到相同的目的。

My.Computer.FileSystem 提供了相當多的方法成員,在我們進一步討論相關
的實作之前,先來看看這個物件所提供的屬性成員,這些成員可以讓你直接
取得與目錄有關的特定資訊,後文則針對方法成員進行專文探討。

19.10.1 My.Computer.FileSystem 屬性

FileSystem 物件的屬性只有三個,分別是 CurrentDirectory、Drives 以及


SpecialDirectories,其中的 CurrentDirectory 用來取得目前所在位置的目
錄、Drives 用來取得電腦磁碟機的相關資訊,而 SpecialDirectories 代表電
腦上的特定目錄,例如 MyDocuments、Tmp,甚至桌面路徑 Desktop 等等。

前兩個屬性 CurrentDirectory 與 Drives 非常單純,直接引用取得所需的資


訊 即 可 , SpecialDirectories 這 個屬 性 回 傳 一 個 My.Computer.FileSystem.-
SpecialDirectories 物件,透過這個物件所提供的屬性,你可以直接存取各種
特定的電腦資料目錄,相關的屬或列舉如下:

屬性成員 說明
AllUsersApplicationData 唯讀 String,代表指向 [All Users/Application Data]
目錄的路徑名稱。
CurrentUserApplicationData 唯讀 String,代表指向目前使用者之 [Application
Data] 目錄的路徑名稱。
Desktop 唯讀 String,代表指向使用者之 [桌面] 目錄的路徑
名稱。
MyDocuments 唯讀 String,代表指向使用者之 [MyDocuments] 目

19-64
第 19 章 My 物件

錄的路徑名稱。
MyMusic 唯讀 String,代表指向使用者之 [MyMusic] 目錄的
路徑名稱。
MyPictures 唯讀 String,代表指向使用者之 [MyPictures] 目錄的
路徑名稱。
唯讀 String,代表指向使用者之 [程式集] 目錄的路
ProgramFiles 徑名稱。

Temp 唯讀 String,代表指向使用者之 [Temp] 目錄的路徑


名稱。

如你所見,這些屬性均與特定的目錄有關,它們回傳這些對應目錄的路徑名
稱,底下利用一個範例,說明如何使用上述的相關成員,存取檔案系統目錄。

專案 slnMyFilePro

這個範例很簡單,逐一引用上表所列舉的屬性,顯示各種特定的係統路徑,
按一下畫面下方的「顯示路徑」按鈕,結果畫面如下:

FormMyFilePro.vb
001 Public Class FormMyFilePro
002
003 Private Sub btnPath_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnPath.Click
005 Dim strPath As String
006 strPath = "[All Users/Application Data]目錄:" + _
007 My.Computer.FileSystem.SpecialDirectories.

19-65
008 AllUsersApplicationData + vbCrLf
009 strPath += "目前使用者之[Application Data]目錄:" + _
010 My.Computer.FileSystem.SpecialDirectories.
011 CurrentUserApplicationData + vbCrLf
012 strPath += " [桌面] 目錄:" + _
013 My.Computer.FileSystem.SpecialDirectories.Desktop + vbCrLf
014 strPath += "我的文件夾:" + _
015 My.Computer.FileSystem.SpecialDirectories.MyDocuments
+ vbCrLf
016 strPath += "[MyMusic] 目錄:" + _
017 My.Computer.FileSystem.SpecialDirectories.MyMusic + vbCrLf
018 strPath += "[MyPictures] 目錄:" + _
019 My.Computer.FileSystem.SpecialDirectories.MyPictures +
vbCrLf
020 strPath += "[程式集] 目錄:" + _
021 My.Computer.FileSystem.SpecialDirectories.ProgramFiles +
vbCrLf
022 strPath += "[Temp] 目錄:" + _
023 My.Computer.FileSystem.SpecialDirectories.Temp + vbCrLf
024
025 txtPath.Text = strPath
026 End Sub
027 End Class

第 3 行開始的「btnPath_Click」
,是畫面唯一的按鈕 Click 事件處理程序,其
中連續引用相關的屬性,存取特定檔案目錄的路徑。

19.10.2 My.Computer.FileSystem 方法成員

My.Computer.FileSystem 所提供的方法成員相當多,大致可以分為目錄系統
操作、檔案的操作與讀寫等等,下表分類列舉說明:

方法 說明
路徑 CombinePath 將格式正確的組合路徑當成 String 傳回。
GetParentPath 傳回 String,表示所提供路徑之父代 (Parent)
的絕對路徑。
目錄作業 GetDirectories 傳回 String 集合,表示目錄內之子目錄的路徑
名稱

19-66
第 19 章 My 物件

方法 說明
DirectoryExists 傳回 Boolean,指出目錄是否存在。
CopyDirectory 複製目錄。
CreateDirectory 建立目錄。
DeleteDirectory 刪除目錄。
MoveDirectory 移動目錄。
RenameDirectory 重新命名目錄。
GetDirectoryInfo 傳回指定之路徑的 DirectoryInfo 物件。
GetDriveInfo 傳回指定之路徑的 DriveInfo 物件。
檔案作業 CopyFile 複製檔案。
DeleteFile 刪除檔案。
MoveFile 移動檔案。
RenameFile 重新命名檔案。
FileExists 傳回 Boolean,指出檔案是否存在。
FindInFiles 傳回唯讀的字串集合,表示包含指定的文字之檔
案名稱。
GetFileInfo 傳回指定之路徑的 FileInfo 物件。
GetFiles 傳回唯讀的 String 集合,表示目錄內的檔案名
稱。
檔案讀寫 OpenTextFieldParser 開啟 TextFieldParser。
OpenTextFileReader 開啟 TextReader。
OpenTextFileWriter 開啟 TextWriter。
ReadAllBytes 從二進位檔案 (Binary File) 讀取。
ReadAllText 從文字檔讀取。
WriteAllBytes 寫入二進位檔案。
WriteAllText 寫入文字檔。

上表依方法的功能分成目錄作業、檔案作業以及檔案讀寫等三個部份,由於
我們已經有 IO 類別的相關學習經驗了,因此這些方法的使用對於讀者而
言,應該很容易可以理解,無論如何,My 物件著重在便利性,可以讓你更
快速的完成某些功能,我們接下來看看相關的用法。

19-67
19.10.3 操作目錄

目錄作業包括了目錄的增刪改等等,同時還包含了用來回傳對應的
DirectoryInfo 與 DriveInfo 等 IO 命名空間裏面的相關類別物件。

CombinePath()與 GetParentPath()是兩個與路徑有關的方法成員,直接引用
就可以取得相關的路徑名稱字串,例如底下的程式碼片段:

Dim value As String =


My.Computer.FileSystem.CombinePath(baseDirectory ,relativePath)

其中引用 CombinePath(),將指定的參數 baseDirectory 與 relativePath 合併


成為一個完整的路徑字串。

底下是引用 GetParentPath()的程式碼,其中回傳指定路徑 path 的上層目


錄,也就是父路徑的完整路徑名稱。

Dim value As String = My.Computer.FileSystem.GetParentPath(path)

與路徑有關的方法另外還有一個 GetDirectories(),這個方法用來取得指定
目錄內,子目錄路徑名稱的字串集合,它甚至可以讓你設定過濾所要取得的
目錄名稱樣式,以下為其定義:

Public Function GetDirectories( _


ByVal directory As String, _
ByVal searchType As SearchOption, _
ByVal wildcards As String() _
) As System.Collections.ObjectModel.ReadOnlyCollection(Of String)

Directory 為指定的目錄,searchType 是一種 SearchOption 列舉型別,指定


是否包含子資料夾,預設值為 SearchOption.SearchTopLevelOnly,其他可
能的值還有 SearchTopLevelOnly,表示只搜尋指定目錄且排除子目錄,最
後一個參數值 searchType 為樣式名稱。

操作目錄之前,經常需要檢核指定目錄是否存在,DirectoryExists() 這個方

19-68
第 19 章 My 物件

法可以讓我們達到這個目的,其中所輸入的參數 pathString 為所要檢核的路


徑表示字串。

My.Computer.FileSystem.DirectoryExists(pathString)

這個方法回傳的結果是一個 True 或是 Flase 的布林值,True 表示 pathString


所代表的路徑存在,False 則為否。

以下利用一個範例說明上述方法成員的相關應用。

專案 slnMyDir

按一下「…」按鈕,選擇所要檢視的目錄,然後再按一下畫面下方的「檢視
目錄」按鈕,顯示檢視結果。

FormMyDir.vb
001 Public Class FormMyDir
002
003 Private Sub btnPath_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnPath.Click
005
006 If FBDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
007 txtPath.Text = FBDialog.SelectedPath
008 End If
009
010 End Sub

19-69
011
012 Private Sub btnSPath_Click(ByVal sender As System.Object, _
013 ByVal e As System.EventArgs) Handles btnSPath.Click
014 Dim strDirMessage As String = ""
015 strDirMessage = "指定的目錄是否存在:" + _
016 My.Computer.FileSystem.DirectoryExists
(txtPath.Text).ToString + _
017 vbCrLf
018 strDirMessage += "上層目錄:" + _
019 My.Computer.FileSystem.GetParentPath
(txtPath.Text).ToString + _
020 vbCrLf
021
022 strDirMessage += "子目錄清單:" + vbCrLf
023
024 For Each strDir As String In _
025 My.Computer.FileSystem.GetDirectories(txtPath.Text)
026 strDirMessage += strDir + vbCrLf
027 Next
028
029 txtContent.Text = strDirMessage
030 End Sub
031
032 End Class

12 行的「btnSPath_Click」為畫面上「檢視目錄」按鈕的事件處理程序,其
中的 16 行引用 DirectoryExists(),檢視使用者指定的目錄是否存在,19 行
引用 GetParentPath()取得上層目錄的名稱,24~27 行的迴圈,一一取出指定
目錄底下的子目錄,最後這個範例將上述取得的相關資訊,輸出於畫面上。

當確定目錄存在之後,就可以針對目錄進行增、刪、移動以及重新命名的操
作,對應的方法分別是 CreateDirectory、DeleteDirectory、MoveDirectory
以及 RenameDirectory。

CreateDirectory 用 來 建 立 一 個 指 定 的 目 錄 , 例 如 底 下 的 程 式 碼 , 其 中 的
directory 為所要建立的目錄。

My.Computer.FileSystem.CreateDirectory(directory)

19-70
第 19 章 My 物件

DeleteDirectory 刪除指定的目錄,它有幾個多載的版本,其中一個主要的版
本定義如下:

Public Sub DeleteDirectory( _


ByVal directory As String, _
ByVal showUI As UIOption, _
ByVal recycle As RecycleOption _
)

參數 directory 代表要刪除的目錄,showUI 是一個 UIOption 列舉值,可以


讓你指定執行相關作業時,所要顯示的視覺化進度設定,可能的值為
UIOption.OnlyErrorDialogs 與 UIOption.AllDialogs 兩者,前者指定顯示錯
誤對話方塊並隱藏進度對話方塊,後者則是顯示進度對話方塊和任何錯誤對
話方塊。

recycle 參數是一個 RecycleOption 列舉,指定 DeletePermanently 表示永久


刪除檔案或目錄,此為預設值,SendToRecycleBin 則表要將檔案或目錄傳
送至資源回收筒。

刪除作業 DeleteDirectory 還有以下這個版本:

Public Sub DeleteDirectory( _


ByVal directory As String, _
ByVal showUI As UIOption, _
ByVal recycle As RecycleOption, _
ByVal onUserCancel As UICancelOption _
)

其中最後一個參數 onUserCancel 讓你指定當使用者按一下的時候,是否要


擲 出 例 外 , 它 是 UICancelOption 列 舉 型 別 , 可 能 的 值 有 DoNothing 與
ThrowException 。

你也可以使用以下這個版本,控制目錄刪除行為:

Public Sub DeleteDirectory( _


ByVal directory As String, _
ByVal onDirectoryNotEmpty As DeleteDirectoryOption _

19-71
)

第二個參數 onDirectoryNotEmpty 是一個 DeleteDirectoryOption 列舉型


別,列舉值 DeleteAllContents 表示這個動作會刪除目錄的所有內容,如果
你只允許刪除空目錄,可以透過指定 ThrowIfDirectoryNonEmpty 這個列舉
值來達到所要的目的,一旦目錄不是空的則會擲出例外 IOException。

移動目錄的行為比較複雜,必須考慮來源與目的路徑名稱,MoveDirectory
用來執行這個動作,定義如下:

Public Sub MoveDirectory( _


ByVal sourceDirectoryName As String, _
ByVal destinationDirectoryName As String _
)

sourceDirectoryName 為所要移動的來源目錄路徑,destinationDirectoryName
則是目標路徑。

當然你還有其他幾個版本可用,包含指定是否覆寫已經存在的目錄,或是顯
示進度畫面等等:

Public Sub MoveDirectory( _


ByVal sourceDirectoryName As String, _
ByVal destinationDirectoryName As String, _
ByVal overwrite As Boolean _
)
Public Sub MoveDirectory( _
ByVal sourceDirectoryName As String, _
ByVal destinationDirectoryName As String, _
ByVal showUI As UIOption _
)

除了上述的成員,還有一個 CopyDirectory(),用來建立一個指定目錄的複本,
這個方法與移動目錄非常類似,相關的版本內容亦相同,這裏就不再說明。

將一個目錄重新命名,可以引用 RenameDirectory()方法,以下的程式碼為
RenameDirectory()方法的用法,指定一個作為新名稱的字串參數進行引用

19-72
第 19 章 My 物件

即可。

My.Computer.FileSystem.RenameDirectory(directory ,newName)

如你所見,My.Computer.FileSystem 物件當中,牽涉到目錄操作的方法成
員,與 Dircetory 類別所定義的共用成員非常類似,讀者可以自行嘗試運用,
這裏就不再說明。

結 束 這 個 小 節 之 前 , 還 有 兩 個 方 法 我 們 沒 有 談 , GetDirectoryInfo() 與
GetDriveInfo() , 這 兩 個 方 法 可 以 讓 你 取 得 相 關 的 GetDriveInfo 與
GetDriveInfo 物件,相關物件在本書探討目錄操作的章節裏面,已經有了非
常完整的說明,這裏就不再重複討論。

19.10.4 檔案讀寫

My.Computer.FileSystem 物件支援以二進位或是文字格式的方式對檔案進
行讀寫,讀取檔案的方法有 ReadAllBytes 與 ReadAllText,寫入檔案的相關
方法則是 WriteAllBytes 與 WriteAllText。

ReadAllBytes()讀取指定檔案的內容,並且以位元組的型態回傳所讀取的資
料內容,例如底下的程式碼,其中 file 為所要讀取的檔案:

Dim value As Byte() = My.Computer.FileSystem.ReadAllBytes(file)

ReadAllText()同 樣提供讀 取檔案 的功 能,所 不同 的是, 這個 方法回 傳的 內


容,是以 String 格式為主的字串資料,以下為方法引用的相關程式碼:

Dim value As String = My.Computer.FileSystem.ReadAllText(file)


Dim value As String = My.Computer.FileSystem.ReadAllText(file ,encoding)

其中第二個方法的參數 encoding,代表它同時可以讓你指定讀取檔案時所使
用的編碼方式,預設值是 UTF-8。

ReadAllBytes()與 ReadAllText()這 兩 個 方 法 都 可 以 用 來 讀 取 檔 案 的 內 容 資

19-73
料,如上述說明的,它們之間的差異,只在讀取格式的分別,對於非文字格
式的檔案,例如一個 jpg 圖檔,以位元組的方式進行讀取非常的有用。

WriteAllBytes()將指定的位元組資料寫入檔案之中,例如以下的程式碼:

My.Computer.FileSystem.WriteAllBytes(file ,data ,append)

其中的 file 為寫入的檔案目的,data 則是想要寫入的位元組資料內容,append


是布林值,表示寫入的位元組資料要附加於原始檔案、或是直接覆蓋原有的
內容。

引用 WriteAllText()方法寫入檔案的資料為字串型態的資料,由於是文字格
式,因此它的另外一個多載版本同時可以讓你指定所要使用的編碼格式,如
下式:

My.Computer.FileSystem.WriteAllText(file ,text ,append)


My.Computer.FileSystem.WriteAllText(file ,text ,append ,encoding)

透過 My 物件,檔案的讀寫變得非常容易,這裏我們透過一個範例說明相關
的實際運用。

專案 slnMyFileSystem

執行畫面上方為檔案選取文字方塊,按一下右邊的「…」按鈕,選取所要讀
取的檔案,點選右邊資料讀寫所要使用的格式,按一下讀取,將檔案內容,
顯示在畫面上。

於畫面下方選擇資料夾,同時指定所要寫入的檔案名稱,按一下寫入按鈕,
將畫面上的資料寫入指定的檔案裏面。

19-74
第 19 章 My 物件

FormReadWriteFile.vb
001 Public Class FormReadWriteFile
002
003 Private Sub btnSourcePath_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnSourcePath.Click
005 If (OFDialog.ShowDialog = Windows.Forms.DialogResult.OK) Then
006 txtSource.Text = OFDialog.FileName
007 End If
008
009 End Sub
010
011 Private Sub btnTargetPath_Click(ByVal sender As System.Object,
012 ByVal e As System.EventArgs) Handles btnTargetPath.Click
013
014 If FBDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
015
016 txtTarget.Text = FBDialog.SelectedPath
017 End If
018
019 End Sub
020
021 Private Sub btnWrite_Click(ByVal sender As System.Object,
022 ByVal e As System.EventArgs) Handles btnWrite.Click
023
024 Dim strPath As String
025 Dim wrtebyte(7200) As Byte
026 Dim strContent As String
027
028 If (txtTarget.Text.Length > 0 And txtFile.Text.Length > 0) Then
029 strPath = txtTarget.Text + "\" + txtFile.Text

19-75
030 If (txtSourceContent.Text.Length > 0) Then
031
032 If (rbByte.Checked = True) Then
033 wrtebyte = System.Text.Encoding.Default.GetBytes(
034 txtSourceContent.Text)
035 My.Computer.FileSystem.WriteAllBytes(strPath,
036 wrtebyte, True)
037 Else
038 strContent = txtSourceContent.Text
039 My.Computer.FileSystem.WriteAllText(
040 strPath, strContent, True)
041 End If
042 End If
043
044 Else
045 MessageBox.Show("沒有指定寫入檔案…")
046 End If
047
048 End Sub
049
050 Private Sub btnRead_Click(ByVal sender As System.Object,
051 ByVal e As System.EventArgs) Handles btnRead.Click
052 Dim strPath As String
053 Dim strContent As String
054 Dim byteContent(7200) As Byte
055
056 If (txtSource.Text.Length > 0) Then
057
058 strPath = txtSource.Text
059
060 If (rbByte.Checked = True) Then
061 byteContent = My.Computer.FileSystem.ReadAllBytes
(strPath)
062 strContent =
063 System.Text.Encoding.Default.GetString(byteContent)
064 Else
065 strContent =
066 My.Computer.FileSystem.ReadAllText(
067 strPath, System.Text.Encoding.Default)
068 End If
069
070 txtSourceContent.Text = strContent
071

19-76
第 19 章 My 物件

072 Else
073 MessageBox.Show("沒有指定讀取檔案…")
074 End If
075
076 End Sub
077 End Class

這 個 範 例 運 用 了 此 節 所 討 論 的 四 個 方 法 , 進 行 資 料 的 讀 寫 作 業 , 50 行 的
tnRead_Click,於使用者按下讀取按鈕的時候,根據使用者所選擇的格式,
將所讀取的檔案內容,顯示在畫面上的文字方塊。

21 行的 btnWrite_Click()方法,於使用者按下寫入按鈕的時候,將顯示在文
字方塊的內容,再一次寫入另外一個指定的檔案裏面。

這個範例分別引用了上述四個不同的方法,進行檔案的讀寫作業,你可以發
現使用 My 物件相較於一般的資料流要來得方便且輕鬆許多。

19.11 My.Forms
這一節我們繼續討論一個便利的物件 My.Forms,它代表一個專案之中所有
的表單物件集合,因此我們可以透過它直接存取專案中所存在的表單物件,
假設你在專案中建立了三個表單,Form1、Form2 以及 Form3,直接這三個
表單所需的程式碼如下:

My.Forms.Form1
My.Forms.Form2
My.Forms.Form3

當你引用 My.Forms 存取各表單物件的實體之後,就可以進一步針對特定的


表單進行存取操作,底下利用一個範例說明實際的應用。

19-77
專案 slnMyForms

我們在這個專案建立了三個表單,分別是 myForms、Form1 以及 Form2,


其中 myForms 為專案啟動時所執行的主要表單,這個表單上面有一個按鈕
以及文字方塊,如下圖:

於其中的文字方塊輸入作為標題的文字,選擇所要啟動的表單,當使用者按一
下「啟動其他表單」按鈕的時候,應用程式會根據使用者的選擇,啟動指定的
表單,並且將文字欄位的內容作為其標題,以下為上述畫面的執行結果:

myForms.vb
001 Public Class myForms
002
003 Private Sub btnmyForm_Click(ByVal sender As System.Object,
004 ByVal e As System.EventArgs) Handles btnmyForm.Click
005
006 If (rbForm1.Checked) = True Then
007 My.Forms.Form1.Text = txtTitle.Text
008 My.Forms.Form1.Show()
009
010 Else
011 My.Forms.Form2.Text = txtTitle.Text
012 My.Forms.Form2.Show()
013
014 End If

19-78
第 19 章 My 物件

015
016 End Sub
017 End Class

第 3 行定義的「btnmyForm_Click」副程式回應使用者按下「啟動其他表單」
按鈕的 Click 事件,第 6 行開始的 if 判斷式,檢視使用者所選擇的選項按鈕,
並且設定其標題屬性,然後隨即將其啟動。

如你所見,My.Forms 用來存取表單物件非常的方便,由於它回傳的是代表
表單本身的物件,因此你可以直接對其進行操作,就如同直接建立的表單物
件實體。

19.12 My.User
My.User 物件公開了一組相關的屬性與方法成員,這些成員提供目前使用者
相關資訊的存取作業,屬性 Name 是其中最簡單的屬性成員,它最主要的用
途便是回傳目前使用者的名稱與網域等相關資訊,其定義如下:

Public ReadOnly Property Name As String

這是一個唯讀屬性,其回傳值是一個 String 型態的字串參數,透過這個回傳


值,我們可以取得目前應用程式使用者與其所屬網域名稱,底下的範例說明
相關的用途。

專案 slnMyUser

在執行畫面當中按一下「使用者資訊」,其中顯示目前使用者的名稱,同時
回傳所在網域名稱等相關資訊。

19-79
FormMyUser.vb
001 Public Class FormMyUser
002
003 Private Sub btnUser_Click(ByVal sender As System.Object, _
004 ByVal e As System.EventArgs) Handles btnUser.Click
005
006 Dim str() As String
007
008 str = Split(My.User.Name, "\")
009 txtComputer.Text = str(0)
010 txtUser.Text = str(1)
011
012 End Sub
013 End Class

第 3 行的「btnUser_Click」為使用者按下「使用者資訊」按鈕的時候所執行
的程序,其回傳字串格式如下:

Domain\name

其中以「\」分隔,因此第 8 行透過一個分隔符號「\」
,取得此分隔字串陣列,
第 9 行與第 10 行分別取出其中的內容,顯示在畫面上。

My.User 物件另外還提供用來設定與存取驗證的方法成員,此一部份已經超
出本書所要討論的範圍,這裏就不再說明。

19.13 My 物件與專案類型相依性
本章針對 My 物件進行了詳細的說明,如果你查詢線上手冊的時候,會發現
還有其他 My 物件是本章內容所沒有涵蓋的,而這些物件大部份是針對 Web
應用程式的開發而設計,除此之外,對於.NET 其他型態的應用程式,My 物

19-80
第 19 章 My 物件

件的適用性亦不相同,因此,你必須了解所要使用的 My 物件,是否支援所
開發的應用程式類型才能順利的運用。

在.NET 平台上,你可以開發各種類型的應用程式,這些類型的應用程式以
專案的型式公開,其中包含了「Windows 應用程式」
、「主控台應用程式」以
及「網站應用程式」等等,在 MSDN 的文件當中,附了以下列表,你可以
針對需要的物件進行查詢,底下為此列表圖示:

其中的編號代表在不同型態的應用程式當中,相關物件的版本說明,某些
My 物件,例如 My.Application,會針對不同的應用程式提供不同的版本,
其中 My.Application 物件有三個版本、My.Computer 物件有兩個版本,而
My.User 物件也有兩個版本,下表列舉這些版本與上表當中編號的關聯:

編號 物件 版本說明 描述
1 My.Application Windows Form 從主控台版本中衍生 (請參閱第 3 點)、
加入會與應用程式視窗互動的支援,並提
供 Visual Basic 應用程式模型。
2 My.Application 程式庫版本 提供應用程式所需的基本功能:提供寫入
應用程式記錄檔和存取應用程式資訊的
成員。

19-81
3 My.Application 主控台版本 從程式庫版本中衍生 (請參閱第 2 點),
並加入存取應用程式之命令列引數的其
他成員,以及 ClickOnce 部署資訊。
4 My.Computer Windows Form 從伺服器版本中衍生 (請參閱第 5 點),
並提供對在用戶端機器上有用物件的存
取,如鍵盤、螢幕和滑鼠。
5 My.Computer 伺服器版本。 提供有關電腦的基本資訊,如名稱、存取
系統時鐘等。
6 My.User Windows 版 此物件會與執行緒的目前識別 (Identity)
本。 相關。
7 My.User Web 版本。 此物件會與應用程式之目前 HTTP 要求
的使用者身分相關。

如你所見,My 物件必須配合專案類型進行運用,本書針對「Windows 應用
程式」的泛用版本,進行了完整的說明,無論如何,詳細對所有的物件版本
進行討論,並非本書的主要目標,讀者有了相關的基礎之後,相信對於其他
物件的運用將不會有太大的問題。

19-82

You might also like