任务管理器编程_第1页
任务管理器编程_第2页
任务管理器编程_第3页
任务管理器编程_第4页
任务管理器编程_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

任务管理器编程一 任务管理器设计步骤一款类似系统任务管理器的系统程序涉及以下几方面的知识:基本控件的使用,如Tab控件,Combo控件,List控件等;前台应用程序获取,包含当前桌面包含的应用程序获取,任务的新建、显示与结束;系统进程枚举,包括进程名、ID、内存大小,CPU占用;性能显示,包括内存占用信息的显示,CPU占用率的显示。二 基本控件的使用(一) Tab控件a) 初始化在CSysMonSimDlg:OnInitDialog()函数中为控件增加三个页面:m_tabCtrl.InsertItem(0, _T(应用程序);m_tabCtrl.InsertItem(1, _T(进程);m_tabCtrl.InsertItem(2, _T(系统监控);b) 关联属性页首先新建三个对话框,对应上述的三个页面,并为对话框新建三个类。接下来就该将新建的对话框与Tab控件的页面相互关联:appsPage.Create(IDD_DLG_APPS, &m_tabCtrl);procPage.Create(IDD_DLG_PROCESSES, &m_tabCtrl);monPage.Create(IDD_DLG_MON, &m_tabCtrl);然后定位对话框在页面的位置,设置初始页面:CRect rect;m_tabCtrl.GetClientRect(&rect);appsPage.SetWindowPos(NULL,10,30,rect.right-20,rect.bottom - 40, SWP_SHOWWINDOW);procPage.SetWindowPos(NULL,10,30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);monPage.SetWindowPos(NULL,10,30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);c) 响应切换页面void CSysMonSimDlg:OnSelchangeTabMenu(NMHDR* pNMHDR, LRESULT* pResult) CRect rect;m_tabCtrl.GetClientRect(&rect);switch (m_tabCtrl.GetCurSel()case 0:appsPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_SHOWWINDOW);procPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);monPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);break;case 1:appsPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);procPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_SHOWWINDOW);monPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);break;case 2:appsPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);procPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_HIDEWINDOW);monPage.SetWindowPos(NULL, 10, 30, rect.right - 20, rect.bottom - 40, SWP_SHOWWINDOW);break;*pResult = 0;(二) Combo控件记录每一次新建的任务,并将任务列表去重后作为Combo控件的初始值(未解决)。(三) List控件(略)三 前台应用程序获取(一) 前台窗口名称获取主要是从任务栏中获取所有前台的窗体信息,首先得获取任务栏窗体的指针,然后遍历该窗口所指向的窗口队列,看该窗口是否符合要求(是否可访问,是否有标题,是否为子窗体),获取窗体名称,并显示。CWnd * pWnd = AfxGetMainWnd()-GetWindow(GW_HWNDFIRST);while (pWnd)if (pWnd-IsWindowVisible()&pWnd-GetWindowTextLength() & !pWnd-GetOwner()pWnd-GetWindowText(strCaption);/排除不需要的系统应用程序if (strCaption.Compare(Program Manager) & strCaption.Compare(sysMonSim)/此处m_appArray中包含的应用程序应该与list控件上的程序要一致,否则会出现问题m_appArraynRows+ = strCaption;m_appsList.InsertItem(i, strCaption);m_appsList.SetItemText(i, 1, 正在运行);i+;pWnd = pWnd-GetWindow(GW_HWNDNEXT);(二) 定时器的设置设置定时器主要是为了定期更新当前任务列表,主要是通过WM_TIMER消息进行响应。只需在OnTimer函数中调用枚举任务的函数即可。int nIndex = m_appsList.GetSelectionMark();ShowFrontApps();m_appsList.SetSelectionMark(nIndex);m_appsList.SetItemState(nIndex, LVIS_SELECTED, LVIS_SELECTED);CPropertyPage:OnTimer(nIDEvent);(三) 新建任务首先调用选择应用程序的窗口,根据返回命令判断是否使用ShellExecute函数调用系统命令open来运行指定应用程序,然后刷新前台任务列表。if (m_OpenDlg.DoModal() = IDOK)ShellExecute(NULL,_T(open),m_OpenDlg.m_appName,NULL,NULL,SW_SHOW);elsereturn;ShowFrontApps();(四) 结束任务及其窗口首先找到当前所选的应用程序的窗口,对其发送WM_CLOSE消息,并隐藏窗口,然后再刷新列表。CWnd *pWnd=CWnd:FindWindow(NULL, _T(m_appArraym_appsList.GetSelectionMark();if (pWnd = INVALID_HANDLE_VALUE)AfxMessageBox(Nothing Found !);return false;pWnd-SendMessage(WM_CLOSE, 0);/SendMessage(WM_CLOSE, pWnd, pWnd);pWnd-ShowWindow(false);/ShellExecute(NULL, _T(close), m_appArraym_appsList.GetSelectionMark(), NULL, NULL, SW_SHOW);ShowFrontApps();(五) 切换当前窗口首先查找所选任务的窗口,设置其为顶层窗口,并显示即可CWnd * pWnd = CWnd:FindWindow(NULL, _T(strTemp);if (pWnd = INVALID_HANDLE_VALUE)AfxMessageBox(Nothing Found !);return;pWnd-SetForegroundWindow();pWnd-ShowWindow(true);四 系统进程枚举(一) 枚举进程(略)(二) 获取内存占用率主要是打开进程,然后使用GetProcessMemoryInfo()函数获取进程内存信息。hProcess1 = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);if (GetProcessMemoryInfo(hProcess1, &pmc, sizeof(pmc)CurMem = pmc.WorkingSetSize / 1024;AllMem = pmc.PeakWorkingSetSize / 1024;(三) 获取CPU占用率(未解决)五 系统性能显示先获取系统内存占用率和cpu占用率,然后用图形显示。(一) 获取系统内存信息获取系统内存占用信息需要用到MEMORYSTATUS结构体,然后调用GlobalMemoryStatus()函数来获取内存信息。GetMemInfo(mm);/获取内存信息m_memSize = mm.dwMemoryLoad;/当前内存使用率a_memAvail = mm.dwAvailPhys;/当前可用内存m_memTotal = mm.dwTotalPhys;/总内存大小m_curMemSizeg_num = int(m_memSize);(二) 获取系统CPU占用率获取系统CPU信息主要用到以下几个结构体:SYSTEM_BASIC_INFORMATION, SYSTEM_PERFORMANCE_INFORMATION, SYSTEM_TIME_INFORMATION,分别通过函数NtQuerySystemInformation API函数获取CPU基本信息、CPU空闲时间、CPU启动时间。获取CPU占用率首先必须获得上述三个结构体信息,然后通过其进行计算。NtQuerySystemInformation=(PROCNTQSI)GetProcAddress(GetModuleHandle(ntdll.dll), NtQuerySystemInformation);if (!NtQuerySystemInformation)return 1;status = NtQuerySystemInformation(SystemBasicInformation, &sysBasicInfo, sizeof(sysBasicInfo), NULL);if (status != NO_ERROR)return 2;status = NtQuerySystemInformation(SystemTimeInformation, &sysTimeInfo, sizeof(sysTimeInfo), NULL);if (status != NO_ERROR)return 3;status = NtQuerySystemInformation(SystemPerformanceInformation, &sysPerInfo, sizeof(sysPerInfo), NULL);if (status != NO_ERROR)return 4;if (liOldIdleTime.QuadPart != 0)dbIdleTime = Li2Double(sysPerInfo.liIdleTime) - Li2Double(liOldIdleTime);dbSysTime = Li2Double(sysTimeInfo.liKeSystemTime) - Li2D

温馨提示

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

评论

0/150

提交评论