VB.NET实现Windows进程管理器
http://tech.ddvip.com 2006年07月29日 社区交流
本文详细介绍VB.NET实现Windows进程管理器
我的计算机系统是Windows 2000服务器版,回想当初从Win 98升级到Win 2000时,主要原因除了在Win 98下无法安装Visual Studio .Net 2002外,另外一个原因就是Win 2000自带一个我非常喜欢的可以管理进程的应用程序,通过这个管理器可以得到计算机到底运行了多少进程,在掌握那些进程属于正常进程的情况下,就可以得到计算机中那些是不正常的进程,从而判断计算机是否感染了病毒或黑客程序。可见Windows的进程管理器还是具有很高的实用价值的。其实用Visual Basic .Net来实现类似的功能应该算是比较方便的,因为在.Net FrameWork SDK中提供了可以获得计算机进程数据以及操控计算机进程相关的类库。本文的以下内容就来详细介绍在Visual Basic .Net中实现类似Windows进程管理器的具体方法。
一.本文程序设计、调试和运行的环境:
(1).微软公司视窗2000服务器版。
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705。
二.简介Visual Basic .Net实现Windows进程管理器时的主要类库:
在用Visual Basic .Net实现Windows进程管理器中最重要,也是最频繁的就是Process类。Process类位于命名空间System.Diagnostics中,使用者可以提供使用它来操控计算机进程,如启动、停止、控制进程等。和得到与进程相关的属性,如线程集、加载的模块(即加载的DLL文件和EXE文件)和各种性能信息(如进程当前使用的内存量)等。其实读者只需对下面介绍的程序进行一定的修改,所实现的功能就大大强于Windows的进程管理器功能,但前提是掌握以下表01和表02中所列出的Process的常用属性、常用方法及其说明。
| 属性 | 说明 |
| BasePriority | 获取关联进程的基本优先级。 |
| EnableRaisingEvents | 获取或设置在进程终止时是否应激发Exited事件。 |
| ExitCode | 获取关联进程终止时指定的值。 |
| ExitTime | 获取关联进程退出的时间。 |
| Handle | 返回关联进程的本机句柄。 |
| HandleCount | 获取由进程打开的句柄数。 |
| HasExited | 获取指示关联进程是否已终止的值。 |
| Id | 获取关联进程的唯一标识符。 |
| MachineName | 获取关联进程正在其上运行的计算机的名称。 |
| MainModule | 获取关联进程的主模块。 |
| MainWindowHandle | 获取关联进程主窗口的窗口句柄。 |
| MainWindowTitle | 获取进程的主窗口标题。 |
| MaxWorkingSet | 获取或设置关联进程的允许的最大工作集大小。 |
| MinWorkingSet | 获取或设置关联进程的允许的最小工作集大小。 |
| Modules | 获取已由关联进程加载的模块。 |
| NonpagedSystemMemorySize | 获取分配给此进程的未分页的系统内存大小。 |
| PagedMemorySize | 获取分页的内存大小。 |
| PagedSystemMemorySize | 获取分页的系统内存大小。 |
| PeakPagedMemorySize | 获取峰值分页内存大小。 |
| PeakVirtualMemorySize | 获取峰值虚拟内存大小。 |
| PeakWorkingSet | 获取峰值工作集大小。 |
| PriorityBoostEnabled | 获取或设置一个值,该值指示主窗口拥有焦点时是否由操作系统暂时提升关联进程的优先级。 |
| PriorityClass | 获取或设置关联进程的总体优先级类别。 |
| PrivateMemorySize | 获取专用内存大小。 |
| PrivilegedProcessorTime | 获取此进程的特权处理器时间。 |
| ProcessName | 获取该进程的名称。 |
| StartTime | 获取关联进程启动的时间。 |
| Threads | 获取在关联进程中运行的一组线程。 |
| TotalProcessorTime | 获取此进程的总的处理器时间。 |
| UserProcessorTime | 获取此进程的用户处理器时间。 |
| VirtualMemorySize | 获取进程的虚拟内存大小。 |
| WorkingSet | 获取关联进程的物理内存使用情况。 |
表01:Process类常用属性及其说明
可见Process类提供了很多获取计算机进程相关信息的属性,在下面介绍的用Visual Basic .Net实现Windows进程管理器中,只需要使用Process中的ProcessName、Id、StartTime和PrivateMemorySize区区四个属性。同样Process提供了许多用以操控进程的方法,在下面介绍的程序中,调用了GetProcessById、Kill、Close、GetProcesses等方法来获取计算机进程数据和操控进程状态。Process类中的其他常用方法及其说明见下表所示:
| 方法 | 说明 |
| Close | 释放与此组件关联的所有资源。 |
| CloseMainWindow | 通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。 |
| CreateObjRef | 创建一个对象,该对象包含生成用于与远程对象进行通讯的代理所需的全部相关信息。 |
| EnterDebugMode | 将Process实例置于与以特殊模式运行的操作系统进程进行交互的状态。 |
| GetCurrentProcess | 获取新的Process实例并将其与当前活动的进程关联。 |
| GetLifetimeService | 检索控制此实例的生存期策略的当前生存期服务对象。 |
| GetProcessById | 创建新的Process实例,并将其与您指定的现有进程资源关联。 |
| GetProcesses | 创建新的Process实例的数组,并将它们与现有进程资源关联。 |
| GetProcessesByName | 创建新的Process实例的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。 |
| InitializeLifetimeService | 获取控制此实例的生存期策略的生存期服务对象。 |
| Kill | 立即停止关联的进程。 |
| LeaveDebugMode | 使Process实例离开允许它与以特殊模式运行的操作系统进程交互的状态。 |
| Refresh | 放弃有关关联进程的、已缓存到该进程组件内的任何信息。 |
| Start | 启动进程资源并将其与Process实例关联。 |
| WaitForExit | 设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。 |
| WaitForInputIdle | 使Process实例等待关联进程进入空闲状态。 |
表02:Process类常用方法及其说明
三.Visual Basic .Net实现Windows进程管理器程序的关键步骤:
关键步骤无非是二步,其一就是获取计算机的运行进程,其二就是中止选定的进程。获取计算机的运行进程使用的Process类中的GetProcesses方法,GetProcesses方法返回值是一个类型为Process实例的数组,通过遍历这个数组就获得计算机中各个进程及其对应的数据。具体的实现方法可参阅本文第四部分中的第九步骤。中止进程的关键是通过进程的ID号得到与之相应进程实例,之后只需调用Process中的Kill方法即可。具体实现步骤请参阅本文第四部分中的第十步。
四.Visual Basic .Net实现Windows进程管理器程序的具体实现方法:
在下面介绍的用Visual Basic .Net实现的进程管理器程序总体来说仿效Windows自带的进程管理器风格,程序可以获得计算机中所有运行的进程数目、名称、运行时间和占有内存等信息,并且可以中断任一选定的进程。下面就是具体的实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual Basic项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【VB.NET打造Windows任务栏】。
6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在"E:\VS.NET项目"目录中就产生了名称为"VB.NET打造Windows任务栏"的文件夹,并在里面创建了名称为"VB.NET打造Windows任务栏"的项目文件。具体如图01所示:

图01:【VB.NET打造Windows任务栏】项目之【新建项目】对话框
7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应的操作:
一个ListView组件,名称为ListView1,用以显示计算机进程及其数据。并在ListView1组件拖入Form1的设计窗体后,在ListView1组件中再加入四个ColumnHeader对象,这四个ColumnHeader对象分类别显示进程的名称、ID号、运行时间和占有内存的状况等。
一个StatusBarPanel组件,名称为StatusBarPanel1,用以显示计算机中运行的进程总数。并在此组件拖入Form1的设计窗体后,在StatusBarPanel1组件中添加StatusBarPanel对象。
一个ContextMenu组件,用以设定ListView1组件的快捷菜单。其快捷菜单的功能是实现中止在ListView1组件中选定的进程。
一个Button组件,其功能也是中止在ListView1组件选定的进程,并在这个Button组件拖入Form1的设计窗体后,双击它们,则系统会在Form1.vb文件分别产生这二组件的Click事件对应的处理代码。
8. 把Visual Studio .Net的当前窗口切换到Form1.vb的代码编辑窗口,并用下列代码替换Form1.vb中的InitializeComponent过程对应的代码,下列代码作用是初始化窗体中加入的组件:
Private Sub InitializeComponent ( )
Me.ListView1 = New System.Windows.Forms.ListView ( )
Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader ( )
Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader ( )
Me.ColumnHeader3 = New System.Windows.Forms.ColumnHeader ( )
Me.ColumnHeader4 = New System.Windows.Forms.ColumnHeader ( )
Me.ContextMenu1 = New System.Windows.Forms.ContextMenu ( )
Me.MenuItem1 = New System.Windows.Forms.MenuItem ( )
Me.StatusBar1 = New System.Windows.Forms.StatusBar ( )
Me.StatusBarPanel1 = New System.Windows.Forms.StatusBarPanel ( )
Me.Button1 = New System.Windows.Forms.Button ( )
CType ( Me.StatusBarPanel1 , System.ComponentModel.ISupportInitialize ) .BeginInit ( )
Me.SuspendLayout ( )
Me.ListView1.Columns.AddRange ( New System.Windows.Forms.ColumnHeader ( ) {Me.ColumnHeader1 , Me.ColumnHeader2 , Me.ColumnHeader3 , Me.ColumnHeader4} )
Me.ListView1.ContextMenu = Me.ContextMenu1
Me.ListView1.Dock = System.Windows.Forms.DockStyle.Top
Me.ListView1.FullRowSelect = True
Me.ListView1.Name = "ListView1"
Me.ListView1.Size = New System.Drawing.Size ( 406 , 286 )
Me.ListView1.TabIndex = 0
Me.ListView1.View = System.Windows.Forms.View.Details
Me.ColumnHeader1.Text = "映像名称"
Me.ColumnHeader1.Width = 101
Me.ColumnHeader2.Text = "PID"
Me.ColumnHeader2.Width = 80
Me.ColumnHeader3.Text = "CPU时间"
Me.ColumnHeader3.Width = 101
Me.ColumnHeader4.Text = "内存使用"
Me.ColumnHeader4.Width = 130
Me.ContextMenu1.MenuItems.AddRange ( New System.Windows.Forms.MenuItem ( ) {Me.MenuItem1} )
Me.MenuItem1.Index = 0
Me.MenuItem1.Text = "结束进程"
Me.StatusBar1.Location = New System.Drawing.Point ( 0 , 349 )
Me.StatusBar1.Name = "StatusBar1"
Me.StatusBar1.Panels.AddRange ( New System.Windows.Forms.StatusBarPanel ( ) {Me.StatusBarPanel1} )
Me.StatusBar1.ShowPanels = True
Me.StatusBar1.Size = New System.Drawing.Size ( 406 , 22 )
Me.StatusBar1.TabIndex = 1
Me.StatusBar1.Text = "StatusBar1"
Me.StatusBarPanel1.Width = 406
Me.Button1.Location = New System.Drawing.Point ( 285 , 298 )
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size ( 87 , 33 )
Me.Button1.TabIndex = 2
Me.Button1.Text = "结束进程"
Me.AutoScaleBaseSize = New System.Drawing.Size ( 6 , 14 )
Me.ClientSize = New System.Drawing.Size ( 406 , 371 )
Me.Controls.AddRange ( New System.Windows.Forms.Control ( ) {Me.Button1 , Me.StatusBar1 , Me.ListView1} )
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
Me.MaximizeBox = False
Me.Name = "Form1"
Me.Text = "VB.NET打造Windows进程管理器"
CType ( Me.StatusBarPanel1 , System.ComponentModel.ISupportInitialize ) .EndInit ( )
Me.ResumeLayout ( False )
End Sub
至此【VB.NET打造Windows进程管理器】项目的界面设计和功能实现的准备工作就完成了,具体如图02所示:

图02:【VB.NET打造Windows进程管理器】项目的设计界面
9. 用下列代码替换Form1.vb中的Button1的Click事件对应的处理代码,下列代码功能是中止在ListView1组件选定的进程:
Private Sub Button1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles Button1.Click
Dim lvcItem As ListView.SelectedListViewItemCollection = New ListView.SelectedListViewItemCollection ( ListView1 )
Dim sTemp As String = lvcItem ( 0 ) .SubItems ( 1 ) .Text
Dim iTemp As Integer = Int32.Parse ( sTemp )
'根据ID号,得到要杀死的进程
Dim pProcessTemp As System.Diagnostics.Process = Process.GetProcessById ( iTemp )
Dim drTemp As DialogResult = MessageBox.Show ( "是否结束进程?" + pProcessTemp.ProcessName , "VB.NET打造Windows进程管理器!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question )
Dim iDrTemp As Integer = Int32.Parse ( drTemp )
If iDrTemp = 6 Then
' 按动确定按钮
'杀死此进程
pProcessTemp.Kill ( )
pProcessTemp.Close ( )
End If
End Sub
10. 在Form1.vb中的Button1的Click事件之后添加下列代码,下列代码是定义Form1的Load事件,在此事件中将获取计算机中的运行进程和与之相关的数据:
Private Sub Form1_Load ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MyBase.Load
ListView1.Items.Clear ( )
'创建一个Process类型的数组
Dim pTemp As System.Diagnostics.Process ( )
'通过此语句返回的是进程数组,这些进程数组存放的是当前运行存在地进程资源
pTemp = System.Diagnostics.Process.GetProcesses ( )
'得到当前运行进程数目
StatusBarPanel1.Text = "进程数:" + pTemp.Length.ToString ( )
'获取计算机中每一个进程的信息,并显示出来
Dim pTempProcess As System.Diagnostics.Process
For Each pTempProcess In pTemp
'得到进程的名称
Dim sProcessNeme As String = pTempProcess.ProcessName
'得到进程的ID号
Dim sProcessID As String = pTempProcess.Id.ToString ( )
'得到进程的开始运行时间
Dim sStartTime As String = pTempProcess.StartTime.ToString ( )
'得到进程运行所需要的内存大小
Dim sMemroyUse As String = pTempProcess.PrivateMemorySize.ToString ( )
'显示获取的信息
Dim lvtTemp As ListViewItem = New ListViewItem ( New String ( ) {sProcessNeme , sProcessID , sStartTime , sMemroyUse} , -1 )
ListView1.Items.Add ( lvtTemp )
Next
End Sub
11. 在Form1.vb中的Form1的Load事件代码之后添加下列代码,下列的代码是定义快捷菜单的事件,通过此事件来中止在ListView1组件中选定的进程:
Private Sub MenuItem1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem1.Click
Dim lvcItem As ListView.SelectedListViewItemCollection = New ListView.SelectedListViewItemCollection ( ListView1 )
Dim sTemp As String = lvcItem ( 0 ) .SubItems ( 1 ) .Text
Dim iTemp As Integer = Int32.Parse ( sTemp )
'根据ID号,得到要杀死的进程
Dim pProcessTemp As System.Diagnostics.Process = Process.GetProcessById ( iTemp )
Dim drTemp As DialogResult = MessageBox.Show ( "是否结束进程?" + pProcessTemp.ProcessName , "VB.NET打造Windows进程管理器!" , MessageBoxButtons.YesNo , MessageBoxIcon.Question )
Dim iDrTemp As Integer = Int32.Parse ( drTemp )
If iDrTemp = 6 Then
' 按动确定按钮
'杀死此进程
pProcessTemp.Kill ( )
pProcessTemp.Close ( )
End If
End Sub
12. 至此在上述步骤都正确完成后,【VB.NET打造Windows进程管理器】项目的全部工作就基本完成了。此时单击快捷键F5运行程序,就可以得到和Windows进程管理器界面类似、功能相似的一个管理进程的应用程序,程序运行后即获取计算机的运行进程数目和进程的名称、ID号、运行时间和占有内存状况,并通过ListView组件显示这些数据。使用者在进程显示区域选定进程后,通过程序中的【结束进程】按钮或单击鼠标右键,选定弹出的快捷菜单来中止选定的进程。图03是【VB.NET打造Windows进程管理器】项目的运行界面:

图03:【VB.NET打造Windows进程管理器】项目的运行界面
四.总结:
通过上面的介绍,我们不仅获得了一个比较实用的应用程序,更重要的是还掌握在Visual Basic.Net中使用Process类解决实际问题的方法。Process类的成员比较多,但使用方法比较简单,我想通过上面的介绍对您掌握它,并灵活运用它是有所帮助的。
作者:马金虎 责编:豆豆技术应用