用Delphi编写系统进程监控程序

用Delphi编写系统进程监控程序,第1张

程序通过调用kernel dll中的几个API 函数 搜索并列出系统中除本进程外的所有进程的ID 对应的文件说明符 优先级 CPU占有率 线程数 相关进程信息等有关信息 并可中止所选进程 本程序运行时会在系统托盘区加入图标 不会出现在按Ctrl+Alt+Del出现的任务列表中 也不会在任务栏上显示任务按钮 在不活动或最小化时会自动隐藏 不会重复运行 若程序已经运行 再想运行时只会激活已经运行的程序 本程序避免程序反复运行的方法是比较独特的 因为笔者在试用网上介绍一些方法后 发现程序从最小化状态被激活时 单击窗口最小化按钮时 窗口却不能最小化 于是笔者采用了发送和处理自定义消息的方法 在程序运行时先枚举系统中已有窗口 若发现程序已经运行 就向该程序窗口发送自定义消息 然后结束 已经运行的程序接到自定义消息后显示出窗口 //工程文件procviewpro dprprogram procviewprousesForms windows messages main in procview pas {Form }{$R * RES}{//这是系统自动的beginApplication InitializeApplication Title := 系统进程监控 Application CreateForm(TForm Form )Application Runend }varmyhwnd:hwndbeginmyhwnd := FindWindow(nil 系统进程监控 )// 查找窗口if myhwnd= then // 没有发现 继续运行beginApplication InitializeApplication Title := 系统进程监控 Application CreateForm(TForm Form )Application Runendelse //发现窗口 发送鼠标单击系统托盘区消息以激活窗口postmessage(myhwnd WM_SYSTRAYMSG wm_lbuttondown){//下面的方法的缺点是 若窗口原先为最小化状态 激活后单击窗口最小化按钮将不能最小化窗口showwindow(myhwnd sw_restore)FlashWindow(MYHWND TRUE)}end {//下面是使用全局原子的方法避免程序反复运行constatomstr= procview varatom:integerbeginif globalfindatom(atomstr)= thenbeginatom:=globaladdatom(atomstr)with application dobeginInitializeTitle := 系统进程监控 CreateForm(TForm Form )Runendglobaldeleteatom(atom)endend }//单元文件procview pasunit procviewinterfaceusesWindows Messages SysUtils Classes Graphics Controls Forms Dialogs StdCtrls TLHelp Buttons ComCtrls ExtCtrls ShellAPI MyFlagconstPROCESS_TERMINATE= SYSTRAY_ID= WM_SYSTRAYMSG=WM_USER+ typeTForm = class(TForm)lvSysProc: TListViewlblSysProc: TLabellblAboutProc: TLabellvAboutProc: TListViewlblCountSysProc: TLabellblCountAboutProc: TLabelPanel : TPanelbtnDetermine: TButtonbtnRefresh: TButtonlblOthers: TLabellblEmail: TLabelMyFlag : TMyFlagprocedure btnRefreshClick(Sender: TObject)procedure btnDetermineClick(Sender: TObject)procedure lvSysProcClick(Sender: TObject)procedure FormCreate(Sender: TObject)procedure AppOnMinimize(Sender:TObject)procedure FormClose(Sender: TObjectvar Action: TCloseAction)procedure FormDeactivate(Sender: TObject)procedure lblEmailClick(Sender: TObject)procedure FormResize(Sender: TObject)private{ Private declarations }fshandle:thandleFormOldHeight FormOldWidth:Integerprocedure SysTrayOnClick(var message:TMessage)message WM_SYSTRAYMSGpublic{ Public declarations }endvarForm : TForm idid: dwordfp :tprocessentry fm :tmoduleentry SysTrayIcon:TNotifyIconDataimplementation{$R * DFM}function RegisterServiceProcess(dwProcessID dwType:integer):integerstdcallexternal KERNEL DLL procedure TForm btnRefreshClick(Sender: TObject)varclp:boolnewitem :TlistitemMyIcon:TIconIconIndex:wordProcFile : array[ MAX_PATH] of charbeginMyIcon:=TIcon createlvSysProc Items clearlvSysProc SmallImages clearfshandle:=CreateToolhelp Snapshot(th cs_snapprocess )fp dwsize:=sizeof(fp )clp:=process first(fshandle fp )IconIndex:= while integer(clp)<>dobeginif fp th processid<>getcurrentprocessid thenbeginnewitem :=ems add{newitem caption:=fp szexefileMyIcon Handle:=ExtractIcon(Form Handle fp szexefile )}StrCopy(ProcFile fp szExeFile)newitem caption:=ProcFileMyIcon Handle:=ExtractAssociatedIcon(HINSTANCE ProcFile IconIndex)if MyIcon Handle<>thenbeginwith lvSysProc dobeginNewItem ImageIndex:= *** allimages addicon(MyIcon)endendwith newitem subitems dobeginadd(IntToHex(fp th processid ))Add(IntToHex(fp th ParentProcessID ))Add(IntToHex(fp pcPriClassBase ))Add(IntToHex(tUsage ))Add(IntToStr(tThreads))endendclp:=process next(fshandle fp )endclosehandle(fshandle)lblCountSysProc caption:=IntToStr(unt)MyIcon Freeendprocedure TForm btnDetermineClick(Sender: TObject)varprocesshndle:thandlebeginwith lvSysProc dobeginif selected thenbeginmessagebox(form handle 请先选择要终止的进程! *** 作提示 MB_OK+MB_ICONINFORMATION)endelsebeginif messagebox(form handle pchar( 终止 +itemfocused caption+ ? ) 终止进程 mb_yesno+MB_ICONWARNING+MB_DEFBUTTON )=mryes thenbeginidid:=strtoint( $ +itemfocused subitems[ ])processhndle:=openprocess(PROCESS_TERMINATE bool( ) idid)if integer(terminateprocess(processhndle ))= thenmessagebox(form handle pchar( 不能终止 +itemfocused caption+ ! ) *** 作失败 mb_ok+MB_ICONERROR)elsebeginSelected DeletelvAboutProc Items ClearlblCountSysProc caption:=inttostr(unt)lblCountAboutProc caption:= endendendendendprocedure TForm lvSysProcClick(Sender: TObject)varnewitem :Tlistitemclp:boolbeginif lvSysProc selected<>nil thenbeginidid:=strtoint( $ +emfocused subitems[ ])ems Clearfshandle:=CreateToolhelp Snapshot(th cs_snapmodule idid)fm dwsize:=sizeof(fm )clp:=Module First(fshandle fm )while integer(clp)<>dobeginnewitem :=lvAboutProc Items addwith newitem dobegincaption:=fm szexepathwith newitem subitems dobeginadd(IntToHex(fm th moduleid ))add(IntToHex(fm GlblcntUsage ))add(IntToHex(fm proccntUsage ))endendclp:=Module Next(fshandle fm )endclosehandle(fshandle)lblCountAboutProc Caption:=IntToStr(unt)endendprocedure TForm FormCreate(Sender: TObject)beginwith application dobeginshowwindow(handle SW_HIDE)//隐藏任务栏上的任务按钮OnMinimize:=AppOnMinimize//最小化时自动隐藏OnDeactivate:=FormDeactivate//不活动时自动隐藏OnActivate:=btnRefreshClickendRegisterServiceProcess(GetcurrentProcessID )//将程序注册为系统服务程序 lishixinzhi/Article/program/Delphi/201311/24680

应用程序很高兴对所有这些活动一无所知。它只知道自己的虚拟地址空间。但是,如果当前在主存中的页面集(称为 驻留集)少于实际要使用的页面集(称为 工作集),应用程序的性能很快就会显著降低。(不幸的是,本文中您将看到,我们要讨论的工具常常交换使用这两个术语,尽管它们指的是完全不同的事物。)Task Manager 和 PerfMon我们首先考察两种最常见的工具:Task Manager 和 PerfMon。这两个工具都随 Windows 一起提供,因此由此起步比较容易。Task ManagerTask Manager 是一种非常见的 Windows 进程监控程序。您可以通过熟悉的 Ctrl-Alt-Delete 组合键来启动它,或者右击任务栏。Processes 选项卡显示了最详细的信息,如图 2 所示。图 2. Task Manager 进程选项卡图 2 中显示的列已经通过选择 View -->Select Columns 作了调整。有些列标题非常含糊,但可以在 Task Manager 帮助中找到各列的定义。和进程内存使用情况关系最密切的计数器包括:Mem Usage(内存使用):在线帮助将其称为进程的工作集(尽管很多人称之为驻留集)——当前在主存中的页面集。但是这个数值包含能够和其他进程共享的页面,因此要注意避免重复计算。比方说,如果要计算共享同一个 DLL 的两个进程的总内存占用情况,不能简单地把“内存使用”值相加。Peak Mem Usage(内存使用高峰值):进程启动以来 Mem Usage(内存使用)字段的最大值。Page Faults(页面错误):进程启动以来要访问的页面不在主存中的总次数。VM Size(虚拟内存大小):联机帮助将其称为“分配给进程私有虚拟内存总数。”更确切地说,这是进程所 提交的内存。如果进程保留内存而没有提交,那么该值就与总地址空间的大小有很大的差别。虽然 Windows 文档将 Mem Usage(内存使用)称为工作集,但在该上下文中,它实际上指的是很多人所说的驻留集(resident set),明白这一点很重要。您可以在 Memory Management Reference 术语表(请参阅 参考资料)中找到这些术语的定义。 工作集 更通常的含义指的是一个逻辑概念,即在某一点上为了避免分页 *** 作,进程需要驻留在内存中的那些页面。PerfMon随 Windows 一起提供的另一种 Microsoft 工具是 PerfMon,它监控各种各样的计数器,从打印队列到电话。PerfMon 通常在系统路径中,因此可以在命令行中输入 perfmon 来启动它。这个工具的优点是以图形化的方式显示计数器,很容易看到计数器随时间的变化情况。请在 PerfMon 窗口上方的工具栏中单击 + 按钮,这样会打开一个对话框让您选择要监控的计数器,如图 3a 所示。计数器按照 性能对象分成不同的类别。与内存使用关系最密切的两个类是 Memory 和 Process。选中计数器然后单击 Explain 按钮,就可以看到计数器的定义。说明出现在主对话框下方d出的单独的窗口中。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11749573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存