分享
 
 
 

VB.NET实现超级ptm查看器

王朝c#·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

首先对文章名做一个解示,p是代表Process,即进程,t是代表Thread,即线程,m是代表Module,即模块。

在win nt,win 2000,win xp中都有一个性能查看器,我们可以用它来查看计算机上正在运行的程序,获得与程序相关的主窗口名,和查看cpu和内存,虚拟页面的使用情况。但是对于更高要求的计算机使用人员来说,这些是不够的,特别是一些diy的发烧友,他们希望自己可以随时对自己的计算机进行查看,了解更多的信息从而可以知道自己的计算机是否应该升级了,是否该对虚拟页面做出调整,是否该换cpu,还是增加内存。

由于以上情况,所以我们完全有理由做一个更好的查看器。在进行编写代码以前我们还需要知道一些基本知识,即proccess,thread,module。现在我们先来学习一下proecss的基本知识。

1.Proccss的概念

用最简短的话来说,进程就是当前运行的应用程序。运行的应用程序包括exe,dll这两种文件。文件和进程的差别在与,文件是保存在磁盘上的,是静止的,计算机不会去调用文件,而进程是非静止的,正是由于着个原因,所以计算机每调用一个进程就需要一定的资源。这些资源包括内存,虚拟页面,句柄,gdi……

在.net中我门可以用Process 类,(他位于System.Diagnostics空间中)提供对正在计算机上运行的进程的访问。使用 Process类,可以获取当前运行的进程的列表,或者启动新的进程。Process 类用于访问系统进程。初始化 Process类后,可使用该类来获取有关当前运行的进程的信息。此类信息包括线程集、加载的模块(.dll 和 .exe 文件)和性能信息(如进程当前使用的内存量)。

系统进程在系统上由其进程标识符唯一标识。与许多 Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过 Process 组件的 Handle 属性访问。因此,可以获取进程的管理信息,如 ExitCode(通常,或者为零表示成功,或者为非零错误代码)和 ExitTime。句柄是非常有价值的资源。

2. thread的概念

进程由一个或多个线程组成。换句话说线程是将进程分成了多个小的部分.每个线程都有优先级,在较高优先级的线程完成任务的时候,较低优先级的线程可能会被迫等待。在多处理器计算机上,将多个线程移到不同的处理器上,从而对 CPU 负荷进行平衡。每个进程启动时都具有一个线程,该线程称为主线程。任何线程都可创建其他线程。进程中的所有线程共享该进程的地址空间。

在.net中可以用System.Diagnostics的ProcessThread类来与进程获相关的线程信息.用System.Threading的Thread类来创建新线程.请注意Thread类不可以用来访问其他进程的线程,他只可以用来创建一个线程而已,一定要记住这点。如果你还想对线程进行更多的操作,可以用System.Diagnostics.ProcessThread类中返回的id,通过它作为api函数的参数来操作线程。

3. module的概念

模块指的是可执行文件或动态链接库 (DLL)。每个进程包含一个或多个模块。可以使用System.Diagnostics的ProcessModule类来获得有关模块的信息,这个类中有一个很有用的属性EntryPointAddress他可以返回获取在系统加载和运行模块时运行的函数的内存地址。然后用Visual Studio6.0中的工具,查看该地址就可以知道是什么函数!然后根据函数名查看相关的资料,就可以知道这个应用程序的基本编程思路,这个功能对程序员很有用。

了解了基本知识,现在就就可以编程了。首先建立一个窗口,在窗口上加上一个TabControl分页控件,在第一页加上label1,label2,listbox1,listbox2,button1。在第二页上加上label4,label6,listbox3,listbox4,在第三页上加上label5,label7,listbox5,listbox6。将所有的listbox控件的HorizontalScrollbar属性设置为true

然后添加如下代码(VB.net编写)

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通过 。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有