Professional Documents
Culture Documents
CH 19
CH 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 物件與專案類型相依性
My 功能的威力非常強大、而且容易使用,由於其內容牽涉了網路與檔案系
統 I/O,這一章的內容,我們將就 My 功能進行詳細的說明與討論,除了
My 物件的理論,進一步的,我們會同時看到相關的應用。
19.1 概觀
My 功能以物件的形式提供應用程式作存取,以下為其架構圖:
19-2
第 19 章 My 物件
My.Application.Culture.DisplayName.ToString
19-3
19.2 My.Application
My.Application 用來取得目前應用程式或是 DLL 元件等相關資訊,這些功
能以屬性或方法成員公開,直接引用屬性可以讓我們很方便的取得各種不同
型式的應用程式資訊,它們回傳了特定命名空間當中對應的類別,因此我們
可以進一步運用這些類別,取得所需的訊息。
19.2.1 ApplicationContext 屬性
ApplicationContext 成員,提供用來取得目前應用程式執行個體(執行緒)
的相關資訊,它的定義如下:
My.Application.ApplicationContext.MainForm.CompanyName
這段程式碼將回傳目前組件當中,設定的應用程式公司名稱資訊,除此之
外,由於 Form 物件定義了大量的公用屬性,你可以選擇引用任何一項屬性,
取得其他的相關資訊內容。
底下的範例,示範如何使用 Application,取得目前應用程式表單的相關資
訊內容。
19-4
第 19 章 My 物件
範例 slnApplicationContext
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
19.2.2 文化特性
My.Application 定 義 了 一 個 稱 為 Culture 的 屬 性 , 它 用 來 回 傳 一 個
CultureInfo 物件,這個物件用來管理應用程式當中的文字格式化設定。
My.Application.Culture.DisplayName
中文(台灣)
當然你可以隨意列舉其他相關的成員,取得所需的文化區域設定資訊,除此
之外,My.Application 物件另外亦提供了一個稱為 ChangeCulture 的方法,
這個方法讓你能夠輕易的更改所使用的文化特性,它的定義如下:
cultureName 為所要設定的文化特性名稱,例如美國(en-US)
、英國(en-GB)
或是中國大陸(zh-CN)等等,台灣的預設值為(zh-TW),以下的程式碼變
更目前的設定值為英國(en-GB):
19-6
第 19 章 My 物件
My.Application.ChangeCulture(en-GB)
專案 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 行分別引用各種
文化特性的屬性項目,取得文化特性的表示輸出。
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 所提供的方法,將
特定資訊寫入即時運算視窗,例如底下的程式片段:
19-12
第 19 章 My 物件
這段程式碼會在即時運算視窗輸出底下文字訊息:
Debug 類別輸出的即視運算視窗訊息 !!
應用程式開發的過程當中,即時運算視窗的功能非常有用,除了一般的偵錯
場合,即時運算視窗用來追蹤程式碼執行的情形亦相當常見。
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
19-14
第 19 章 My 物件
會 建 立 一 個 以 應 用 程 式 專 案 本 身 所 設 定 的 資 訊 , 公 司 名 稱
(CompanyName)、商品名稱(ProductName)與版本號碼(ProductVersion)
為階層作命名的資料夾,如下式:
CompanyName\ProductName\ProductVersion
CompanyName
ProductName
ProductVersion
19-15
C:\Documents and Settings\sean\Application Data\康廷數位工坊\My 物件範例
\1.0.0.0
重新執行一次程式,以文字編輯器開啟記錄檔,你會發現其中即時運算視窗
的訊息,同樣出現在記錄檔。
以上是在預設的情形下所進行的操作,無論如何,記錄檔的儲存位置是可更
改 的 , 如 果 你 無 法 找 到 目 前 記 錄 檔 的 儲 存 位 置 , 可 以 透 過
My.Application.Log 物件所提供的 DefaultFileLogWriter 屬性,直接引用其
FullLogFileName 屬性,就可以獲得目前儲存記錄檔的位置,以下的範例說
明相關的實作。
專案 slnTraceSource
我們在這個範例當中放了一個按鈕,當使用者按下的時候,畫面上會顯示記
錄檔儲存位置的路徑資訊,如下圖:
按此顯示資訊
19-16
第 19 章 My 物件
End Sub
End Class
除了記錄一般的行為,針對應用程式的例外情形,另外一個方法
WriteException()則被設計用來記錄應用程式的例外訊息,緊接著下一個小節
繼續討論相關的應用。
19.3.3 寫入例外訊息
現在我們來看看另外一個方法 WriteException(),這個方法適用處理例外狀
況的相關訊息,當例外發生的時候,它會將相關訊息寫入應用程式的記錄
檔,定義如下:
其中的 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
My.Application.Log 物件對於儲存與追蹤應用程式相關記錄非常的有用,你
可以利用這個物件配合檔案監視器,建立一個可用來監控系統執行的應用程
式,除此之外,你也可以利用其記錄異常狀況,簡化系統的維護工作。
19.4 My.Computer 物件
這一節我們繼續來看看 My 功能另外一個有用的物件 My.Computer,它提供
簡單的方法讓應用程式設計人員直接存取電腦的相關資源,例如滑鼠、鍵
盤、時鐘與音效,甚至登錄檔的內容。
19-19
列埠等等,在以往,相關的功能不是難以實作就是非常麻煩,在這裏只需要
幾個簡單的步驟就可以直接完成。
分類 屬性 描述
電腦資訊 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,這個屬性非常的單純,回傳目前使用者的電腦名稱,定義如
下:
MessageBox.Show(My.Computer.Name)
分類 屬性 說明
記憶體 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 物件
程式碼只有一個回應按鈕事件的副程式「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()的定義如下:
底下的程式碼利用 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"
緊接著,我們進一步來看看 SetValue()方法,此方法的定義如下:
其中第一個以及第二個參數意義同上述的 GetValue,為所要設定的機碼名
稱,而第三個 value 參數,則是所要寫入的值。
19-24
第 19 章 My 物件
SetValue()方法還有另外一個版本,這個版本的方法多了一個參數,用來指
定登錄機碼值的型態,定義如下:
值 描述
Binary 代表任何形式的二進位資料,等於 Win32 API 中的 REG_BINARY 登
錄資料型別。
Dword 代表 32 位元二進位數字,等於 Win32 API 中的 REG_DWORD 登錄資
料型別。
SetValue()方法非常容易使用,例如底下的程式碼,可以讓你更改桌面背景
圖片:
My.Computer.Registry.SetValue( _
19-25
"HKEY_CURRENT_USER\Control Panel\Desktop", _
"Wallpaper", _
"filepath")
第一個登錄機碼參數為桌面設定值的相關機碼,第二個參數則是所要修改的
項目,第三個則是用來置換的桌布圖檔位置路徑。
了解登錄檔的存取方法,現在我們利用一個範例,說明如何透過
My.Computer.Registry 物件,在應用程式當中存取登錄檔機碼。
專案 slnMyRegistry
執行此範例,按一下畫面上右邊的「預設印表機」按鈕,會顯示此預設印表
機的名稱:
在下方輸入指定的印表機名稱,按一下「修改預設印表機」,將會修改登錄
檔裏面的預設印表機。
如果再按一下「預設印表機」按鈕,畫面上會顯示已經調整過的預設印表機
19-26
第 19 章 My 物件
名稱。
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
19-27
其中引用 My.Computer.Registry 物件的 GetValue()方法,取得預設印表機的
機碼,13 行判斷其回傳值,若是回傳值是一個 Nothing 值,則表示指定的機
碼並不存在。
19.6.2 建立與刪除登錄機碼
針對一個現存的機碼進行調整現在對讀者來說已經不是問題,這一節我們進
一步來看看,如何在登錄檔的特定登錄區,建立或是刪除登錄機碼。
屬性 登錄區
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 為例,底下為其宣告:
19-28
第 19 章 My 物件
緊接著我們要繼續說明的是如何建立機碼,這個操作非常的簡單,首先確認
新的機碼要建立在那一個登錄區,例如 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 物件
最後要提醒讀者的是,隨意更改登錄檔很容造成系統嚴重的毀損,在進行相
關的設定之前,請務必確定已經完全了解所要設定的登錄檔機碼。
19.7 管理剪貼簿
剪貼簿是個非常普遍且實用的功能,儘管前一版的 Visual Basic.NET 已經可
以非常方便的使用,但是 My 功能依然導入了相關的實作,讓剪貼簿的應用
更為方便直接,相關的功能,封裝於 My.Computer.Clipboard 物件,你可以
直接使用這個物件,引用其方法成員,進行剪貼簿的管理作業。
19.7.1 關於 My.Computer.Clipboard 物件
格式 說明
Bitmap Windows 點陣圖格式。
Text 標準的 ANSI 文字格式
MetafilePict Windows 中繼檔格式
19-31
Rtf Rich Text 格式 (RTF) 資料構成的文字
My.Computer.Clipboard 物件提供讀寫各種資料格式的方法成員,只需要引
用這些成員,就可以直接將資料寫入剪貼簿或是從中取出。
資料管理的方法成員所能處理的相關格式資料與對應的方法列舉如下:
了解這些方法之後,接下來根據所要處理的資料格式與操作行為,引用合適
的方法便能夠輕易的為你的應用程式建立剪貼簿管理功能。
19.7.2 文字資料處理
剪貼簿就像一個容器,它可以儲存各種特定格式的資料,而管理剪貼簿的行
為不外乎清空、擷取、儲存與檢核其中所儲存的資料內容。
清空剪貼簿的資料是最簡單的操作,相關的方法成員為 Clear(),只要直接
19-32
第 19 章 My 物件
呼叫這個方法,就可以將其中的資料清空,語法如下:
My.Computer.Clipboard.Clear()
當這段程式碼執行的時候,會將剪貼簿當中所儲存的資料全部清空。
緊接著以文字資料(Text)為例進行相關說明,SetText()方法會將指定的文
字資料寫入剪貼簿,這個方法的宣告如下:
專案 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
除了單純的剪貼文字資料,利用底下的版本,你甚至可以指定所要寫入的文
字資料格式:
19-34
第 19 章 My 物件
TextDataFormat 代表所要處理的資料格式,它是一個列舉型別,你可以指
定其中的任何一個,如下表:
成員名稱 說明
CommaSeparatedValue 指定逗號分隔值(CSV)格式,試算表常用的一種交換格式。
Html 構成 HTML 資料的文字。
Rtf 由 Rich Text 格式(RTF)資料構成的文字。
Text 標準 ANSI 文字格式。
UnicodeText 標準 Windows Unicode 文字格式。
My.Computer.Clipboard.SetText(pasteText,
System.Windows.Forms.TextDataFormat.Rtf)
My.Computer.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Rtf)
一般的應用軟體,例如微軟的 Word,當使用者於其中進行資料編輯的時候,
底層透過專屬的格式資訊對資料進行格式處理,當你指定以 Text 格式剪貼
這些資料的時候,只有純文字的資料會被處理,若是指定為 Rtf 或是其他種
類的格式,我們就可以將其中的格式辨識資訊一併取出,進一步作編輯。
19-35
專案 slnMyClipFormat
這個範例只提供一個貼上 的按鈕,將目前剪貼簿的內容,貼到文字方塊上
面,並且提供三個選項,讓使用者在貼上資料的時候,指定所要套用的格式,
預設值為 Text 格式:
19-36
第 19 章 My 物件
Text 格式
19-37
選擇 Rtf
格式
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 物件
如你所見,格式設定的威力非常強大,你可以選擇特定的格式解析某些純文
字格式無法辨識的資料,特別是當你想要擷取特定格式資訊的相關內容時,
這種方式就特別的有用。
19.7.3 影像與音訊資料
除了文字,影像與音訊資料,同樣都可以儲存至剪貼簿當中,相關的操作由
GetAudioStream()、SetAudio()與 GetImage()、SetImage()這兩組方法提供
所需的功能,由於我們已經有了存取文字資料的經驗,因此現在直接來看看
方法的宣告內容。
影像資料的操作不並不困難,如你所見,以上述文字資料的觀念即可進行實
作,只是它所處理的資料必須是一個 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 格式進行存取,以下
為相關的存取方法:
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 物件
My.Computer.Clock 物件提供簡便的方法,用來存取系統時鐘,它提供了以
下三個屬性:
屬性 描述
GmtTime 包含目前電腦上本機日期和時間的 Date 物件(以 UTC (GMT) 時間表示)。
LocalTime 取得包含目前這部電腦上本機日期和時間的 Date 物件。
TickCount 取得電腦系統計時器的毫秒計數。
TickCount 則是取得計時器的毫秒計數,這個方法非常的好用,可以讓你用
來計算某段時間差的毫秒數,我們調整一下稍早的範例,顯示音訊檔播放的
時間長度。
專案 slnMyClipAudioTime
這個範例於其中加入了一個顯示播放秒數的標籤控制項,當選取的音訊檔播
放完畢之後,畫面中會出現所經過的時間長度。
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
播放音效的功能,上面的範例已經有相關的應用,現在我們仔細來看看播放
音效所使用的物件,My.Computer.Audio,這個物件提供播放音效所需的功
能,如果你只是需要簡單的播放功能,就如同上述範例所示範的,可以直接
引用這個物件。
My.Computer.Audio 提供三種方法,都與播放有關,列舉如下:
方法成員 說明
Play 播放 .wav 音效檔。
19-46
第 19 章 My 物件
PlaySystemSound 播放系統音效。
Stop 停止在背景播放音效。
從方法的名稱,你可以很容易理解其意義,我們來看看相關的細節,首先是
Play()方法定義如下:
Play()方法有四種不同的版本,前兩種版本讓你可以指定所要播放的音訊檔
路徑以進行播放,後兩種版本則是直接播放位元組或是資料流物件形式的音
訊檔。
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()
專案 slnMyAudioPlay
這裏擴充了上述的範例,同時直接指定音訊檔的路徑進行播放,畫面上出現了
三個選項,讓使用者可以選擇強制一次播放、於背景單次或是循環播放。
當使用者選擇背景或是循環播放的時候,可以隨時按下停止播放按鈕,結束
音訊播放。
FormPlay.vb
001 Public Class FormPlay
002
003 Private Sub btnSelect_Click(ByVal sender As System.Object,
19-48
第 19 章 My 物件
副程式「btnSelect_Click」當中,此次不再建立資料流物件,只是單純的將
使用者所選取的檔案路徑字串,顯示於畫面上的文字方塊。
19-49
23~30 行的 Select-Case,根據使用者所指定的選項,設定播放的模式參數,
最後 32 行以此模式呼叫 Play(),播放文字方塊裏所指定的音訊檔案。
結束這一個小節之前,最後我們還有一個方法要說明,PlaySystemSound(),
這個方法會播放指定的系統音效:
My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Exclamation)
讀者可以自已嘗試看看各種系統音效,這裏就不再多作說明。
19.8.3 滑鼠與鍵盤
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,這個方法可以讓你透過程式碼傳送特定的按
鍵,就如同使用者按下鍵盤的動作一樣,其定義如下:
不僅僅是單一的字母按鍵,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()的相關鍵盤設定與效果。
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 物件
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 事件 指出網路連線的狀態何時會變更。
19-57
Public ReadOnly Property IsAvailable As Boolean
這個屬性回傳值的意義,代表目前電腦是否連線至網路,是的話回傳 True,
否則回傳 False, 例如底下的程式碼片段:
這 段 程 式 碼 的 第 一 行 取 得 IsAvailable 屬 性 回 傳 的 結 果 , 並 且 將 其 儲 存 至
Boolean 變數 isa,第 2~6 行檢視變數 isa 內容,分別輸出相關的訊息,你可
以在本章的範例資料夾 slnMyNetwork 當中,找到相關的程式碼。
以下緊接著列出 DownloadFile()與定義:
這個方法從指定的網路位址 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 則是所要上傳的位址:
如果你要下載的檔案來源必須提供密碼與帳號,可以使用這個版本的方法,
userName 與 password,接受所要提供的密碼與帳號資訊,showUI 如果指
定為 True,則會在下載程序進行的時候,顯示進度狀態,connectionTimeout
讓你設定逾時時間,overwrite 則是指定是否覆寫目前的檔案,如果存在的
話。
以上的參數都很容易理解,我們繼續來看看 UploadFile()方法的另外一個版
本,這個方法的定義如下:
19-59
)
參數內容與上述的 DownloadFile()相同,這裏就不再說明,緊接著,我們利
用一個範例,進行相關方法的應用說明。
專案 slnMyNetwork
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(),將檔案上傳至指定的位置。
另外一個版本允許你設定聯繫目的端的時間臨界值,定義如下,其中的
timeout 則為所要設定的毫秒數:
My.Computer.Network.Ping("127.0.0.1")
接下來是一個小範例,說明方法 Ping()的應用。
專案 slnMyNetworkPing
19-62
第 19 章 My 物件
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
19-63
19.10 檔案目錄的存取
儘管.NET IO 類別庫對於對於檔案目錄的存取,提供了相當完整的支援,
My 物件還是將相關的功能納入其中,如果你覺得使用 IO 命空間裏的類別
進行檔案系統操作是種繁雜的工作,可以利用 My.Computer.FileSystem 物
件達到相同的目的。
My.Computer.FileSystem 提供了相當多的方法成員,在我們進一步討論相關
的實作之前,先來看看這個物件所提供的屬性成員,這些成員可以讓你直接
取得與目錄有關的特定資訊,後文則針對方法成員進行專文探討。
19.10.1 My.Computer.FileSystem 屬性
屬性成員 說明
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 徑名稱。
如你所見,這些屬性均與特定的目錄有關,它們回傳這些對應目錄的路徑名
稱,底下利用一個範例,說明如何使用上述的相關成員,存取檔案系統目錄。
專案 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 事件處理程序,其
中連續引用相關的屬性,存取特定檔案目錄的路徑。
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()是兩個與路徑有關的方法成員,直接引用
就可以取得相關的路徑名稱字串,例如底下的程式碼片段:
與路徑有關的方法另外還有一個 GetDirectories(),這個方法用來取得指定
目錄內,子目錄路徑名稱的字串集合,它甚至可以讓你設定過濾所要取得的
目錄名稱樣式,以下為其定義:
操作目錄之前,經常需要檢核指定目錄是否存在,DirectoryExists() 這個方
19-68
第 19 章 My 物件
My.Computer.FileSystem.DirectoryExists(pathString)
以下利用一個範例說明上述方法成員的相關應用。
專案 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 刪除指定的目錄,它有幾個多載的版本,其中一個主要的版
本定義如下:
你也可以使用以下這個版本,控制目錄刪除行為:
19-71
)
移動目錄的行為比較複雜,必須考慮來源與目的路徑名稱,MoveDirectory
用來執行這個動作,定義如下:
sourceDirectoryName 為所要移動的來源目錄路徑,destinationDirectoryName
則是目標路徑。
當然你還有其他幾個版本可用,包含指定是否覆寫已經存在的目錄,或是顯
示進度畫面等等:
除了上述的成員,還有一個 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 為所要讀取的檔案:
其中第二個方法的參數 encoding,代表它同時可以讓你指定讀取檔案時所使
用的編碼方式,預設值是 UTF-8。
ReadAllBytes()與 ReadAllText()這 兩 個 方 法 都 可 以 用 來 讀 取 檔 案 的 內 容 資
19-73
料,如上述說明的,它們之間的差異,只在讀取格式的分別,對於非文字格
式的檔案,例如一個 jpg 圖檔,以位元組的方式進行讀取非常的有用。
WriteAllBytes()將指定的位元組資料寫入檔案之中,例如以下的程式碼:
引用 WriteAllText()方法寫入檔案的資料為字串型態的資料,由於是文字格
式,因此它的另外一個多載版本同時可以讓你指定所要使用的編碼格式,如
下式:
透過 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
19-77
專案 slnMyForms
於其中的文字方塊輸入作為標題的文字,選擇所要啟動的表單,當使用者按一
下「啟動其他表單」按鈕的時候,應用程式會根據使用者的選擇,啟動指定的
表單,並且將文字欄位的內容作為其標題,以下為上述畫面的執行結果:
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 是其中最簡單的屬性成員,它最主要的用
途便是回傳目前使用者的名稱與網域等相關資訊,其定義如下:
專案 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