用實(shí)例講述VB.NET Process類
在向大家詳細(xì)介紹VB.NET Process類之前,首先讓大家了解下ptm是什么,然后全面介紹VB.NET Process類。首先對(duì)文章名做一個(gè)解示,p是代表Process,即進(jìn)程,t是代表Thread,即線程,m是代表Module,即模塊。
在 win nt,win 2000,win xp中都有一個(gè)性能查看器,我們可以用它來查看計(jì)算機(jī)上正在運(yùn)行的程序,獲得與程序相關(guān)的主窗口名,和查看cpu和內(nèi)存,虛擬頁面的使用情況。但是對(duì)于更高要求的計(jì)算機(jī)使用人員來說,這些是不夠的,特別是一些diy的發(fā)燒友,他們希望自己可以隨時(shí)對(duì)自己的計(jì)算機(jī)進(jìn)行查看,了解更多的信息從而可以知道自己的計(jì)算機(jī)是否應(yīng)該升級(jí)了,是否該對(duì)虛擬頁面做出調(diào)整,是否該換cpu,還是增加內(nèi)存。
由于以上情況,所以我們完全有理由做一個(gè)更好的查看器。在進(jìn)行編寫代碼以前我們還需要知道一些基本知識(shí),即proccess,thread,module?,F(xiàn)在我們先來學(xué)習(xí)一下proecss的基本知識(shí)。
VB.NET Process類的概念
用最簡短的話來說,進(jìn)程就是當(dāng)前運(yùn)行的應(yīng)用程序。運(yùn)行的應(yīng)用程序包括exe,dll這兩種文件。文件和進(jìn)程的差別在與,文件是保存在磁盤上的,是靜止的,計(jì)算機(jī)不會(huì)去調(diào)用文件,而進(jìn)程是非靜止的,正是由于著個(gè)原因,所以計(jì)算機(jī)每調(diào)用一個(gè)進(jìn)程就需要一定的資源。這些資源包括內(nèi)存,虛擬頁面,句柄,gdi……
在.net中我門可以用VB.NET Process類,(他位于System.Diagnostics空間中)提供對(duì)正在計(jì)算機(jī)上運(yùn)行的進(jìn)程的訪問。使用VB.NET Process類,可以獲取當(dāng)前運(yùn)行的進(jìn)程的列表,或者啟動(dòng)新的進(jìn)程。VB.NET Process類用于訪問系統(tǒng)進(jìn)程。初始化VB.NET Process類后,可使用該類來獲取有關(guān)當(dāng)前運(yùn)行的進(jìn)程的信息。此類信息包括線程集、加載的模塊(.dll 和 .exe 文件)和性能信息(如進(jìn)程當(dāng)前使用的內(nèi)存量)。
系統(tǒng)進(jìn)程在系統(tǒng)上由其進(jìn)程標(biāo)識(shí)符唯一標(biāo)識(shí)。與許多 Windows 資源一樣,進(jìn)程也由其句柄標(biāo)識(shí),而句柄在計(jì)算機(jī)上可能不唯一。句柄是表示資源標(biāo)識(shí)符的一般術(shù)語。即使進(jìn)程已退出,操作系統(tǒng)仍保持進(jìn)程句柄,該句柄通過 Process 組件的 Handle 屬性訪問。因此,可以獲取進(jìn)程的管理信息,如 ExitCode(通常,或者為零表示成功,或者為非零錯(cuò)誤代碼)和 ExitTime。句柄是非常有價(jià)值的資源。
- Public Class Form1
- Inherits System.Windows.Forms.Form
- Public zj
- Public myProcesses() As Process
- Public myProcess As Process
- Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click- ListBox1.Items.Clear()
- myProcesses = Process.GetProcesses()
- For Each myProcess In myProcesses
- ListBox1.Items.Add(myProcess.ProcessName)
- Next
- Label1.Text = ""
- Label1.Text = "本機(jī)共有" & ListBox1.Items.Count & "個(gè)進(jìn)程在運(yùn)行"
- End Sub
- Private Sub ListBox1_DoubleClick(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ListBox1.DoubleClick- Dim i : Dim f As Integer : Dim h As Integer
- ListBox2.Items.Clear()
- zj = ListBox1.SelectedIndex
- Label2.Text = "進(jìn)程" & ListBox1.Items.Item(zj) & "的相關(guān)信息"
- With ListBox2.Items
- If myProcesses(zj).MainWindowTitle = "" Then
- .Add("無相關(guān)主窗口")
- Else
- .Add(myProcesses(zj).MainWindowTitle)
- End If
- .Add(myProcesses(zj).BasePriority & "進(jìn)程的基本優(yōu)先級(jí)")
- .Add(myProcesses(zj).Handle.ToString & "進(jìn)程的本機(jī)句柄")
- .Add(myProcesses(zj).HandleCount & "進(jìn)程打開的句柄數(shù)")
- .Add(myProcesses(zj).Id & "進(jìn)程的唯一標(biāo)識(shí)符")
- .Add(myProcesses(zj).MachineName & "進(jìn)程正在其上運(yùn)行的計(jì)算機(jī)的名稱")
- .Add(myProcesses(zj).MainModule.ToString & "進(jìn)程的主模塊")
- .Add(myProcesses(zj).MainWindowHandle.ToString & "進(jìn)程主窗口的句柄")
- '.Add(myProcesses(zj).Modules & "")
- .Add(myProcesses(zj).NonpagedSystemMemorySize & "分配給此進(jìn)程的未分頁的系統(tǒng)內(nèi)存大小")
- .Add(myProcesses(zj).PagedMemorySize & "分頁的內(nèi)存大小")
- .Add(myProcesses(zj).PagedSystemMemorySize & "分頁的系統(tǒng)內(nèi)存大小")
- .Add(myProcesses(zj).PeakPagedMemorySize & "峰值分頁內(nèi)存大小")
- .Add(myProcesses(zj).PeakVirtualMemorySize & "峰值虛擬內(nèi)存大小")
- .Add(myProcesses(zj).PrivateMemorySize & "專用內(nèi)存大小")
- .Add(myProcesses(zj).StartTime & "進(jìn)程啟動(dòng)的時(shí)間")
- .Add(myProcesses(zj).TotalProcessorTime.Seconds & "進(jìn)程的總的處理器時(shí)間")
- .Add(myProcesses(zj).UsERProcessorTime.Seconds & "進(jìn)程的用戶處理器時(shí)間")
- .Add(myProcesses(zj).VirtualMemorySize & "進(jìn)程的虛擬內(nèi)存大小")
- End With
- ListBox3.Items.Clear()
- TabPage1.Text = "進(jìn)程" & ListBox1.Items.Item(zj) & "的基本信息"
- TabPage2.Text = "進(jìn)程" & ListBox1.Items.Item(zj) & "相關(guān)的線程信息"
- TabPage3.Text = "進(jìn)程" & ListBox1.Items.Item(zj) & "相關(guān)的模塊信息"
- '/////////////////////////////////////////////
- f = myProcesses(zj).Threads.Count
- Label4.Text = "進(jìn)程" & ListBox1.Items.Item(zj) & "共有" & f & "個(gè)相關(guān)的線程,線程ID信息如下:"
- Dim int, pk, m, n
- For n = 0 To f - 1
- ListBox3.Items.Add(myProcesses(zj).Threads(n).Id)
- Next
- '///////////////////////////////////////
- ListBox5.Items.Clear()
- Dim zha, kl
- zha = myProcesses(zj).Modules.Count
- Label5.Text = "與進(jìn)程" & ListBox1.Items.Item(zj) & "共有" & zha & "個(gè)相關(guān)的模塊,模塊位置信息如下:"
- For kl = 0 To zha - 1
- ListBox5.Items.Add(myProcesses(zj).Modules(kl).FileName)
- Next
- End Sub
- Private Sub ListBox3_DoubleClick(ByVal sender As Object,
ByVal e As System.EventArgs) Handles ListBox3.DoubleClick- ListBox4.Items.Clear()
- Dim f, n
- f = myProcesses(zj).Threads.Count
- n = ListBox3.SelectedIndex
- Label6.Text = "線程" & ListBox3.Items.Item(n) & "相關(guān)信息"
- With ListBox4.Items‘與進(jìn)程相關(guān)的線程信息見System.Diagnostics.processThread類。
因?yàn)?nbsp;Processes.threads屬性是返回thread對(duì)象數(shù)組而thread對(duì)象數(shù)組的實(shí)例是由ProcessThread類來創(chuàng)建,
thread 對(duì)象數(shù)組的信息是包含在System.Diagnostics. ProcessThread類中。- .Add(myProcesses(zj).Threads(n).BasePriority)
- .Add(myProcesses(zj).Threads(n).CurrentPriority)
- .Add(myProcesses(zj).Threads(n).PriorityLevel)
- .Add(myProcesses(zj).Threads(n).PrivilegedProcessorTime)
- .Add(myProcesses(zj).Threads(n).StartTime)
- .Add(myProcesses(zj).Threads(n).ThreadState.ToString)
- .Add(myProcesses(zj).Threads(n).TotalProcessorTime.Seconds)
- .Add(myProcesses(zj).Threads(n).UserProcessorTime.Seconds)
- .Add(myProcesses(zj).Threads(n).WaitReason.ToString)
- End With
- End Sub
- Private Sub ListBox5_DoubleClick(ByVal sender As Object,
ByVal e As System.EventArgs) Handles ListBox5.DoubleClick- ListBox6.Items.Clear()
- Dim f, n, m
- f = myProcesses(zj).Modules.Count
- n = ListBox5.SelectedIndex
- Label7.Text = "模塊" & ListBox5.Items.Item(n) & "相關(guān)信息"
- With ListBox6.Items‘與進(jìn)程相關(guān)的模塊信息見System.Diagnostics. ProcessModule類,
因?yàn)镻rocesses.Modules屬性是返回Modules對(duì)象數(shù)組而Modules對(duì)象數(shù)組的實(shí)例是由 ProcessModule類來創(chuàng)建,
Modules對(duì)象數(shù)組的信息是包含在System.Diagnostics. ProcessModule類中。- m = Hex(myProcesses(zj).Modules(n).BaseAddress.ToInt32)‘轉(zhuǎn)換成16進(jìn)制
- .Add(m)
- m = Hex(myProcesses(zj).Modules(n).EntryPointAddress.ToInt32)
- .Add(m)
- .Add(myProcesses(zj).Modules(n).FileVersionInfo)
- .Add(myProcesses(zj).Modules(n).ModuleMemorySize)
- .Add(myProcesses(zj).Modules(n).ModuleName)
- End With
- End Sub
最后對(duì)程做一點(diǎn)補(bǔ)充說明,各位讀者,當(dāng)你知道了如何編寫這個(gè)程序時(shí),你可能會(huì)想如果只是寫一個(gè)單純的這個(gè)程序你可能會(huì)覺得沒什么意義,那如何才可以將這段程序發(fā)揮他更大的意義?就讓我來告訴你。其實(shí)這段代碼并不是我刻意編寫的,而是一個(gè)局域網(wǎng)中的遠(yuǎn)程控制的一部分。掃描客戶機(jī)上運(yùn)行的進(jìn)程,查看客戶機(jī)的資源,將獲得的信息發(fā)個(gè)服務(wù)器,并可以通過VB.NET Process類來關(guān)閉客戶機(jī)上的進(jìn)程,以便管理者對(duì)客戶機(jī)進(jìn)行管理。此外寫這篇文章的另一個(gè)目的是希望讀者更快的掌握.net中 System.Diagnostics.Process,System.Diagnostics.processThread,System.Diagnostics. ProcessModule類。在VB.NET和win2000通過 。
【編輯推薦】