任务管理器详细开发过程Word格式.docx

上传人:b****2 文档编号:4777594 上传时间:2023-05-04 格式:DOCX 页数:11 大小:19.94KB
下载 相关 举报
任务管理器详细开发过程Word格式.docx_第1页
第1页 / 共11页
任务管理器详细开发过程Word格式.docx_第2页
第2页 / 共11页
任务管理器详细开发过程Word格式.docx_第3页
第3页 / 共11页
任务管理器详细开发过程Word格式.docx_第4页
第4页 / 共11页
任务管理器详细开发过程Word格式.docx_第5页
第5页 / 共11页
任务管理器详细开发过程Word格式.docx_第6页
第6页 / 共11页
任务管理器详细开发过程Word格式.docx_第7页
第7页 / 共11页
任务管理器详细开发过程Word格式.docx_第8页
第8页 / 共11页
任务管理器详细开发过程Word格式.docx_第9页
第9页 / 共11页
任务管理器详细开发过程Word格式.docx_第10页
第10页 / 共11页
任务管理器详细开发过程Word格式.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

任务管理器详细开发过程Word格式.docx

《任务管理器详细开发过程Word格式.docx》由会员分享,可在线阅读,更多相关《任务管理器详细开发过程Word格式.docx(11页珍藏版)》请在冰点文库上搜索。

任务管理器详细开发过程Word格式.docx

//任务

CProcessm_Process;

//进程

CChartm_Chart;

//图表

接下来就创建子窗口:

m_Tab.InsertItem(0,_T("

应用程序"

),60);

//向tab控件中添加每个参数选项卡的值

m_Tab.InsertItem(1,_T("

进程信息"

m_Tab.InsertItem(2,_T("

CPU信息"

//关联对话框,让tab控件为父窗口

m_Task.Create(IDD_TASK,&

m_Tab);

m_Process.Create(IDD_PROCESS,&

m_Chart.Create(IDD_CHART,&

当用户选择标签中的一项是,为了将对应的对话框在标签控件中显示出来,需要在OnShowWindow(BOOLbShow,UINTnStatus)中添加代码相关代码。

这样便可将在个对话框分别显示于标签控件的每个页面中,但要实现选择标签的不同项显示不同页面还需在OnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult)添加显示代码。

核心代码如下:

voidCTaskMgrDlg:

:

OnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult)

{

//TODO:

在此添加控件通知处理程序代码

*pResult=0;

CRecttabRect;

m_Tab.GetClientRect(&

tabRect);

tabRect.top+=20;

tabRect.left+=1;

tabRect.right+=1;

tabRect.bottom+=1;

switch(m_Tab.GetCurSel())//根据鼠标选择的标签进行显示相应的对话框

{

case0:

m_Task.SetWindowPos(NULL,tabRect.left,tabRect.top,tabRect.Width(),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;

case1:

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_SHOWWINDOW);

m_Chart.SetWindowPos(NULL,tabRect.left,tabRect.top,tabRect.Width(),tabRect.Height(),SWP_HIDEWINDOW);

case2:

m_Chart.SetWindowPos(NULL,tabRect.left,tabRect.top,tabRect.Width(),tabRect.Height(),SWP_SHOWWINDOW);

default:

}

}

4.2.2有关应用程序的功能实现

查看应用程序:

EnumWindowsProc函数

参数

hwnd:

顶层窗口句柄。

lParam:

指定在EnumWindows或EnumDesktopWindows中的应用程序定义值。

返回值

为继续列表,回调函数必须返回TRUE;

若停止列表,它必须返回FALSE。

备注

应用程序必须通过传递给EnumWindows或EnumDesktopWindows应用程序地址来注册这个回调函数。

EnumWindows函数

函数功能该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。

回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

函数原型BOOLEnumWindows(WNDENUMPROClpEnumFunc,LPARAMlParam);

参数:

lpEnumFunc:

指向一个应用程序定义的回调函数指针,请参看EnumWindowsProc。

lPararm:

指定一个传递给回调函数的应用程序定义值。

回调函数原型

BOOLCALLBACKEnumWindowsProc(HWNDhWnd,LPARAMlParam)

if(:

IsWindow(hWnd)&

&

:

IsWindowVisible(hWnd)&

((GetWindowLong(hWnd,GWL_EXSTYLE)&

WS_EX_TOOLWINDOW)!

=WS_EX_TOOLWINDOW)&

(GetWindowLong(hWnd,GWL_HWNDPARENT)==0))//判断条件

TCHARWindowTitle[100]={0};

:

GetWindowText(hWnd,WindowTitle,100);

intm=n++;

buf[m]=WindowTitle;

DWORDdwProcessID=0;

dwProcessID=GetWindowThreadProcessId(hWnd,&

dwProcessID);

id[m].Format(_T("

%d"

),dwProcessID);

HD[m]=hWnd;

returntrue;

结束应用程序

根据应用程序的生命周期,以及窗口的消息循环,当关闭窗口或者应用程序(就是点上面的叉号),发出WM_CLOSE消息,但是translatemessage函数,进入while消息循环,被默认的情况进行处理,最后:

PostMessage()函数接受消息,发送WM_QUIT消息,窗口关闭,程序结束。

;

源码实现:

voidCTask:

OnBnClickedEndapp()

CStringstr;

intiRow=m_taskList.GetSelectionMark();

str=m_taskList.GetItemText(iRow,1);

for(inti=n;

i>

=1;

i--)

if(str==id[i])

{

:

PostMessage(HD[i],WM_QUIT,0,0);

//向结束的应用程序进行发送WM_QUIT消息

break;

}

4.2.3有关进程的功能实现

查看进程:

这个主要是用到TlHelp32.h头文件里有关进程的定义。

在创建进程快照时,首先,定义一个进程结构体,然后在创建

PROCESSENTRY32procList;

//这是一个进程结构体

procList.dwSize=sizeof(PROCESSENTRY32);

//在使用这个结构体之前先定义这个结构体的大小

HANDLEhSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

应用到的函数:

CreateToolhelp32Snapshot

函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照.

说到底,可以获取系统中正在运行的进程信息,线程信息,等

HANDLEWINAPICreateToolhelp32Snapshot(

DWORDdwFlags, 

//用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等

DWORDth32ProcessID 

//一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0

Process32First(),Process32Next()函数用来遍历进程

结束进程:

TerminateProcess

BOOLTerminateProcess(

HANDLEhProcess,//进程句柄

UINTuExitCode//进程终止码

);

4.2.4有关CPU的功能实现

查看CPU的利用率

利用率的介绍:

CPU在t1到t2时间段即时利用率= 

1-CPU空闲使用时间/CPU总的使用时间

核心代码:

res=GetSystemTimes(&

idleTime,&

kernelTime,&

userTime);

preidleTime=idleTime;

//系统是空闲的时间

prekernelTime=kernelTime;

//;

//FILETIME结构指针接收系统的时间花费在内核模式执行

preuserTime=userTime;

//FILETIME结构指针接收系统的时间花了在用户模式下执行

hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

//初始值为nonsignaled,并且每次触发后自动设置为nonsignaled

WaitForSingleObject(hEvent,1000);

//

intidle=CompareFileTime(preidleTime,idleTime);

intkernel=CompareFileTime(prekernelTime,kernelTime);

intuser=CompareFileTime(preuserTime,userTime);

intcpu=(kernel+user-idle)*100/(kernel+user);

//CPU利用率

intcpuidle=(idle)*100/(kernel+user);

//CPU空闲率

 

画图:

主要用到的是CPen类

画图函数:

voidCChart:

DrawWaveCPU(CDC*pCD,CRect&

rectPicture)

floatfDeltaX;

//x轴相邻两个绘图点的坐标距离

floatfDeltaY;

//y轴每个逻辑单位对应的坐标值

intnX;

//在连线时用于存储绘图点的横坐标

intnY;

//在连线时用于存储绘图点的纵坐标

CPennewPen;

//用于创建新画笔

CPen*pOldPen;

//用于存放旧画笔

CBrushnewBrush;

//用于创建新画刷

CBrush*pOldBrush;

//用于存放旧画刷

//计算fDeltaX和fDeltaY

fDeltaX=(float)rectPicture.Width()/(POINT_COUNT-1);

fDeltaY=(float)rectPicture.Height()/80;

//创建黑色新画刷

newBrush.CreateSolidBrush(RGB(0,0,0));

//选择新画刷,并将旧画刷的指针保存到pOldBrush

pOldBrush=pCD->

SelectObject(&

newBrush);

//以黑色画刷为绘图控件填充黑色,形成黑色背景

pCD->

Rectangle(rectPicture);

//恢复旧画刷

SelectObject(pOldBrush);

//删除新画刷

newBrush.DeleteObject();

//创建实心画笔,粗度为1,颜色为绿色

newPen.CreatePen(PS_SOLID,1,RGB(0,255,0));

//选择新画笔,并将旧画笔的指针保存到pOldPen

pOldPen=pCD->

newPen);

//将当前点移动到绘图控件窗口的左下角,以此为波形的起始点

MoveTo(rectPicture.left,rectPicture.bottom);

//计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线

for(inti=0;

i<

POINT_COUNT;

i++)

nX=rectPicture.left+(int)(i*fDeltaX);

nY=rectPicture.bottom-(int)(m_nzValues[i]*fDeltaY);

pCD->

LineTo(nX,nY);

//恢复旧画笔

SelectObject(pOldPen);

//删除新画笔

newPen.DeleteObject();

实现功能的核心代码主要是这些。

五收获

通过这个小任务(其实这个任务一点也不小),花费了好长好长时间,做的过程中,深受折磨。

首先,没有学过MFC,无从下手,就从图书馆里借了本书《深入简出MFC》这本书说实话真不错,它从整体上讲解了MFC,讲解了Windows编程,它们之间的联系,区别。

但是对于像我这种想很快入手的人来说,实不可取的,尤其是在这么多的时间。

然后就在网上搜源代码,类似:

windows任务管理器源代码神马的。

主要的网站:

CSDN,PUDN,codefree。

搜索引擎:

XX,图灵搜索,谷歌婊,好搜

搜索时,最好搜博客,讲解详细。

还发现了自己的一些不足之处:

最重要的就是犹豫不前,搜索到以后就一个就可以开始写,我们要在写的过程中发现自己的问题,而不是先整体上有框架,知道具体的实现过程,这是不可取的。

正确的做法是要边做边发现问题。

不要犹豫,先下手。

然后就是,在实现过程中,我们可以做个整体分析,将要实现的功能列出来,然后一个一个的实现。

只有做了才能发现自己的不足之处。

我们总是自我感觉良好,但是,现实却是残酷的。

还有,要加强英语学习,一些好的资料英文写的比较多,再说了,如果我们能多掌握一种语言,就不止掌握了多一种资源了。

最后,深刻体会到,开源的重要性,只有交流,才能让自己不断提高。

最最后,要写上注释!

要写上注释!

重要的话说三遍!

2015.12.15

参考资料:

强力推荐鸡啄米论坛

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2