系统进程在系统上由其进程标识符唯一标识。与许多 Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过 Process 组件的 Handle 属性访问。因此,可以获取进程的管理信息,如 ExitCode(通常,或者为零表示成功,或者为非零错误代码)和 ExitTime。句柄是非常有价值的资源。
2. thread的概念
进程由一个或多个线程组成。换句话说线程是将进程分成了多个小的部分.每个线程都有优先级,在较高优先级的线程完成任务的时候,较低优先级的线程可能会被迫等待。在多处理器计算机上,将多个线程移到不同的处理器上,从而对 CPU 负荷进行平衡。每个进程启动时都具有一个线程,该线程称为主线程。任何线程都可创建其他线程。进程中的所有线程共享该进程的地址空间。
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 End Class 这下就大工告成了,最后对程做一点补充说明,各位读者,当你知道了如何编写这个程序时,你可能会想如果只是写一个单纯的这个程序你可能会觉得没什么意义,那如何才可以将这段程序发挥他更大的意义?就让我来告诉你。其实这段代码并不是我刻意编写的,而是一个局域网中的远程控制的一部分。扫描客户机上运行的进程,查看客户机的资源,将获得的信息发个服务器,并可以通过Processes类来关闭客户机上的进程,以便管理者对客户机进行管理。此外写这篇文章的另一个目的是希望读者更快的掌握.net中System.Diagnostics.Process,System.Diagnostics.processThread,System.Diagnostics. ProcessModule类。在vb.net和win2000通过 。
没有相关教程