环境:VS2010/MFC/对话框
效果图:
目录:
1. 关于windows进程信息获取
2. CListCtrl的使用
---------------------------------------------------------
1. windows进程信息获取
需要包含头文件
#include <psapi.h>
#include <TlHelp32.h>
#pragma comment(lib,"Psapi.lib")
主要函数使用
CreateToolhelp32Snapshot, Process32First,OpenProcess, GetProcessMemoryInfo,Process32Next。
PROCESSENTRY32结构中保存进程信息,
szExeFile--进程名称
th32ProcessId--进程Id
cntThreads--进程包含线程数
th32ParentProcessId--父进程ID
pcPriClassBase--线程基础优先级
内存信息保存在PROCESSMEMORYCOUNTERS中,windows内存项分很多种,下图是从win7任务管理器的查看--选择列中所截的图,
其中,任务管理器上默认显示的是专用工作集内存,指得是该程序独有的,不和其他程序共享的。
这一项不知道怎么获取,PROCESSMEMORYCOUNTERS中没有。程序中暂时用的workingsetsize,包含了可能被其他程序共享的内存。
按钮响应代码:
1 void CSystemProcessDlg::OnBnClickedButton1() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 m_listctrl.DeleteAllItems(); 5 HANDLE hSnapshot; 6 //创建进程信息快照 7 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 8 //进程信息结构体 9 PROCESSENTRY32 pe; 10 //取得第一个 11 Process32First(hSnapshot, &pe); 12 CString str; 13 int i = 0; 14 do 15 { 16 m_listctrl.InsertItem(i, pe.szExeFile); 17 str.Format("%d", pe.th32ProcessID); 18 m_listctrl.SetItemText(i,1,str); 19 20 str.Format("%d", pe.cntThreads); 21 m_listctrl.SetItemText(i,2,str); 22 23 str.Format("%d", pe.th32ParentProcessID); 24 m_listctrl.SetItemText(i,3,str); 25 26 str.Format("%d", pe.pcPriClassBase); 27 m_listctrl.SetItemText(i,4,str); 28 29 //根据进程ID获取内存使用信息 30 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pe.th32ProcessID); 31 if(hProcess) 32 { 33 //内存信息结构 34 PROCESS_MEMORY_COUNTERS pmc; 35 if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc))) 36 { 37 str.Format("%dK", pmc.WorkingSetSize/1024); 38 m_listctrl.SetItemText(i,5,str); 39 } 40 } 41 i++; 42 } 43 while(Process32Next(hSnapshot, &pe)); 44 CloseHandle(hSnapshot); 45 }
2. CListCtrl控件
控件用法参考:http://www.cnblogs.com/lidabo/archive/2012/08/23/2652786.html
直接拖一个List control到界面, 然后需要在属性中设置:
View选项为Report模式。
添加一个控件变量CListCtrl m_listctrl;
初始化时在OnInitDialog()中添加:
char *tab[6] = {"进程名称", "PID", "线程数", "父进程ID", "线程优先级", "内存使用"}; for (int i = 0; i < 6; i++) { //LVCFMT_RIGHT表示文字右对齐,60为列宽 m_listctrl.InsertColumn(i, tab[i], LVCFMT_RIGHT, 70); } //设置 进程名称 列宽 m_listctrl.SetColumnWidth(0, 130); m_listctrl.SetColumnWidth(1, 50); m_listctrl.SetColumnWidth(4, 80); m_listctrl.SetColumnWidth(5, 80); //设置扩展样式为全行选取,网格,复选框 m_listctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);
默认是单列选取,而且除了第一列可以选,其他都不可以选, 默认没有网格,没有复选框,通过设置扩展样式修改。