在向大家详细介绍VB.NET Process类之前,首先让大家了解下ptm是什么,然后全面介绍VB.NET Process类。首先对文章名做一个解示,p是代表Process,即进程,t是代表Thread,即线程,m是代表Module,即模块。
在 win nt,win 2000,win xp中都有一个性能查看器,我们可以用它来查看计算机上正在运行的程序,获得与程序相关的主窗口名,和查看cpu和内存,虚拟页面的使用情况。但是对于更高要求的计算机使用人员来说,这些是不够的,特别是一些diy的发烧友,他们希望自己可以随时对自己的计算机进行查看,了解更多的信息从而可以知道自己的计算机是否应该升级了,是否该对虚拟页面做出调整,是否该换cpu,还是增加内存。
由于以上情况,所以我们完全有理由做一个更好的查看器。在进行编写代码以前我们还需要知道一些基本知识,即proccess,thread,module。现在我们先来学习一下proecss的基本知识。
VB.NET Process类的概念
用最简短的话来说,进程就是当前运行的应用程序。运行的应用程序包括exe,dll这两种文件。文件和进程的差别在与,文件是保存在磁盘上的,是静止的,计算机不会去调用文件,而进程是非静止的,正是由于着个原因,所以计算机每调用一个进程就需要一定的资源。这些资源包括内存,虚拟页面,句柄,gdi……
在.net中我门可以用VB.NET Process类,(他位于System.Diagnostics空间中)提供对正在计算机上运行的进程的访问。使用VB.NET Process类,可以获取当前运行的进程的列表,或者启动新的进程。VB.NET Process类用于访问系统进程。初始化VB.NET Process类后,可使用该类来获取有关当前运行的进程的信息。此类信息包括线程集、加载的模块(.dll 和 .exe 文件)和性能信息(如进程当前使用的内存量)。
系统进程在系统上由其进程标识符唯一标识。与许多 Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过 Process 组件的 Handle 属性访问。因此,可以获取进程的管理信息,如 ExitCode(通常,或者为零表示成功,或者为非零错误代码)和 ExitTime。句柄是非常有价值的资源。
- 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 = "本机共有" & ListBox1.Items.Count & "个进程在运行"
- 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 = "进程" & ListBox1.Items.Item(zj) & "的相关信息"
- With ListBox2.Items
- If myProcesses(zj).MainWindowTitle = "" Then
- .Add("无相关主窗口")
- Else
- .Add(myProcesses(zj).MainWindowTitle)
- End If
- .Add(myProcesses(zj).BasePriority & "进程的基本优先级")
- .Add(myProcesses(zj).Handle.ToString & "进程的本机句柄")
- .Add(myProcesses(zj).HandleCount & "进程打开的句柄数")
- .Add(myProcesses(zj).Id & "进程的唯一标识符")
- .Add(myProcesses(zj).MachineName & "进程正在其上运行的计算机的名称")
- .Add(myProcesses(zj).MainModule.ToString & "进程的主模块")
- .Add(myProcesses(zj).MainWindowHandle.ToString & "进程主窗口的句柄")
- '.Add(myProcesses(zj).Modules & "")
- .Add(myProcesses(zj).NonpagedSystemMemorySize & "分配给此进程的未分页的系统内存大小")
- .Add(myProcesses(zj).PagedMemorySize & "分页的内存大小")
- .Add(myProcesses(zj).PagedSystemMemorySize & "分页的系统内存大小")
- .Add(myProcesses(zj).PeakPagedMemorySize & "峰值分页内存大小")
- .Add(myProcesses(zj).PeakVirtualMemorySize & "峰值虚拟内存大小")
- .Add(myProcesses(zj).PrivateMemorySize & "专用内存大小")
- .Add(myProcesses(zj).StartTime & "进程启动的时间")
- .Add(myProcesses(zj).TotalProcessorTime.Seconds & "进程的总的处理器时间")
- .Add(myProcesses(zj).UsERProcessorTime.Seconds & "进程的用户处理器时间")
- .Add(myProcesses(zj).VirtualMemorySize & "进程的虚拟内存大小")
- End With
- ListBox3.Items.Clear()
- TabPage1.Text = "进程" & ListBox1.Items.Item(zj) & "的基本信息"
- TabPage2.Text = "进程" & ListBox1.Items.Item(zj) & "相关的线程信息"
- TabPage3.Text = "进程" & ListBox1.Items.Item(zj) & "相关的模块信息"
- '/////////////////////////////////////////////
- f = myProcesses(zj).Threads.Count
- Label4.Text = "进程" & ListBox1.Items.Item(zj) & "共有" & f & "个相关的线程,线程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 = "与进程" & ListBox1.Items.Item(zj) & "共有" & zha & "个相关的模块,模块位置信息如下:"
- 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) & "相关信息"
- With ListBox4.Items‘与进程相关的线程信息见System.Diagnostics.processThread类。
因为 Processes.threads属性是返回thread对象数组而thread对象数组的实例是由ProcessThread类来创建,
thread 对象数组的信息是包含在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) & "相关信息"
- With ListBox6.Items‘与进程相关的模块信息见System.Diagnostics. ProcessModule类,
因为Processes.Modules属性是返回Modules对象数组而Modules对象数组的实例是由 ProcessModule类来创建,
Modules对象数组的信息是包含在System.Diagnostics. ProcessModule类中。- m = Hex(myProcesses(zj).Modules(n).BaseAddress.ToInt32)‘转换成16进制
- .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
最后对程做一点补充说明,各位读者,当你知道了如何编写这个程序时,你可能会想如果只是写一个单纯的这个程序你可能会觉得没什么意义,那如何才可以将这段程序发挥他更大的意义?就让我来告诉你。其实这段代码并不是我刻意编写的,而是一个局域网中的远程控制的一部分。扫描客户机上运行的进程,查看客户机的资源,将获得的信息发个服务器,并可以通过VB.NET Process类来关闭客户机上的进程,以便管理者对客户机进行管理。此外写这篇文章的另一个目的是希望读者更快的掌握.net中 System.Diagnostics.Process,System.Diagnostics.processThread,System.Diagnostics. ProcessModule类。在VB.NET和win2000通过 。
【编辑推荐】