用实例讲述VB.NET Process类

开发 后端
这里介绍VB.NET Process类,使用VB.NET Process类,可以获取当前运行的进程的列表,或者启动新的进程。VB.NET Process类用于访问系统进程。初始化VB.NET Process类后,可使用该类来获取有关当前运行的进程的信息。

在向大家详细介绍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。句柄是非常有价值的资源。

  1. Public Class Form1  
  2. Inherits System.Windows.Forms.Form  
  3. Public zj  
  4. Public myProcesses() As Process  
  5. Public myProcess As Process  
  6. Private Sub Button1_Click(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles Button1.Click  
  7. ListBox1.Items.Clear()  
  8. myProcesses = Process.GetProcesses()  
  9. For Each myProcess In myProcesses  
  10. ListBox1.Items.Add(myProcess.ProcessName)  
  11. Next  
  12. Label1.Text = "" 
  13. Label1.Text = "本机共有" & ListBox1.Items.Count & "个进程在运行"  
  14. End Sub  
  15.  
  16. Private Sub ListBox1_DoubleClick(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles ListBox1.DoubleClick  
  17. Dim i : Dim f As Integer : Dim h As Integer  
  18. ListBox2.Items.Clear()  
  19. zj = ListBox1.SelectedIndex  
  20. Label2.Text = "进程" & ListBox1.Items.Item(zj) & "的相关信息"  
  21. With ListBox2.Items  
  22. If myProcesses(zj).MainWindowTitle = "" Then  
  23. .Add("无相关主窗口")  
  24. Else  
  25. .Add(myProcesses(zj).MainWindowTitle)  
  26. End If  
  27. .Add(myProcesses(zj).BasePriority & "进程的基本优先级")  
  28. .Add(myProcesses(zj).Handle.ToString & "进程的本机句柄")  
  29. .Add(myProcesses(zj).HandleCount & "进程打开的句柄数")  
  30. .Add(myProcesses(zj).Id & "进程的唯一标识符")  
  31. .Add(myProcesses(zj).MachineName & "进程正在其上运行的计算机的名称")  
  32. .Add(myProcesses(zj).MainModule.ToString & "进程的主模块")  
  33. .Add(myProcesses(zj).MainWindowHandle.ToString & "进程主窗口的句柄")  
  34. '.Add(myProcesses(zj).Modules & "")  
  35. .Add(myProcesses(zj).NonpagedSystemMemorySize & "分配给此进程的未分页的系统内存大小")  
  36. .Add(myProcesses(zj).PagedMemorySize & "分页的内存大小")  
  37. .Add(myProcesses(zj).PagedSystemMemorySize & "分页的系统内存大小")  
  38. .Add(myProcesses(zj).PeakPagedMemorySize & "峰值分页内存大小")  
  39. .Add(myProcesses(zj).PeakVirtualMemorySize & "峰值虚拟内存大小")  
  40. .Add(myProcesses(zj).PrivateMemorySize & "专用内存大小")  
  41. .Add(myProcesses(zj).StartTime & "进程启动的时间")  
  42. .Add(myProcesses(zj).TotalProcessorTime.Seconds & "进程的总的处理器时间")  
  43. .Add(myProcesses(zj).UsERProcessorTime.Seconds & "进程的用户处理器时间")  
  44. .Add(myProcesses(zj).VirtualMemorySize & "进程的虚拟内存大小")  
  45. End With  
  46. ListBox3.Items.Clear()  
  47. TabPage1.Text = "进程" & ListBox1.Items.Item(zj) & "的基本信息"  
  48. TabPage2.Text = "进程" & ListBox1.Items.Item(zj) & "相关的线程信息"  
  49. TabPage3.Text = "进程" & ListBox1.Items.Item(zj) & "相关的模块信息"  
  50. '/////////////////////////////////////////////  
  51. f = myProcesses(zj).Threads.Count  
  52. Label4.Text = "进程" & ListBox1.Items.Item(zj) & "共有" & f & "个相关的线程,线程ID信息如下:"  
  53. Dim int, pk, m, n  
  54. For n = 0 To f - 1  
  55. ListBox3.Items.Add(myProcesses(zj).Threads(n).Id)  
  56. Next  
  57. '///////////////////////////////////////  
  58.  
  59. ListBox5.Items.Clear()  
  60. Dim zha, kl  
  61. zha = myProcesses(zj).Modules.Count  
  62. Label5.Text = "与进程" & ListBox1.Items.Item(zj) & "共有" & zha & "个相关的模块,模块位置信息如下:"  
  63. For kl = 0 To zha - 1  
  64. ListBox5.Items.Add(myProcesses(zj).Modules(kl).FileName)  
  65. Next  
  66. End Sub  
  67.  
  68. Private Sub ListBox3_DoubleClick(ByVal sender As Object, 
    ByVal e As System.EventArgs) Handles ListBox3.DoubleClick  
  69. ListBox4.Items.Clear()  
  70. Dim f, n  
  71. f = myProcesses(zj).Threads.Count  
  72. n = ListBox3.SelectedIndex  
  73. Label6.Text = "线程" & ListBox3.Items.Item(n) & "相关信息"  
  74. With ListBox4.Items‘与进程相关的线程信息见System.Diagnostics.processThread类。
    因为 Processes.threads属性是返回thread对象数组而thread对象数组的实例是由ProcessThread类来创建,
    thread 对象数组的信息是包含在System.Diagnostics. ProcessThread类中。  
  75. .Add(myProcesses(zj).Threads(n).BasePriority)  
  76. .Add(myProcesses(zj).Threads(n).CurrentPriority)  
  77. .Add(myProcesses(zj).Threads(n).PriorityLevel)  
  78. .Add(myProcesses(zj).Threads(n).PrivilegedProcessorTime)  
  79. .Add(myProcesses(zj).Threads(n).StartTime)  
  80. .Add(myProcesses(zj).Threads(n).ThreadState.ToString)  
  81. .Add(myProcesses(zj).Threads(n).TotalProcessorTime.Seconds)  
  82. .Add(myProcesses(zj).Threads(n).UserProcessorTime.Seconds)  
  83. .Add(myProcesses(zj).Threads(n).WaitReason.ToString)  
  84. End With  
  85. End Sub  
  86.  
  87. Private Sub ListBox5_DoubleClick(ByVal sender As Object, 
    ByVal e As System.EventArgs) Handles ListBox5.DoubleClick  
  88. ListBox6.Items.Clear()  
  89. Dim f, n, m  
  90. f = myProcesses(zj).Modules.Count  
  91. n = ListBox5.SelectedIndex  
  92. Label7.Text = "模块" & ListBox5.Items.Item(n) & "相关信息"  
  93. With ListBox6.Items‘与进程相关的模块信息见System.Diagnostics. ProcessModule类,
    因为Processes.Modules属性是返回Modules对象数组而Modules对象数组的实例是由 ProcessModule类来创建,
    Modules对象数组的信息是包含在System.Diagnostics. ProcessModule类中。  
  94. m = Hex(myProcesses(zj).Modules(n).BaseAddress.ToInt32)‘转换成16进制  
  95. .Add(m)  
  96. m = Hex(myProcesses(zj).Modules(n).EntryPointAddress.ToInt32)  
  97. .Add(m)  
  98. .Add(myProcesses(zj).Modules(n).FileVersionInfo)  
  99. .Add(myProcesses(zj).Modules(n).ModuleMemorySize)  
  100. .Add(myProcesses(zj).Modules(n).ModuleName)  
  101. End With  
  102. End Sub  

最后对程做一点补充说明,各位读者,当你知道了如何编写这个程序时,你可能会想如果只是写一个单纯的这个程序你可能会觉得没什么意义,那如何才可以将这段程序发挥他更大的意义?就让我来告诉你。其实这段代码并不是我刻意编写的,而是一个局域网中的远程控制的一部分。扫描客户机上运行的进程,查看客户机的资源,将获得的信息发个服务器,并可以通过VB.NET Process类来关闭客户机上的进程,以便管理者对客户机进行管理。此外写这篇文章的另一个目的是希望读者更快的掌握.net中 System.Diagnostics.Process,System.Diagnostics.processThread,System.Diagnostics. ProcessModule类。在VB.NET和win2000通过 。

【编辑推荐】

  1. 简单讲述VB.NET表间拖放
  2. 五分钟学会VB.NET实现拖放
  3. 讲述强大的VB.NET Web Forms,使用起来却如此简单
  4. 分析VB QuickSort应用程序
  5. 两步就可以掌握VB使用ArrayList类
责任编辑:佚名 来源: IT168
相关推荐

2009-10-26 19:22:29

VB.NET使用Log

2009-10-16 13:26:53

VB.NET Exce

2009-10-14 17:08:44

VB.NET使用Fil

2009-10-21 10:45:50

VB.NET Quic

2009-10-13 17:03:55

VB.NET面向对象

2009-10-12 16:39:59

OracleTransVB.NET使用

2009-10-16 09:35:24

VB.NET制作透明窗

2009-10-19 08:55:22

VB.NET多重继承

2009-11-02 15:45:03

VB.NET IEnu

2009-10-15 11:11:08

VB.NET Text

2009-10-10 16:44:52

VB.NET开发控件

2009-10-15 16:39:00

VB.NET读取INI

2009-10-23 13:22:25

VB.NET实现拖动图

2009-10-14 11:15:06

VB.NET Grou

2009-10-27 11:39:03

VB.NET事件处理程

2009-10-26 18:11:47

VB.NET调用Exc

2009-10-29 09:57:16

VB.NET实现数据绑

2009-10-21 18:28:48

VB.NET表间拖放

2009-11-03 17:31:01

VB.NET窗体

2010-01-15 13:30:50

VB.NET Prog
点赞
收藏

51CTO技术栈公众号