任务管理器详细开发过程_第1页
任务管理器详细开发过程_第2页
任务管理器详细开发过程_第3页
任务管理器详细开发过程_第4页
任务管理器详细开发过程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、制作自己的任务管理器设计和实现说明一背景介绍模仿windows任务管理器制作一个任务管理器软件。设计语言不限。二知识要求Windows编程,MFC编程,API调用三开发环境使用Microsoft Visual Studio 2013的开发环境,模拟Windows的任务管理器。首先分析进程管理器软件的相关功能;其次,综合运用以前所学的相关知识,广泛查阅资料。四主要功能及实现思路4.1设计要求实现的主要功能进程管理功能,具体包括以下内容:(1) 使用系统API。(2) 制作出相应的图形用户界面。(3) 至少包括三个功能:Ø 获取、显示、控制(结束任务)当前系统中的应用程序;Ø

2、获取、显示、控制(结束进程)当前系统中的进程;Ø 获取、显示当前系统CPU及内存的使用情况。4.2实现思路4.2.1界面设计所设计的程序是基于对话框的程序。首先创建一个MFC的应用程序, 在主对话框类中添加一个TabContrl标签控件用于放置应用程序、进程和CPU信息三个页面, 子对话框的显示与切换,是通过标签控件完成的。当用户点击标签控件上的每一项时,分别显示对应页面的相关信息。要显示三个子对话框,需要添加三个对话框到工程中,并将Style属性设为Child,Board设为None,取消标题栏。再分别创建三个对话框的类CTask ,CProcess,CChart,并定义这三个类的

3、变量:CTask m_Task; /任务CProcess m_Process; /进程CChart m_Chart; /图表接下来就创建子窗口:m_Tab.InsertItem(0, _T("应用程序"), 60);/向tab控件中添加每个参数选项卡的值m_Tab.InsertItem(1, _T("进程信息"), 60);m_Tab.InsertItem(2, _T("CPU信息"), 60);/关联对话框,让tab控件为父窗口m_Task.Create(IDD_TASK, &m_Tab);m_Process.Create(

4、IDD_PROCESS, &m_Tab);m_Chart.Create(IDD_CHART, &m_Tab);当用户选择标签中的一项是,为了将对应的对话框在标签控件中显示出来,需要在OnShowWindow(BOOL bShow,UINT nStatus)中添加代码相关代码。这样便可将在个对话框分别显示于标签控件的每个页面中,但要实现选择标签的不同项显示不同页面还需在OnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)添加显示代码。核心代码如下:void CTaskMgrDlg:OnSelchangeTab1(NMHDR *pNMHD

5、R, LRESULT *pResult)/ TODO: 在此添加控件通知处理程序代码*pResult = 0;CRect tabRect;m_Tab.GetClientRect(&tabRect);tabRect.top += 20;tabRect.left += 1;tabRect.right += 1;tabRect.bottom += 1;switch (m_Tab.GetCurSel()/根据鼠标选择的标签进行显示相应的对话框case 0:m_Task.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(),

6、tabRect.Height(), SWP_SHOWWINDOW);/SWP_SHOWWINDOW:显示窗口m_Process.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);/SWP_HIDEWINDOW:隐藏窗口m_Chart.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);break;case 1:m

7、_Task.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);m_Process.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);m_Chart.SetWindowPos(NULL,tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SW

8、P_HIDEWINDOW);break;case 2:m_Task.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);m_Process.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);m_Chart.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.

9、Width(), tabRect.Height(), SWP_SHOWWINDOW);break;default:break;4.2.2有关应用程序的功能实现查看应用程序:EnumWindowsProc函数参数hwnd:顶层窗口句柄。lParam:指定在EnumWindows或EnumDesktopWindows中的应用程序定义值。返回值为继续列表,回调函数必须返回TRUE;若停止列表,它必须返回FALSE。备注应用程序必须通过传递给EnumWindows或EnumDesktopWindows应用程序地址来注册这个回调函数。EnumWindows函数函数功能 该函数枚举所有屏幕上的顶层窗口,并

10、将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。 函数原型 BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam); 参数: lpEnumFunc:指向一个应用程序定义的回调函数指针,请参看EnumWindowsProc。 lPararm:指定一个传递给回调函数的应用程序定义值。 回调函数原型BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)if (:IsWindow(hWnd) &&am

11、p; :IsWindowVisible(hWnd) && (GetWindowLong(hWnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW) != WS_EX_TOOLWINDOW) &&(GetWindowLong(hWnd, GWL_HWNDPARENT) = 0)/判断条件TCHAR WindowTitle100 = 0 ;:GetWindowText(hWnd, WindowTitle, 100);int m = n+;bufm = WindowTitle;DWORD dwProcessID = 0;dwProcessID =

12、 GetWindowThreadProcessId(hWnd, &dwProcessID);idm.Format(_T("%d"), dwProcessID);HDm = hWnd;return true;结束应用程序根据应用程序的生命周期,以及窗口的消息循环,当关闭窗口或者应用程序(就是点上面的叉号),发出WM_CLOSE消息,但是translatemessage函数,进入while消息循环,被默认的情况进行处理,最后:PostMessage()函数接受消息,发送WM_QUIT消息,窗口关闭,程序结束。;源码实现:void CTask:OnBnClickedEnd

13、app()/ TODO: 在此添加控件通知处理程序代码CString str;int iRow = m_taskList.GetSelectionMark();str = m_taskList.GetItemText(iRow, 1);for (int i = n; i >= 1; i-)if (str = idi):PostMessage(HDi, WM_QUIT, 0, 0);/向结束的应用程序进行发送WM_QUIT消息break;4.2.3有关进程的功能实现查看进程:这个主要是用到TlHelp32.h头文件里有关进程的定义。在创建进程快照时,首先,定义一个进程结构体,然后在创建PR

14、OCESSENTRY32 procList;/这是一个进程结构体procList.dwSize = sizeof(PROCESSENTRY32);/在使用这个结构体之前先定义这个结构体的大小HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);应用到的函数:CreateToolhelp32Snapshot函数通过获取进程信息为指定的进程、进程使用的堆HEAP、模块MODULE、线程建立一个快照.说到底,可以获取系统中正在运行的进程信息,线程信息,等HANDLE WINAPI CreateToolhelp32Snap

15、shot(DWORD dwFlags, /用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等DWORD th32ProcessID /一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0Process32First(),Process32Next()函数用来遍历进程结束进程:TerminateProcessBOOL TerminateProcess(HANDLE hProcess,/进程句柄UINT uExitCode /进程终止码);4.2.4有关CPU的功能实现查看CPU的利用率利用率的介绍:CP

16、U在t1到t2时间段即时利用率 =  1 - CPU空闲使用时间 / CPU总的使用时间核心代码:res = GetSystemTimes(&idleTime, &kernelTime, &userTime);preidleTime = idleTime;/系统是空闲的时间prekernelTime = kernelTime;/;/FILETIME结构指针接收系统的时间花费在内核模式执行preuserTime = userTime;/FILETIME结构指针接收系统的时间花了在用户模式下执行hEvent = CreateEvent(NULL, FALSE, F

17、ALSE, NULL); / 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaledWaitForSingleObject(hEvent, 1000); /res = GetSystemTimes(&idleTime, &kernelTime, &userTime);int idle = CompareFileTime(preidleTime, idleTime);int kernel = CompareFileTime(prekernelTime, kernelTime);int user = CompareFileTime(preuser

18、Time, userTime);int cpu = (kernel + user - idle) * 100 / (kernel + user);/CPU利用率int cpuidle = (idle)* 100 / (kernel + user);/CPU空闲率画图:主要用到的是CPen类画图函数:void CChart:DrawWaveCPU(CDC* pCD, CRect& rectPicture)float fDeltaX; / x轴相邻两个绘图点的坐标距离 float fDeltaY; / y轴每个逻辑单位对应的坐标值 int nX; / 在连线时用于存储绘图点的横坐标 int

19、 nY; / 在连线时用于存储绘图点的纵坐标 CPen newPen; / 用于创建新画笔 CPen *pOldPen; / 用于存放旧画笔 CBrush newBrush; / 用于创建新画刷 CBrush *pOldBrush; / 用于存放旧画刷 / 计算fDeltaX和fDeltaY fDeltaX = (float)rectPicture.Width() / (POINT_COUNT - 1);fDeltaY = (float)rectPicture.Height() / 80;/ 创建黑色新画刷 newBrush.CreateSolidBrush(RGB(0, 0, 0);/ 选择

20、新画刷,并将旧画刷的指针保存到pOldBrush pOldBrush = pCD->SelectObject(&newBrush);/ 以黑色画刷为绘图控件填充黑色,形成黑色背景 pCD->Rectangle(rectPicture);/ 恢复旧画刷 pCD->SelectObject(pOldBrush);/ 删除新画刷 newBrush.DeleteObject();/ 创建实心画笔,粗度为1,颜色为绿色 newPen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0);/ 选择新画笔,并将旧画笔的指针保存到pOldPen pOldPen = pCD->SelectObject(&newPen);/ 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点 pCD->MoveTo(rectPicture.left, rectPicture.bottom);/ 计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线 for (int i = 0; i < POINT_COUNT; i+)nX = rectPicture.left + (int)(i * fDeltaX);nY = rectPicture.bottom - (int)(m_nzValuesi * f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论