当前位置:文档之家› Windows下的进程管理和监控器分解

Windows下的进程管理和监控器分解

操作系统安全课程设计报告Windows下的进程管理和监控器目录操作系统安全课程设计报告 0一、概述 (2)1.设计主要完成的任务 (2)2.解决的主要问题 (2)二、设计的基本概念和原理 (2)1.概念 (2)2.原理 (2)三、总体设计 (3)1.功能模块 (3)2.流程图 (3)四、详细设计 (4)主要功能的代码实现: (4)五、完成的情况以及使用说明 (22)六、总结 (33)七、参考文献 (34)一、概述1.设计主要完成的任务设计一个Windows或Linux下的进程管理与监控程序,要求该程序完成以下功能:(1)可获取当前正在运行的所有进程,包括进程PID、进程名称、CPU使用情况、当前用户名、内存占用量等;(2)能进一步获取各进程的所有线程情况;(3)能通过命令终止某个进程的执行,终止时能将其子孙进程全部终止;(4)要求界面友好。

2.解决的主要问题我们的电脑需要我们去了解它的运行状况,掌握和管理它的进程,并对其异常情况给予操作和控制,任务管理器就像是我们了解和控制自己电脑运作的一个窗口,通过这个窗口我们可以了解到电脑所有进程运行状况,并对运行的进程加于管理和控制。

本管理器设计比较简洁,操作灵活,使用简单,可以为我们管理和控制计算机的进程提供了一个简便的方法,是我们控制本计算机进程和了解计算机进程情况的良好助手。

二、设计的基本概念和原理1.概念在本实验中,启动进程管理器后,可以通过”获取进程”功能来获得本计算机启动的进程,以及与该进程相关的信息,其中包括的信息有:进程映像名称,进程开启的线程数,进程的PID以及进程的优先数,我们可以通过这些信息来了解计算机中每个进程的使用状况。

同时我们可以在进程管理器上选中一个要终止的的进程,点击“终止进程”功能按钮,该进程被终止执行并退出进程列表,其中还包括了自动刷新的功能,此按钮实现的功能正如我们电脑任务管理器的“进程”功能,当电脑执行程序不能通过关闭窗口进行正常的关闭时,可以借助此办法来关闭进程。

我们还可以通过这个进程管理器来启动新的进程,当我们要在进程管理器里启动新的进程时,只要点击“启动新进程”按键,则会弹出“打开进程”对话框,我们可以通过对话框里的“浏览”窗口选择要打开的新进程,这是任务管理器里没有实现的功能,通过这个功能我们在管理计算机时变得更加灵活方便,也使进程管理的功能更加完善。

在退出此进程管理器时候,只要选择“退出”功能按钮则可关闭进程管理器,快速退出管理器的界面。

2.原理在VisualStudio环境设计一个基于对话框的应用程序,类似于Windows自带的任务管理器,主窗口上添加一个标签控件,加入四个页面,分别是:窗口信息、进程,服务和性能。

其中,窗口信息显示当前正在运行的任务,用列表控件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务等。

进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并能够实行终止进程、进程列表保存到文件等操作。

性能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并绘制CPU使用率和内存使用率的图形,并用列表控件显示系统当前信息。

三、总体设计1.功能模块2.流程图四、详细设计主要功能的代码实现:获得进程代码实现Public Sub ListProcess()On Error Resume NextDim i As Long, j As Long, n As LongDim proc As PROCESSENTRY32Dim snap As LongDim exename As String '应用程序名Dim item As ListItemDim lngHwndProcess As LongDim lngModules(1 To 200) As LongDim lngCBSize2 As LongDim lngReturn As LongDim strModuleName As StringDim pmc As PROCESS_MEMORY_COUNTERS Dim WKSize As LongDim strProcessName As StringDim strComment As String '装载进程注释的字符串Dim ProClass As String '程序的类名'开始进程循环snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)proc.dwSize = Len(proc)theloop = ProcessFirst(snap, proc)i = 0n = 0While theloop <> 0i = i + 1'打开指定的进程序,并得到进程的句柄lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMA TION Or PROCESS_VM_READ, 0, proc.th32ProcessID)If lngHwndProcess <> 0 Then'枚举系统中正在运行的进程模板lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)If lngReturn <> 0 Then'返回特定数目空格的strModuleName = Space(MAX_PATH)'获取一个已装载模板的完整路径名称lngReturn = GetModule(lngHwndProcess, lngModules(1), strModuleName, 500) strProcessName = Left(strModuleName, lngReturn)strProcessName = CheckPath(Trim$(strProcessName))If strProcessName <> "" Then'判断ITEM是否已经存在j = HaveItem(proc.th32ProcessID)If j = 0 Then '如果没有该进程'获取短文件名exename = Dir(strProcessName, vbNormal Or vbHidden Or vbReadOnly Or vbSystem)If exename = "hh.exe" Then'MsgBox SetProClass(proc.th32ProcessID,IDLE_PRIORITY_CLASS)End If'添加进程itemSet item = List1.ListItems.Add(, "ID:" & CStr(proc.th32ProcessID), exename)'进程IDitem.SubItems(1) = proc.th32ProcessID'内存使用pmc.cb = LenB(pmc)'获得进程的内存信息,在这里就是计算该进程占用内存多少lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb)n = n + pmc.WorkingSetSizeWKSize = pmc.WorkingSetSize / 1024item.SubItems(3) = WKSize & " K"'进程序IP号item.SubItems(2) = GetProClass(proc.th32ProcessID)'进程图标将获取的图标加到IMAGE控件中IM1.ListImages.Add , strProcessName, GetIcon(strProcessName)item.SmallIcon = IM1.ListImages.item(strProcessName).KeyElse '如果已经有该进程pmc.cb = LenB(pmc)'获得进程的内存信息,在这里就是计算该进程占用内存多少lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb)n = n + pmc.WorkingSetSizeWKSize = pmc.WorkingSetSize / 1024 '计算占用内存If CLng(List1.ListItems.item(j).SubItems(3)) <> WKSize Then List1.ListItems.item(j).SubItems(3) = WKSize & " K"'获得进程的类名ProClass = GetProClass(proc.th32ProcessID)If ProClass <>List1.ListItems.item(j).SubItems(5) Then List1.ListItems.item(j).SubItems(5) = ProClassEnd IfEnd IfEnd IfEnd Iftheloop = ProcessNext(snap, proc)WendCloseHandle snap'显示总进程数Label3If i <> ProCount ThenLabel3.Caption = "进程数:" & iProCount = iEnd IfIf n <> RamUse Then '这里的"130"是后来加上去的.是为了和系统自带的数值一样Label5.Caption = Val(FormatLng(n)) + 130 & "MB"RamUse = nFor i = 950 To V al(FormatLng(n)) + 400 Step -90rampic.Line (0, i)-Step(1200, 20), &HFF00&, BFNext iEnd IfEnd Sub'调用系统的"关于"窗Private Sub about_Click()On Error Resume NextShellAbout Me.hwnd, App.Title, "谭建&文程&张源", ByVal 0&End Sub'退出本程序员Private Sub close_Click()tmrRefresh.Enabled = FalseUnload MeEnd SubPrivate Sub CloseSystem_Click()tmrRefresh.Enabled = FalseUnload MeEnd Sub'应用程序切换程序Private Sub cmdSwitch_Click()Dim hwnd As LongDim X As LongDim lngWW As LongIf LstApp.ListIndex < 0 Then Beep: Exit Subhwnd = LstApp.ItemData(LstApp.ListIndex)'取得窗口的结构信息lngWW = GetWindowLong(hwnd, GWL_STYLE)If lngWW And WS_MINIMIZE Then'控制窗口的可见性X = ShowWindow(hwnd, SW_RESTORE)End If'指定一个窗口新的位置'第2个参数:将窗口置于Z序列的顶部. X = SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, _SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW) End Sub '保持当前位置或保持当前大小或显示窗口'弹出"新建任务"窗Private Sub Command1_Click()frmnew.Show vbModalEnd Sub'结束应用程序'还有就是在如果列表中没有活动程序,点击"结束程序"会退出本身Private Sub Command3_Click()On Error Resume Next'If LstApp.ListCount = 0 Then'应用程序的类名,和程序的标题Dim lpclassname As String, lpcaption As String'程序的句柄号Dim Handle As LongDim Retval As Long'先是打开要关闭的程序,其它就是将该程序显示成当前程序Shell LstApp.Text, 1lpclassname = LstApp.Textlpcaption = LstApp.Text'获得程序的句柄号Handle = FindWindow(vbNullString, lpcaption)'用函数关闭应用程序PostMessage Handle, WM_Close, 0&, 0&'所了和列表控件一至,在这里删除列表中的该进程名LstApp.RemoveItem LstApp.ListIndexLstApp.refresh'刷新FindAllAppsEnd Sub'结束指定进程功能代码实现Private Sub Command4_Click()On Error Resume NextDim i As Long, hand As Long, id As LongIf MsgBox("确定要结束进程" & List1.SelectedItem.Text & " 吗?", vbExclamation + vbOKCancel) = vbCancel Then Exit Subid = CLng(List1.SelectedItem.SubItems(1))If id <> 0 ThenEndPro idEnd IfListProcessEnd SubPrivate Sub Command5_Click()Dim AboutRet As LongAboutRet = ExitWindowsEx(EWX_LOGOFF, 0) End Sub'注销用户功能实现Private Sub Command6_Click()Dim AboutRet As LongAboutRet = ExitWindowsEx(EWX_LOGOFF, 0) End Sub'切换至功能实现Private Sub cutoverto_Click()cmdSwitch_ClickMe.WindowState = 1End Sub'改变进程显示方式Private Sub Detailed_Click()List1.View = lvwReportEnd Sub'结束应用程序功能实现Private Sub endprograme_Click()Command3_ClickEnd Sub'关机功能实现Private Sub Exit_Click()frmclose.Show vbModalEnd Sub'CPU效率监视CpuPicture(0).ScaleMode = vbPixelsCpuPicture(1).ScaleMode = vbPixelsSet QueryObject = New CCpuwatch'对象初始化QueryObject.Initialize'打开时间控件tmrRefresh.Enabled = True'调用刷新过程tmrRefresh_Timer'*****************************************'获得所有系统进程ListProcess'窗体总在前SetTop Me, front.Checked'*************************************************** '获得系统的当前用户cnt& = 199s$ = String$(200, 0)dl& = GetUserName(s$, cnt)Set item = ListView3.ListItems.Add(, , s$, , 2)item.SubItems(2) = "正在运行..."item.SubItems(1) = WorkstationID'设置系统托盘If WindowState = vbMinimized ThenLastState = vbNormalElseLastState = WindowStateEnd IfAddToTray Me, TrayEnd SubPrivate Sub Form_Resize()Select Case WindowStateCase vbMinimizedMe.Visible = FalseCase vbMaximizedMe.Visible = TrueEnd SelectIf WindowState <> vbMinimized ThenLastState = WindowStateMe.Visible = TrueEnd IfEnd SubPrivate Sub Form_Unload(Cancel As Integer)RemoveFromTray '关闭托盘tmrRefresh.Enabled = FalseUnload MeEnd SubPrivate Sub front_Click()front.Checked = Not front.CheckedSetTop Me, front.CheckedEnd SubPrivate Sub jsjc_Click()Command4_ClickEnd SubPrivate Sub List1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) On Error Resume NextWith List1'设置Sorted 为True 以将列表排序。

相关主题