Windows下的进程管理和监控器分解.docx
- 文档编号:24934380
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:38
- 大小:1.40MB
Windows下的进程管理和监控器分解.docx
《Windows下的进程管理和监控器分解.docx》由会员分享,可在线阅读,更多相关《Windows下的进程管理和监控器分解.docx(38页珍藏版)》请在冰豆网上搜索。
Windows下的进程管理和监控器分解
操作系统安全课程设计报告
Windows下的进程管理和监控器
一、概述
1.设计主要完成的任务
设计一个Windows或Linux下的进程管理与监控程序,要求该程序完成以下功能:
(1)可获取当前正在运行的所有进程,包括进程PID、进程名称、CPU使用情况、当前用户名、内存占用量等;
(2)能进一步获取各进程的所有线程情况;
(3)能通过命令终止某个进程的执行,终止时能将其子孙进程全部终止;
(4)要求界面友好。
2.解决的主要问题
我们的电脑需要我们去了解它的运行状况,掌握和管理它的进程,并对其异常情况给予操作和控制,任务管理器就像是我们了解和控制自己电脑运作的一个窗口,通过这个窗口我们可以了解到电脑所有进程运行状况,并对运行的进程加于管理和控制。
本管理器设计比较简洁,操作灵活,使用简单,可以为我们管理和控制计算机的进程提供了一个简便的方法,是我们控制本计算机进程和了解计算机进程情况的良好助手。
二、设计的基本概念和原理
1.概念
在本实验中,启动进程管理器后,可以通过”获取进程”功能来获得本计算机启动的进程,以及与该进程相关的信息,其中包括的信息有:
进程映像名称,进程开启的线程数,进程的PID以及进程的优先数,我们可以通过这些信息来了解计算机中每个进程的使用状况。
同时我们可以在进程管理器上选中一个要终止的的进程,点击“终止进程”功能按钮,该进程被终止执行并退出进程列表,其中还包括了自动刷新的功能,此按钮实现的功能正如我们电脑任务管理器的“进程”功能,当电脑执行程序不能通过关闭窗口进行正常的关闭时,可以借助此办法来关闭进程。
我们还可以通过这个进程管理器来启动新的进程,当我们要在进程管理器里启动新的进程时,只要点击“启动新进程”按键,则会弹出“打开进程”对话框,我们可以通过对话框里的“浏览”窗口选择要打开的新进程,这是任务管理器里没有实现的功能,通过这个功能我们在管理计算机时变得更加灵活方便,也使进程管理的功能更加完善。
在退出此进程管理器时候,只要选择“退出”功能按钮则可关闭进程管理器,快速退出管理器的界面。
2.原理
在VisualStudio环境设计一个基于对话框的应用程序,类似于Windows自带的任务管理器,主窗口上添加一个标签控件,加入四个页面,分别是:
窗口信息、进程,服务和性能。
其中,窗口信息显示当前正在运行的任务,用列表控件进行显示,并能够对任务进行操作,如:
添加新任务,结束任务,切换任务等。
进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并能够实行终止进程、进程列表保存到文件等操作。
性能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并绘制CPU使用率和内存使用率的图形,并用列表控件显示系统当前信息。
三、总体设计
Windows任务管理器
实时状态监控
进程数
进程、线程状态
CPU状态
内存使用状态
性能
功能设计
文件
选项
关机
帮助
进程
新建任务、退出管理器
总在最前
关机、注销
关于
新建、切换进程、关闭进程
1.功能模块
2.流程图
四、详细设计
主要功能的代码实现:
获得进程代码实现
PublicSubListProcess()
OnErrorResumeNext
DimiAsLong,jAsLong,nAsLong
DimprocAsPROCESSENTRY32
DimsnapAsLong
DimexenameAsString'应用程序名
DimitemAsListItem
DimlngHwndProcessAsLong
DimlngModules(1To200)AsLong
DimlngCBSize2AsLong
DimlngReturnAsLong
DimstrModuleNameAsString
DimpmcAsPROCESS_MEMORY_COUNTERS
DimWKSizeAsLong
DimstrProcessNameAsString
DimstrCommentAsString'装载进程注释的字符串
DimProClassAsString'程序的类名
'开始进程循环
snap=CreateToolhelpSnapshot(TH32CS_SNAPall,0)
proc.dwSize=Len(proc)
theloop=ProcessFirst(snap,proc)
i=0
n=0
Whiletheloop<>0
i=i+1
'打开指定的进程序,并得到进程的句柄
lngHwndProcess=OpenProcess(PROCESS_QUERY_INFORMATIONOrPROCESS_VM_READ,0,proc.th32ProcessID)
IflngHwndProcess<>0Then
'枚举系统中正在运行的进程模板
lngReturn=EnumProcessModules(lngHwndProcess,lngModules
(1),200,lngCBSize2)
IflngReturn<>0Then
'返回特定数目空格的
strModuleName=Space(MAX_PATH)
'获取一个已装载模板的完整路径名称
lngReturn=GetModule(lngHwndProcess,lngModules
(1),strModuleName,500)
strProcessName=Left(strModuleName,lngReturn)
strProcessName=CheckPath(Trim$(strProcessName))
IfstrProcessName<>""Then
'判断ITEM是否已经存在
j=HaveItem(proc.th32ProcessID)
Ifj=0Then'如果没有该进程
'获取短文件名
exename=Dir(strProcessName,vbNormalOrvbHiddenOrvbReadOnlyOrvbSystem)
Ifexename="hh.exe"Then
'MsgBoxSetProClass(proc.th32ProcessID,IDLE_PRIORITY_CLASS)
EndIf
'添加进程item
Setitem=List1.ListItems.Add(,"ID:
"&CStr(proc.th32ProcessID),exename)
'进程ID
item.SubItems
(1)=proc.th32ProcessID
'内存使用
pmc.cb=LenB(pmc)
'获得进程的内存信息,在这里就是计算该进程占用内存多少
lret=GetProcessMemoryInfo(lngHwndProcess,pmc,pmc.cb)
n=n+pmc.WorkingSetSize
WKSize=pmc.WorkingSetSize/1024
item.SubItems(3)=WKSize&"K"
'进程序IP号
item.SubItems
(2)=GetProClass(proc.th32ProcessID)
'进程图标将获取的图标加到IMAGE控件中
IM1.ListImages.Add,strProcessName,GetIcon(strProcessName)
item.SmallIcon=IM1.ListImages.item(strProcessName).Key
Else'如果已经有该进程
pmc.cb=LenB(pmc)
'获得进程的内存信息,在这里就是计算该进程占用内存多少
lret=GetProcessMemoryInfo(lngHwndProcess,pmc,pmc.cb)
n=n+pmc.WorkingSetSize
WKSize=pmc.WorkingSetSize/1024'计算占用内存
IfCLng(List1.ListItems.item(j).SubItems(3))<>WKSizeThenList1.ListItems.item(j).SubItems(3)=WKSize&"K"
'获得进程的类名
ProClass=GetProClass(proc.th32ProcessID)
IfProClass<>List1.ListItems.item(j).SubItems(5)ThenList1.ListItems.item(j).SubItems(5)=ProClass
EndIf
EndIf
EndIf
EndIf
theloop=ProcessNext(snap,proc)
Wend
CloseHandlesnap
'显示总进程数Label3
Ifi<>ProCountThen
Label3.Caption="进程数:
"&i
ProCount=i
EndIf
Ifn<>RamUseThen'这里的"130"是后来加上去的.是为了和系统自带的数值一样
Label5.Caption=Val(FormatLng(n))+130&"MB"
RamUse=n
Fori=950ToVal(FormatLng(n))+400Step-90
rampic.Line(0,i)-Step(1200,20),&HFF00&,BF
Nexti
EndIf
EndSub
'调用系统的"关于"窗
PrivateSubabout_Click()
OnErrorResumeNext
ShellAboutMe.hwnd,App.Title,"谭建&文程&张源",ByVal0&
EndSub
'退出本程序员
PrivateSubclose_Click()
tmrRefresh.Enabled=False
UnloadMe
EndSub
PrivateSubCloseSystem_Click()
tmrRefresh.Enabled=False
UnloadMe
EndSub
'应用程序切换程序
PrivateSubcmdSwitch_Click()
DimhwndAsLong
DimXAsLong
DimlngWWAsLong
IfLstApp.ListIndex<0ThenBeep:
ExitSub
hwnd=LstApp.ItemData(LstApp.ListIndex)
'取得窗口的结构信息
lngWW=GetWindowLong(hwnd,GWL_STYLE)
IflngWWAndWS_MINIMIZEThen
'控制窗口的可见性
X=ShowWindow(hwnd,SW_RESTORE)
EndIf
'指定一个窗口新的位置'第2个参数:
将窗口置于Z序列的顶部.
X=SetWindowPos(hwnd,HWND_TOP,0,0,0,0,_
SWP_NOMOVEOrSWP_NOSIZEOrSWP_SHOWWINDOW)
EndSub'保持当前位置或保持当前大小或显示窗口
'弹出"新建任务"窗
PrivateSubCommand1_Click()
frmnew.ShowvbModal
EndSub
'结束应用程序
'还有就是在如果列表中没有活动程序,点击"结束程序"会退出本身
PrivateSubCommand3_Click()
OnErrorResumeNext
'IfLstApp.ListCount=0Then
'应用程序的类名,和程序的标题
DimlpclassnameAsString,lpcaptionAsString
'程序的句柄号
DimHandleAsLong
DimRetvalAsLong
'先是打开要关闭的程序,其它就是将该程序显示成当前程序
ShellLstApp.Text,1
lpclassname=LstApp.Text
lpcaption=LstApp.Text
'获得程序的句柄号
Handle=FindWindow(vbNullString,lpcaption)
'用函数关闭应用程序
PostMessageHandle,WM_Close,0&,0&
'所了和列表控件一至,在这里删除列表中的该进程名
LstApp.RemoveItemLstApp.ListIndex
LstApp.refresh
'刷新
FindAllApps
EndSub
'结束指定进程功能代码实现
PrivateSubCommand4_Click()
OnErrorResumeNext
DimiAsLong,handAsLong,idAsLong
IfMsgBox("确定要结束进程"&List1.SelectedItem.Text&"吗?
",vbExclamation+vbOKCancel)=vbCancelThenExitSub
id=CLng(List1.SelectedItem.SubItems
(1))
Ifid<>0Then
EndProid
EndIf
ListProcess
EndSub
PrivateSubCommand5_Click()
DimAboutRetAsLong
AboutRet=ExitWindowsEx(EWX_LOGOFF,0)
EndSub
'注销用户功能实现
PrivateSubCommand6_Click()
DimAboutRetAsLong
AboutRet=ExitWindowsEx(EWX_LOGOFF,0)
EndSub
'切换至功能实现
PrivateSubcutoverto_Click()
cmdSwitch_Click
Me.WindowState=1
EndSub
'改变进程显示方式
PrivateSubDetailed_Click()
List1.View=lvwReport
EndSub
'结束应用程序功能实现
PrivateSubendprograme_Click()
Command3_Click
EndSub
'关机功能实现
PrivateSubExit_Click()
frmclose.ShowvbModal
EndSub
'CPU效率监视
CpuPicture(0).ScaleMode=vbPixels
CpuPicture
(1).ScaleMode=vbPixels
SetQueryObject=NewCCpuwatch
'对象初始化
QueryObject.Initialize
'打开时间控件
tmrRefresh.Enabled=True
'调用刷新过程
tmrRefresh_Timer
'*****************************************
'获得所有系统进程
ListProcess
'窗体总在前
SetTopMe,front.Checked
'***************************************************
'获得系统的当前用户
cnt&=199
s$=String$(200,0)
dl&=GetUserName(s$,cnt)
Setitem=ListView3.ListItems.Add(,,s$,,2)
item.SubItems
(2)="正在运行..."
item.SubItems
(1)=WorkstationID
'设置系统托盘
IfWindowState=vbMinimizedThen
LastState=vbNormal
Else
LastState=WindowState
EndIf
AddToTrayMe,Tray
EndSub
PrivateSubForm_Resize()
SelectCaseWindowState
CasevbMinimized
Me.Visible=False
CasevbMaximized
Me.Visible=True
EndSelect
IfWindowState<>vbMinimizedThen
LastState=WindowState
Me.Visible=True
EndIf
EndSub
PrivateSubForm_Unload(CancelAsInteger)
RemoveFromTray'关闭托盘
tmrRefresh.Enabled=False
UnloadMe
EndSub
PrivateSubfront_Click()
front.Checked=Notfront.Checked
SetTopMe,front.Checked
EndSub
PrivateSubjsjc_Click()
Command4_Click
EndSub
PrivateSubList1_ColumnClick(ByValColumnHeaderAsMSComctlLib.ColumnHeader)
OnErrorResumeNext
WithList1
'设置Sorted为True以将列表排序。
If(ColumnHeader.Index-1)=.SortKeyThen
.SortOrder=(.SortOrder+1)Mod2
.Sorted=True
Else
.Sorted=False
.SortOrder=0
.SortKey=ColumnHeader.Index-1
.Sorted=True
EndIf
EndWith
EndSub
'右击菜单;,,并初使化进程的优先级别
PrivateSubList1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,yAsSingle)
OnErrorResumeNext
DimjAsLong,iAsLong
IfButton=2Then
IfList1.HitTest(X,y)IsNothingThenExitSub
j=List1.HitTest(X,y).Index
List1.ListItems(j).Selected=True
Fori=0To5
mnuSetProClassSub(i).Checked=False
Next
SelectCaseList1.SelectedItem.SubItems
(2)
Case"实时":
mnuSetProClassSub(0).Checked=True
Case"高":
mnuSetProClassSub
(1).Checked=True
Case"较高":
mnuSetProClassSub
(2).Checked=True
Case"标准":
mnuSetProClassSub(3).Checked=True
Case"较低":
mnuSetProClassSub(4).Checked=True
Case"低":
mnuSetProClassSub(5).Checked=True
EndSelect
PopupMenuyou
EndIf
EndSub
PrivateSublog_Click()
frmclose.ShowvbModal
EndSub
'双击切换到另一个程序
SublstApp_DblClick()
cmdSwitch.Value=True
EndSub
'任务窗
FunctionTaskWindow(hwCurrAsLong)AsLong
DimlngStyleAsLong
'调用函数得到指定窗口的信息'第一个参数是指定窗口的句柄,第二个是窗口的样式
lngStyle=GetWindowLong(hwCurr,GWL_STYLE)
If(lngStyleAndIsTask)=IsTaskThenTaskWindow=True
EndFunction
'设置进程优先级
PublicFunctionSetProClass(ByValPIDAsLong,ByValClassIDAsLong)
OnErrorResumeNext
DimhwdAsLong
'在这里得到一个句柄
hwd=OpenProcess(PROCESS_SET_INFORMATION,0,PID)
'调用这个函数设置进程的优先级
SetProClass=SetPriorityClass(hwd,ClassID)
EndFunction
'右键菜单
PrivateSubLstApp_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,yAsSingle)
IfButton=2Then
PopupMenuApplication
EndIf
EndSub
'在这里设置进程优先级
PrivateSubmnuSetProClassSub_Click(IndexAsInteger)
OnErrorResumeNext
DimPIDAsLong,rtnAsLong
PID=CLng(List1.SelectedItem.SubItems
(1))'得到进程PID
IfmnuSetProClassSub(Index).Checked=TrueThenExitSub
SelectCaseIndex
Case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 进程 管理 监控器 分解